]> git.ozlabs.org Git - ccan/blobdiff - ccan/timer/timer.h
io failtest timer tools: fallout from time changes.
[ccan] / ccan / timer / timer.h
index 7b5d199470c49e829aa19c0363eaa715c6324fee..79399cc4e0e006fe7b455dc0cff20890130bea5f 100644 (file)
@@ -5,10 +5,15 @@
 #include <ccan/list/list.h>
 #include <stdint.h>
 
+#ifndef TIMER_GRANULARITY
 /* We divide all nsec values by 1000, reducing it to usec granularity. */
 #define TIMER_GRANULARITY 1000
-/* This gives 16 pointers per level, up to 13 levels deep. */
-#define TIMER_LEVEL_BITS 4
+#endif
+
+#ifndef TIMER_LEVEL_BITS
+/* This gives 32 pointers per level, up to 13 levels deep. */
+#define TIMER_LEVEL_BITS 5
+#endif
 
 struct timers;
 struct timer;
@@ -20,14 +25,22 @@ struct timer;
  *
  * This sets up a timers struct: any timers added before @start will be
  * set to expire immediately.
+ *
+ * Example:
+ *     struct timers timeouts;
+ *
+ *     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.
  * @timers: the struct timers
  *
  * This frees any timer layers allocated during use.
+ *
+ * Example:
+ *     timers_cleanup(&timeouts);
  */
 void timers_cleanup(struct timers *timers);
 
@@ -39,9 +52,14 @@ void timers_cleanup(struct timers *timers);
  *
  * 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 timespec when);
+void timer_add(struct timers *timers, struct timer *timer, struct timeabs when);
 
 /**
  * timer_del - remove an unexpired timer.
@@ -49,22 +67,29 @@ void timer_add(struct timers *timers, struct timer *timer,
  * @timer: the timer previously added with timer_add()
  *
  * This efficiently removes @timer from @timers.
+ *
+ * Example:
+ *     timer_del(&timeouts, &t);
  */
 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 timeabs next = { { (time_t)-1ULL, -1UL } };
+ *     timer_earliest(&timeouts, &next);
  */
-bool timer_earliest(const struct timers *timers, struct timespec *first);
+bool timer_earliest(struct timers *timers, struct timeabs *first);
 
 /**
- * timer_expire - update timers structure and remove expired timers.
+ * timers_expire - update timers structure and remove expired timers.
  * @timers: the struct timers
  * @expire: the current time
  * @list: the list for expired timers.
@@ -79,9 +104,16 @@ bool timer_earliest(const struct timers *timers, struct timespec *first);
  *
  * You should not move @expire backwards, though it need not move
  * forwards.
+ *
+ * Example:
+ *     struct list_head expired;
+ *
+ *     timers_expire(&timeouts, time_now(), &expired);
+ *     if (!list_empty(&expired))
+ *             printf("Timer expired!\n");
  */
 void timers_expire(struct timers *timers,
-                  struct timespec expire,
+                  struct timeabs expire,
                   struct list_head *list);
 
 /**
@@ -96,6 +128,9 @@ void timers_expire(struct timers *timers,
  *
  * Returns the timers struct if it is consistent, NULL if not (it can
  * never return NULL if @abortstr is set).
+ *
+ * Example:
+ *     timers_check(&timeouts, "After timer_expire");
  */
 struct timers *timers_check(const struct timers *t, const char *abortstr);
 
@@ -123,6 +158,7 @@ struct timers {
        /* Far in the future. */
        struct list_head far;
        uint64_t base;
+       uint64_t first;
 
        struct timer_level *level[(64 + TIMER_LEVEL_BITS-1) / TIMER_LEVEL_BITS];
 };