1 #define CCAN_TIMER_DEBUG
2 #include <ccan/timer/timer.h>
3 /* Include the C files directly. */
4 #include <ccan/timer/timer.c>
5 #include <ccan/tap/tap.h>
7 static struct timeabs timeabs_from_nsec(unsigned long long nsec)
9 struct timeabs epoch = { { 0, 0 } };
10 return timeabs_add(epoch, time_from_nsec(nsec));
17 struct timeabs earliest;
19 struct timeabs epoch = { { 0, 0 } };
21 /* This is how many tests you plan to run */
24 timers_init(&timers, epoch);
25 ok1(timers_check(&timers, NULL));
26 ok1(!timer_earliest(&timers, &earliest));
29 /* timer_del can be called immediately after init. */
30 timer_del(&timers, &t[0]);
32 timer_add(&timers, &t[0], timeabs_from_nsec(1));
33 ok1(timers_check(&timers, NULL));
34 ok1(timer_earliest(&timers, &earliest));
35 ok1(timeabs_eq(earliest, grains_to_time(t[0].time)));
36 timer_del(&timers, &t[0]);
37 ok1(timers_check(&timers, NULL));
38 ok1(!timer_earliest(&timers, &earliest));
40 /* timer_del can be called twice, no problems. */
41 timer_del(&timers, &t[0]);
43 /* Check timer ordering. */
44 for (i = 0; i < 32; i++) {
46 timer_add(&timers, &t[i*2], timeabs_from_nsec(1ULL << i));
47 ok1(timers_check(&timers, NULL));
48 timer_init(&t[i*2+1]);
49 timer_add(&timers, &t[i*2+1], timeabs_from_nsec((1ULL << i) + 1));
50 ok1(timers_check(&timers, NULL));
53 for (i = 0; i < 32; i++) {
54 const struct timer *t1, *t2;
56 t1 = get_first(&timers);
57 ok1(t1 == &t[i*2] || t1 == &t[i*2+1]);
58 timer_del(&timers, (struct timer *)t1);
59 ok1(timers_check(&timers, NULL));
61 t2 = get_first(&timers);
62 ok1(t2 != t1 && (t2 == &t[i*2] || t2 == &t[i*2+1]));
63 timer_del(&timers, (struct timer *)t2);
64 ok1(timers_check(&timers, NULL));
68 for (i = 0; i < 32; i++) {
69 uint64_t exp = (uint64_t)TIMER_GRANULARITY << i;
71 timer_add(&timers, &t[i*2], timeabs_from_nsec(exp));
72 ok1(timers_check(&timers, NULL));
73 timer_add(&timers, &t[i*2+1], timeabs_from_nsec(exp + 1));
74 ok1(timers_check(&timers, NULL));
77 for (i = 0; i < 32; i++) {
78 struct timer *t1, *t2;
80 ok1(timer_earliest(&timers, &earliest));
81 t1 = timers_expire(&timers, earliest);
83 t2 = timers_expire(&timers, earliest);
85 ok1(!timers_expire(&timers, earliest));
87 ok1(t1 == &t[i*2] || t1 == &t[i*2+1]);
88 ok1(t2 != t1 && (t2 == &t[i*2] || t2 == &t[i*2+1]));
89 ok1(timers_check(&timers, NULL));
92 ok1(!timer_earliest(&timers, &earliest));
94 timers_cleanup(&timers);
96 /* This exits depending on whether all tests passed */