1 #include <dispatch/dispatch.h>
6 #include <libkern/OSAtomic.h>
8 #include "dispatch_test.h"
11 void done(void *arg __unused
) {
19 __block dispatch_time_t time_a_min
, time_a
, time_a_max
;
20 __block dispatch_time_t time_b_min
, time_b
, time_b_max
;
21 __block dispatch_time_t time_c_min
, time_c
, time_c_max
;
24 test_start("Dispatch After");
26 dispatch_async(dispatch_get_main_queue(), ^{
27 time_a_min
= dispatch_time(0, 5.5*NSEC_PER_SEC
);
28 time_a
= dispatch_time(0, 6*NSEC_PER_SEC
);
29 time_a_max
= dispatch_time(0, 6.5*NSEC_PER_SEC
);
30 dispatch_after(time_a
, dispatch_get_current_queue(), ^{
31 dispatch_time_t now_a
= dispatch_time(0, 0);
32 test_long_less_than("can't finish faster than 5.5s", 0, now_a
- time_a_min
);
33 test_long_less_than("must finish faster than 6.5s", 0, time_a_max
- now_a
);
35 time_b_min
= dispatch_time(0, 1.5*NSEC_PER_SEC
);
36 time_b
= dispatch_time(0, 2*NSEC_PER_SEC
);
37 time_b_max
= dispatch_time(0, 2.5*NSEC_PER_SEC
);
38 dispatch_after(time_b
, dispatch_get_current_queue(), ^{
39 dispatch_time_t now_b
= dispatch_time(0, 0);
40 test_long_less_than("can't finish faster than 1.5s", 0, now_b
- time_b_min
);
41 test_long_less_than("must finish faster than 2.5s", 0, time_b_max
- now_b
);
43 time_c_min
= dispatch_time(0, 0*NSEC_PER_SEC
);
44 time_c
= dispatch_time(0, 0*NSEC_PER_SEC
);
45 time_c_max
= dispatch_time(0, .5*NSEC_PER_SEC
);
46 dispatch_after(time_c
, dispatch_get_current_queue(), ^{
47 dispatch_time_t now_c
= dispatch_time(0, 0);
48 test_long_less_than("can't finish faster than 0s", 0, now_c
- time_c_min
);
49 test_long_less_than("must finish faster than .5s", 0, time_c_max
- now_c
);
51 dispatch_async_f(dispatch_get_current_queue(), NULL
, done
);