X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftimer%2Ftimer.h;h=2eb33c91ca6c49defba32233827e7786b13b7be6;hp=aeb2aebc5dacb0396fe5ce319c4668812acb9df9;hb=fe328d06ed6df8d5a92eaab4be2d645affeeb99e;hpb=fe6bc8c530795a6c718f7e8fd1a6643d9f3024a1 diff --git a/ccan/timer/timer.h b/ccan/timer/timer.h index aeb2aebc..2eb33c91 100644 --- a/ccan/timer/timer.h +++ b/ccan/timer/timer.h @@ -29,9 +29,9 @@ struct timer; * Example: * struct timers timeouts; * - * timers_init(&timeouts, time_now()); + * timers_init(&timeouts, time_mono()); */ -void timers_init(struct timers *timers, struct timeabs start); +void timers_init(struct timers *timers, struct timemono start); /** * timers_cleanup - free allocations within timers struct. @@ -45,28 +45,59 @@ void timers_init(struct timers *timers, struct timeabs start); void timers_cleanup(struct timers *timers); /** - * timer_add - insert a timer. + * timer_init - initialize a timer. + * @timer: the timer to initialize + * + * Example: + * struct timer t; + * + * timer_init(&t); + */ +void timer_init(struct timer *t); + +/** + * timer_addrel - insert a relative timer. + * @timers: the struct timers + * @timer: the (initialized or timer_del'd) timer to add + * @rel: when @timer expires (relative). + * + * This efficiently adds @timer to @timers, to expire @rel (rounded to + * TIMER_GRANULARITY nanoseconds) after the current time. This + * is a convenient wrapper around timer_addmono(). + * + * Example: + * // Timeout in 100ms. + * timer_addrel(&timeouts, &t, time_from_msec(100)); + */ +void timer_addrel(struct timers *timers, struct timer *timer, struct timerel rel); + +/** + * timer_addmono - insert an absolute timer. * @timers: the struct timers - * @timer: the (uninitialized) timer to add - * @when: when @timer expires. + * @timer: the (initialized or timer_del'd) timer to add + * @when: when @timer expires (absolute). * * This efficiently adds @timer to @timers, to expire @when (rounded to * TIMER_GRANULARITY nanoseconds). * - * Example: - * struct timer t; + * Note that if @when is before time_mono(), then it will be set to expire + * immediately. * + * Example: * // Timeout in 100ms. - * timer_add(&timeouts, &t, timeabs_add(time_now(), time_from_msec(100))); + * timer_addmono(&timeouts, &t, timemono_add(time_mono(), time_from_msec(100))); */ -void timer_add(struct timers *timers, struct timer *timer, struct timeabs when); +void timer_addmono(struct timers *timers, struct timer *timer, + struct timemono when); /** - * timer_del - remove an unexpired timer. + * timer_del - remove a timer. * @timers: the struct timers - * @timer: the timer previously added with timer_add() + * @timer: the timer * - * This efficiently removes @timer from @timers. + * This efficiently removes @timer from @timers, if timer_add() was + * called. It can be called multiple times without bad effect, and + * can be called any time after timer_init(). * * Example: * timer_del(&timeouts, &t); @@ -83,10 +114,10 @@ void timer_del(struct timers *timers, struct timer *timer); * timer (rounded to TIMER_GRANULARITY nanoseconds), and returns true. * * Example: - * struct timeabs next = { { (time_t)-1ULL, -1UL } }; + * struct timemono next = { { (time_t)-1ULL, -1UL } }; * timer_earliest(&timeouts, &next); */ -bool timer_earliest(struct timers *timers, struct timeabs *first); +bool timer_earliest(struct timers *timers, struct timemono *first); /** * timers_expire - update timers structure and remove one expire timer. @@ -107,11 +138,11 @@ bool timer_earliest(struct timers *timers, struct timeabs *first); * Example: * struct timer *expired; * - * while ((expired = timers_expire(&timeouts, time_now())) != NULL) + * while ((expired = timers_expire(&timeouts, time_mono())) != NULL) * printf("Timer expired!\n"); * */ -struct timer *timers_expire(struct timers *timers, struct timeabs expire); +struct timer *timers_expire(struct timers *timers, struct timemono expire); /** * timers_check - check timer structure for consistency @@ -131,6 +162,17 @@ struct timer *timers_expire(struct timers *timers, struct timeabs expire); */ struct timers *timers_check(const struct timers *t, const char *abortstr); +/** + * timers_set_allocator - set malloc/free functions. + * @alloc: allocator to use + * @free: unallocator to use (@p is NULL or a return from @alloc) + * + * This replaces the underlying malloc/free with these allocators. + * Setting either one to NULL restores the default allocators. + */ +void timers_set_allocator(void *(*alloc)(struct timers *, size_t len), + void (*free)(struct timers *, void *p)); + #ifdef CCAN_TIMER_DEBUG #include @@ -154,8 +196,12 @@ void timers_dump(const struct timers *timers, FILE *fp); struct timers { /* Far in the future. */ struct list_head far; + /* Current time. */ uint64_t base; + /* Overall first value. */ uint64_t first; + /* First value in each level (plus 1 for far list) */ + uint64_t firsts[(64 + TIMER_LEVEL_BITS-1) / TIMER_LEVEL_BITS + 1]; struct timer_level *level[(64 + TIMER_LEVEL_BITS-1) / TIMER_LEVEL_BITS]; };