]> git.ozlabs.org Git - ccan/blobdiff - ccan/timer/timer.h
timer: change timers_expire() to return a single timer.
[ccan] / ccan / timer / timer.h
index d6e81e8cacbf2dfe94f3d73468e8a70aa12caa7c..aeb2aebc5dacb0396fe5ce319c4668812acb9df9 100644 (file)
@@ -31,7 +31,7 @@ struct timer;
  *
  *     timers_init(&timeouts, time_now());
  */
-void timers_init(struct timers *timers, struct timespec start);
+void timers_init(struct timers *timers, struct timeabs start);
 
 /**
  * timers_cleanup - free allocations within timers struct.
@@ -57,10 +57,9 @@ void timers_cleanup(struct timers *timers);
  *     struct timer t;
  *
  *     // Timeout in 100ms.
- *     timer_add(&timeouts, &t, time_add(time_now(), time_from_msec(100)));
+ *     timer_add(&timeouts, &t, timeabs_add(time_now(), time_from_msec(100)));
  */
-void timer_add(struct timers *timers, struct timer *timer,
-              struct timespec when);
+void timer_add(struct timers *timers, struct timer *timer, struct timeabs when);
 
 /**
  * timer_del - remove an unexpired timer.
@@ -77,45 +76,42 @@ void timer_del(struct timers *timers, struct timer *timer);
 /**
  * timer_earliest - find out the first time when a timer will expire
  * @timers: the struct timers
- * @first: the time, only set if there is a timer.
+ * @first: the expiry time, only set if there is a timer.
  *
  * This returns false, and doesn't alter @first if there are no
  * timers.  Otherwise, it sets @first to the expiry time of the first
  * timer (rounded to TIMER_GRANULARITY nanoseconds), and returns true.
  *
  * Example:
- *     struct timespec next = { (time_t)-1ULL, -1UL };
+ *     struct timeabs next = { { (time_t)-1ULL, -1UL } };
  *     timer_earliest(&timeouts, &next);
  */
-bool timer_earliest(struct timers *timers, struct timespec *first);
+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 timespec expire,
-                  struct list_head *list);
+struct timer *timers_expire(struct timers *timers, struct timeabs expire);
 
 /**
  * timers_check - check timer structure for consistency