]> git.ozlabs.org Git - ccan/blobdiff - ccan/timer/timer.c
memmem, bytestring: Fix includes in _info
[ccan] / ccan / timer / timer.c
index 59d1ff377cb6498e01ffbed8cad1ef4290466fdf..c30c6227ab9a7fc2b672e3319605d0d66ed3a35d 100644 (file)
@@ -12,23 +12,23 @@ struct timer_level {
        struct list_head list[PER_LEVEL];
 };
 
-static uint64_t time_to_grains(struct timespec ts)
+static uint64_t time_to_grains(struct timeabs t)
 {
-       return ts.tv_sec * ((uint64_t)1000000000 / TIMER_GRANULARITY)
-               + (ts.tv_nsec / TIMER_GRANULARITY);
+       return t.ts.tv_sec * ((uint64_t)1000000000 / TIMER_GRANULARITY)
+               + (t.ts.tv_nsec / TIMER_GRANULARITY);
 }
 
-static struct timespec grains_to_time(uint64_t grains)
+static struct timeabs grains_to_time(uint64_t grains)
 {
-       struct timespec ts;
+       struct timeabs t;
 
-       ts.tv_sec = grains / (1000000000 / TIMER_GRANULARITY);
-       ts.tv_nsec = (grains % (1000000000 / TIMER_GRANULARITY))
+       t.ts.tv_sec = grains / (1000000000 / TIMER_GRANULARITY);
+       t.ts.tv_nsec = (grains % (1000000000 / TIMER_GRANULARITY))
                * TIMER_GRANULARITY;
-       return ts;
+       return t;
 }
 
-void timers_init(struct timers *timers, struct timespec start)
+void timers_init(struct timers *timers, struct timeabs start)
 {
        unsigned int i;
 
@@ -63,7 +63,7 @@ static void timer_add_raw(struct timers *timers, struct timer *t)
        list_add_tail(l, &t->list);
 }
 
-void timer_add(struct timers *timers, struct timer *t, struct timespec when)
+void timer_add(struct timers *timers, struct timer *t, struct timeabs when)
 {
        t->time = time_to_grains(when);
 
@@ -119,41 +119,6 @@ static void add_level(struct timers *timers, unsigned int level)
                timer_add_raw(timers, t);
 }
 
-/* Take timers from level and distribute them down one. */
-static void cascade(struct timers *timers, unsigned int level)
-{
-       struct timer *i;
-       struct list_head from_far, *list;
-
-       if (level == ARRAY_SIZE(timers->level) || !timers->level[level]) {
-               list_head_init(&from_far);
-               timers_far_get(timers, &from_far,
-                              timers->base
-                              + (1ULL << (level*TIMER_LEVEL_BITS))-1);
-               list = &from_far;
-               if (level != ARRAY_SIZE(timers->level))
-                       add_level(timers, level);
-       } else {
-               unsigned src;
-
-               src = (timers->base >> (level * TIMER_LEVEL_BITS)) % PER_LEVEL;
-               if (src == 0)
-                       cascade(timers, level + 1);
-               list = &timers->level[level]->list[src];
-       }
-
-       while ((i = list_pop(list, struct timer, list)) != NULL) {
-               unsigned dst;
-
-               assert(i->time >= timers->base);
-               assert(i->time < (timers->base
-                                 + (1ULL << ((level+1)*TIMER_LEVEL_BITS))));
-
-               dst = (i->time >> ((level-1)*TIMER_LEVEL_BITS)) % PER_LEVEL;
-               list_add_tail(&timers->level[level-1]->list[dst], &i->list);
-       }
-}
-
 static const struct timer *find_first(const struct list_head *list,
                                      const struct timer *prev)
 {
@@ -238,7 +203,7 @@ static bool update_first(struct timers *timers)
        return true;
 }
 
-bool timer_earliest(struct timers *timers, struct timespec *first)
+bool timer_earliest(struct timers *timers, struct timeabs *first)
 {
        if (!update_first(timers))
                return false;
@@ -296,7 +261,7 @@ static void timer_fast_forward(struct timers *timers, uint64_t time)
 
 /* Fills list of expired timers. */
 void timers_expire(struct timers *timers,
-                  struct timespec expire,
+                  struct timeabs expire,
                   struct list_head *list)
 {
        uint64_t now = time_to_grains(expire);
@@ -341,7 +306,8 @@ static bool timer_list_check(const struct list_head *l,
                        if (abortstr) {
                                fprintf(stderr,
                                        "%s: timer %p %llu not %llu-%llu\n",
-                                       abortstr, t, t->time, min, max);
+                                       abortstr, t, (long long)t->time,
+                                       (long long)min, (long long)max);
                                abort();
                        }
                        return false;
@@ -350,7 +316,8 @@ static bool timer_list_check(const struct list_head *l,
                        if (abortstr) {
                                fprintf(stderr,
                                        "%s: timer %p %llu < minimum %llu\n",
-                                       abortstr, t, t->time, first);
+                                       abortstr, t, (long long)t->time,
+                                       (long long)first);
                                abort();
                        }
                        return false;
@@ -409,7 +376,7 @@ past_levels:
        return (struct timers *)timers;
 }
 
-//#ifdef CCAN_TIMER_DEBUG
+#ifdef CCAN_TIMER_DEBUG
 void timers_dump(const struct timers *timers, FILE *fp)
 {
        unsigned int l, i;
@@ -455,7 +422,7 @@ void timers_dump(const struct timers *timers, FILE *fp)
        }
        fprintf(stderr, "Far: %llu (%llu-%llu)\n", num, min, max);
 }
-//#endif
+#endif
 
 void timers_cleanup(struct timers *timers)
 {