]> git.ozlabs.org Git - ccan/blobdiff - ccan/timer/test/run.c
timer: make timer_del() idempotent, add timer_init().
[ccan] / ccan / timer / test / run.c
index 2946ba10d653b8a1b9731d6bbed04dc8ace61d56..51648fb1c7978a5ba51aeb33d03c6b5ea0fb4d74 100644 (file)
@@ -3,34 +3,49 @@
 #include <ccan/timer/timer.c>
 #include <ccan/tap/tap.h>
 
+static struct timeabs timeabs_from_nsec(unsigned long long nsec)
+{
+       struct timeabs epoch = { { 0, 0 } };
+       return timeabs_add(epoch, time_from_nsec(nsec));
+}
+
 int main(void)
 {
        struct timers timers;
        struct timer t[64];
-       struct list_head expired;
-       struct timespec earliest;
+       struct timeabs earliest;
        uint64_t i;
+       struct timeabs epoch = { { 0, 0 } };
 
        /* This is how many tests you plan to run */
        plan_tests(488);
 
-       timers_init(&timers, time_from_nsec(0));
+       timers_init(&timers, epoch);
        ok1(timers_check(&timers, NULL));
        ok1(!timer_earliest(&timers, &earliest));
 
-       timer_add(&timers, &t[0], time_from_nsec(1));
+       timer_init(&t[0]);
+       /* timer_del can be called immediately after init. */
+       timer_del(&timers, &t[0]);
+
+       timer_add(&timers, &t[0], timeabs_from_nsec(1));
        ok1(timers_check(&timers, NULL));
        ok1(timer_earliest(&timers, &earliest));
-       ok1(time_eq(earliest, grains_to_time(t[0].time)));
+       ok1(timeabs_eq(earliest, grains_to_time(t[0].time)));
        timer_del(&timers, &t[0]);
        ok1(timers_check(&timers, NULL));
        ok1(!timer_earliest(&timers, &earliest));
 
+       /* timer_del can be called twice, no problems. */
+       timer_del(&timers, &t[0]);
+
        /* Check timer ordering. */
        for (i = 0; i < 32; i++) {
-               timer_add(&timers, &t[i*2], time_from_nsec(1ULL << i));
+               timer_init(&t[i*2]);
+               timer_add(&timers, &t[i*2], timeabs_from_nsec(1ULL << i));
                ok1(timers_check(&timers, NULL));
-               timer_add(&timers, &t[i*2+1], time_from_nsec((1ULL << i) + 1));
+               timer_init(&t[i*2+1]);
+               timer_add(&timers, &t[i*2+1], timeabs_from_nsec((1ULL << i) + 1));
                ok1(timers_check(&timers, NULL));
        }
 
@@ -52,9 +67,9 @@ int main(void)
        for (i = 0; i < 32; i++) {
                uint64_t exp = (uint64_t)TIMER_GRANULARITY << i;
 
-               timer_add(&timers, &t[i*2], time_from_nsec(exp));
+               timer_add(&timers, &t[i*2], timeabs_from_nsec(exp));
                ok1(timers_check(&timers, NULL));
-               timer_add(&timers, &t[i*2+1], time_from_nsec(exp + 1));
+               timer_add(&timers, &t[i*2+1], timeabs_from_nsec(exp + 1));
                ok1(timers_check(&timers, NULL));
        }
 
@@ -62,13 +77,11 @@ int main(void)
                struct timer *t1, *t2;
 
                ok1(timer_earliest(&timers, &earliest));
-               timers_expire(&timers, earliest, &expired);
-
-               t1 = list_pop(&expired, struct timer, list);
+               t1 = timers_expire(&timers, earliest);
                ok1(t1);
-               t2 = list_pop(&expired, struct timer, list);
+               t2 = timers_expire(&timers, earliest);
                ok1(t2);
-               ok1(list_empty(&expired));
+               ok1(!timers_expire(&timers, earliest));
 
                ok1(t1 == &t[i*2] || t1 == &t[i*2+1]);
                ok1(t2 != t1 && (t2 == &t[i*2] || t2 == &t[i*2+1]));