]> git.ozlabs.org Git - ccan/blobdiff - ccan/timer/timer.h
Merge remote-tracking branch 'origin/pr/48'
[ccan] / ccan / timer / timer.h
index 79399cc4e0e006fe7b455dc0cff20890130bea5f..e678f7f7dfcbf78274e89ecbefcdc8e320992f0b 100644 (file)
@@ -44,29 +44,40 @@ void timers_init(struct timers *timers, struct timeabs start);
  */
 void timers_cleanup(struct timers *timers);
 
+/**
+ * timer_init - initialize a timer.
+ * @timer: the timer to initialize
+ *
+ * Example:
+ *     struct timer t;
+ *
+ *     timer_init(&t);
+ */
+void timer_init(struct timer *t);
+
 /**
  * timer_add - insert a timer.
  * @timers: the struct timers
- * @timer: the (uninitialized) timer to add
+ * @timer: the (initialized or timer_del'd) timer to add
  * @when: when @timer expires.
  *
  * This efficiently adds @timer to @timers, to expire @when (rounded to
  * TIMER_GRANULARITY nanoseconds).
  *
  * Example:
- *     struct timer t;
- *
  *     // Timeout in 100ms.
  *     timer_add(&timeouts, &t, timeabs_add(time_now(), time_from_msec(100)));
  */
 void timer_add(struct timers *timers, struct timer *timer, struct timeabs 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);
@@ -89,32 +100,29 @@ void timer_del(struct timers *timers, struct timer *timer);
 bool timer_earliest(struct timers *timers, struct timeabs *first);
 
 /**
- * timers_expire - update timers structure and remove expired timers.
+ * timers_expire - update timers structure and remove one expire timer.
  * @timers: the struct timers
  * @expire: the current time
- * @list: the list for expired timers.
  *
- * @list will be initialized to the empty list, then all timers added
- * with a @when arg less than or equal to @expire will be added to it in
- * expiry order (within TIMER_GRANULARITY nanosecond precision).
+ * A timers added with a @when arg less than or equal to @expire will be
+ * returned (within TIMER_GRANULARITY nanosecond precision).  If
+ * there are no timers due to expire, NULL is returned.
  *
- * After this, @expire is considered the current time, and adding any
- * timers with @when before this value will be silently changed to
- * adding them with immediate expiration.
+ * After this returns NULL, @expire is considered the current time,
+ * and adding any timers with @when before this value will be silently
+ * changed to adding them with immediate expiration.
  *
  * You should not move @expire backwards, though it need not move
  * forwards.
  *
  * Example:
- *     struct list_head expired;
+ *     struct timer *expired;
  *
- *     timers_expire(&timeouts, time_now(), &expired);
- *     if (!list_empty(&expired))
+ *     while ((expired = timers_expire(&timeouts, time_now())) != NULL)
  *             printf("Timer expired!\n");
+ *
  */
-void timers_expire(struct timers *timers,
-                  struct timeabs expire,
-                  struct list_head *list);
+struct timer *timers_expire(struct timers *timers, struct timeabs expire);
 
 /**
  * timers_check - check timer structure for consistency
@@ -157,8 +165,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];
 };