diff --git a/include/ucore/ucore_timers.h b/include/ucore/ucore_timers.h index c950e83..aa08354 100644 --- a/include/ucore/ucore_timers.h +++ b/include/ucore/ucore_timers.h @@ -9,6 +9,7 @@ struct UCTimer; struct UCTimers; +struct UCoreClock; //internal timer states enum { @@ -62,6 +63,7 @@ struct UCTimer { /** Timer engine. Must be initialized onnce.*/ struct UCTimers { RBTree timer_tree; + struct UCoreClock *uclock; size_t seq; //used to generate unique timers TAILQ_HEAD(, UCTimer) ready_list; //pending timers to be fired while inside uc_timers_run }; @@ -73,6 +75,12 @@ struct UCTimers { */ void uc_timers_init(struct UCTimers *t); +/** Initialize a timer engine for use, with a user supplied clock. + * + * @param t UCTimers struct to initialize + */ +void uc_timers_init_ex(struct UCTimers *t, struct UCoreClock *uclock); + /** Add a (one-shot) timer to the timer engine. * User fills in the callback and any cookie members of the UCTimer. The callback * will be called when the timer expires, and the timer is removed from the engine @@ -127,7 +135,7 @@ int uc_timer_running(const struct UCTimer *timer); * @return the number of timers fired, or negative if an error occured(presently no errors * are possible and the return value is always >= 0 **/ -int uc_timers_run(struct UCTimers *timers, const struct timeval *now); +int uc_timers_run(struct UCTimers *timers); //uc_timers_destroy(struct UCTimers *timers) is currently missing.. diff --git a/src/iomux_impl.c b/src/iomux_impl.c index e7d7cce..5f0aff5 100644 --- a/src/iomux_impl.c +++ b/src/iomux_impl.c @@ -74,10 +74,9 @@ int iomux_run(struct IOMux *mux) if (uc_timers_first(&mux->timers, &first_timer) == 0) { future_to_interval(&first_timer, &mux->now, &timeout); timeoutp = &timeout; - /* fprintf(stdout, "now %d %d future %d %d interval %d %d\n", mux->now.tv_sec, mux->now.tv_usec, + /* TRACEF("now %d %d future %d %d interval %d %d\n", mux->now.tv_sec, mux->now.tv_usec, first_timer.tv_sec, first_timer.tv_usec, timeout.tv_sec, timeout.tv_usec); - fflush(stdout); */ assert(timeout.tv_sec >= 0); @@ -101,9 +100,8 @@ int iomux_run(struct IOMux *mux) int iomux_timers_run(struct IOMux *mux) { int event_cnt; - gettimeofday(&mux->now, NULL); - event_cnt = uc_timers_run(&mux->timers, &mux->now); + event_cnt = uc_timers_run(&mux->timers); assert(event_cnt >= 0); return event_cnt; diff --git a/src/ucore_timers.c b/src/ucore_timers.c index c0751e1..9d25b4d 100644 --- a/src/ucore_timers.c +++ b/src/ucore_timers.c @@ -1,5 +1,6 @@ #include #include +#include static int timers_cmp(const void *a_, const void *b_) @@ -35,9 +36,15 @@ static void uc_timer_real_add(struct UCTimers *timers, struct UCTimer *timer) } void uc_timers_init(struct UCTimers *t) +{ + uc_timers_init_ex(t, &ucore_timeofday_clock); +} + +void uc_timers_init_ex(struct UCTimers *t, struct UCoreClock *uclock) { t->timer_tree.node = NULL; t->timer_tree.compare = timers_cmp; + t->uclock = uclock; t->seq = 0; TAILQ_INIT(&t->ready_list); } @@ -54,7 +61,7 @@ void uc_timer_add(struct UCTimers *timers, struct UCTimer *timer, int sec, int u tmp.tv_sec = sec; tmp.tv_usec = usec; - gettimeofday(&now, NULL); + timers->uclock->now(timers->uclock, &now); timeradd(&now, &tmp, &timer->timeout); uc_timer_real_add(timers, timer); } @@ -108,10 +115,13 @@ int uc_timer_running(const struct UCTimer *timer) } -int uc_timers_run(struct UCTimers *timers, const struct timeval *now) +int uc_timers_run(struct UCTimers *timers) { RBNode *node; int cnt = 0; + struct timeval now; + + timers->uclock->now(timers->uclock, &now); /* First find all the expired nodes, place them in a linked list. * Callbacks cannot be performed here, as the callback might alter @@ -122,7 +132,7 @@ int uc_timers_run(struct UCTimers *timers, const struct timeval *now) for (node = uc_rb_first(&timers->timer_tree); node ; node = uc_rb_next(node)) { struct UCTimer *t = node->data; //Note, timercmp does not work for >= - if (!timercmp(now, &t->timeout, <)) { + if (!timercmp(&now, &t->timeout, <)) { TAILQ_INSERT_TAIL(&timers->ready_list, t, ready_entry); t->state = UC_TIMER_PENDING; //so uc_timer_remove knows //it have to remove it from the ready_list @@ -151,7 +161,6 @@ int uc_timers_run(struct UCTimers *timers, const struct timeval *now) cnt++; } - return cnt; } diff --git a/test/timers.c b/test/timers.c index 315cfc6..1c60b65 100644 --- a/test/timers.c +++ b/test/timers.c @@ -69,9 +69,7 @@ int main(int argc, char *argv[]) uc_timer_add(&timers, &my_struct2.timer, 10, 0); for(;;) { - struct timeval now; - gettimeofday(&now, NULL); - uc_timers_run(&timers, &now); + uc_timers_run(&timers); #ifndef FULL_SPEED usleep(1000); #endif