#include <stdio.h>
typedef struct handler_t handler_t;
typedef void (*handle_func)(handler_t*);
typedef int timer_handle_t;
struct handler_t {
char* id;
handle_func execute;
timer_handle_t timer_handle;
unsigned int duration;
};
static void func1(handler_t* handler);
static void func2(handler_t* handler);
static void start_timer(timer_handle_t timer_handle, unsigned int duration);
static const timer_handle_t timer1 = 1;
static const timer_handle_t timer2 = 2;
static handler_t handler1 = {"hndl1", func1, timer1, 5};
static handler_t handler2 = {"hndl2", func2, timer2, 10};
static void start_timer(timer_handle_t timer_handle, unsigned int duration) {
printf("starting timer %d with duration %u\n", timer_handle
, duration
); }
static void func1(handler_t* handler) {
printf("Handler %s executing function\n", handler
->id
); if (5 > 3) { // Some condition that is different from func2
start_timer(handler->timer_handle, handler->duration);
}
}
static void func2(handler_t* handler) {
printf("Handler %s executing function\n", handler
->id
); if (1 < 4) { // Some condition that is different from func1
start_timer(handler->timer_handle, handler->duration);
}
}
int main(void) {
handler_t* handlers[2] = {&handler1, &handler2};
for (unsigned int i=0; i<2; ++i) {
handlers[i]->execute(handlers[i]);
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+Cgp0eXBlZGVmIHN0cnVjdCBoYW5kbGVyX3QgaGFuZGxlcl90Owp0eXBlZGVmIHZvaWQgKCpoYW5kbGVfZnVuYykoaGFuZGxlcl90Kik7CnR5cGVkZWYgaW50IHRpbWVyX2hhbmRsZV90OwoKc3RydWN0IGhhbmRsZXJfdCB7CgljaGFyKiAgICAgICAgICBpZDsKCWhhbmRsZV9mdW5jICAgIGV4ZWN1dGU7Cgl0aW1lcl9oYW5kbGVfdCB0aW1lcl9oYW5kbGU7Cgl1bnNpZ25lZCBpbnQgICBkdXJhdGlvbjsKfTsKCnN0YXRpYyB2b2lkIGZ1bmMxKGhhbmRsZXJfdCogaGFuZGxlcik7CnN0YXRpYyB2b2lkIGZ1bmMyKGhhbmRsZXJfdCogaGFuZGxlcik7CnN0YXRpYyB2b2lkIHN0YXJ0X3RpbWVyKHRpbWVyX2hhbmRsZV90IHRpbWVyX2hhbmRsZSwgdW5zaWduZWQgaW50IGR1cmF0aW9uKTsKCnN0YXRpYyBjb25zdCB0aW1lcl9oYW5kbGVfdCB0aW1lcjEgPSAxOwpzdGF0aWMgY29uc3QgdGltZXJfaGFuZGxlX3QgdGltZXIyID0gMjsKc3RhdGljIGhhbmRsZXJfdCBoYW5kbGVyMSA9IHsiaG5kbDEiLCBmdW5jMSwgdGltZXIxLCA1fTsKc3RhdGljIGhhbmRsZXJfdCBoYW5kbGVyMiA9IHsiaG5kbDIiLCBmdW5jMiwgdGltZXIyLCAxMH07CgpzdGF0aWMgdm9pZCBzdGFydF90aW1lcih0aW1lcl9oYW5kbGVfdCB0aW1lcl9oYW5kbGUsIHVuc2lnbmVkIGludCBkdXJhdGlvbikgewoJcHJpbnRmKCJzdGFydGluZyB0aW1lciAlZCB3aXRoIGR1cmF0aW9uICV1XG4iLCB0aW1lcl9oYW5kbGUsIGR1cmF0aW9uKTsKfQoKc3RhdGljIHZvaWQgZnVuYzEoaGFuZGxlcl90KiBoYW5kbGVyKSB7CglwcmludGYoIkhhbmRsZXIgJXMgZXhlY3V0aW5nIGZ1bmN0aW9uXG4iLCBoYW5kbGVyLT5pZCk7CglpZiAoNSA+IDMpIHsgLy8gU29tZSBjb25kaXRpb24gdGhhdCBpcyBkaWZmZXJlbnQgZnJvbSBmdW5jMgoJCXN0YXJ0X3RpbWVyKGhhbmRsZXItPnRpbWVyX2hhbmRsZSwgaGFuZGxlci0+ZHVyYXRpb24pOwoJfQp9CgpzdGF0aWMgdm9pZCBmdW5jMihoYW5kbGVyX3QqIGhhbmRsZXIpIHsKCXByaW50ZigiSGFuZGxlciAlcyBleGVjdXRpbmcgZnVuY3Rpb25cbiIsIGhhbmRsZXItPmlkKTsKCWlmICgxIDwgNCkgeyAvLyBTb21lIGNvbmRpdGlvbiB0aGF0IGlzIGRpZmZlcmVudCBmcm9tIGZ1bmMxCgkJc3RhcnRfdGltZXIoaGFuZGxlci0+dGltZXJfaGFuZGxlLCBoYW5kbGVyLT5kdXJhdGlvbik7Cgl9Cn0KCmludCBtYWluKHZvaWQpIHsKCWhhbmRsZXJfdCogaGFuZGxlcnNbMl0gPSB7JmhhbmRsZXIxLCAmaGFuZGxlcjJ9OwoJCglmb3IgKHVuc2lnbmVkIGludCBpPTA7IGk8MjsgKytpKSB7CgkJaGFuZGxlcnNbaV0tPmV4ZWN1dGUoaGFuZGxlcnNbaV0pOwoJfQoJcmV0dXJuIDA7Cn0K