compiler: RETURNS_NONNULL macro
[ccan] / ccan / jmap / test / run-access-count.c
1 /* Test our access counting failures. */
2 #include <ccan/jmap/jmap.c>
3 #include <ccan/tap/tap.h>
4 #include <sys/types.h>
5 #include <sys/wait.h>
6 #include <unistd.h>
7
8 struct map {
9         JMAP_MEMBERS(unsigned long, unsigned long);
10 };
11
12 int main(int argc, char *argv[])
13 {
14         struct map *map;
15         unsigned long *value;
16         int status;
17
18         plan_tests(9);
19
20         map = jmap_new(struct map);
21         ok1(jmap_error(map) == NULL);
22         ok1(jmap_add(map, 0, 1));
23
24         /* add while holding value. */
25         value = jmap_getval(map, 0);
26         ok1(value);
27         if (!fork()) {
28                 jmap_add(map, 1, 2);
29                 exit(0);
30         } else {
31                 wait(&status);
32                 ok1(WIFSIGNALED(status) && WTERMSIG(status) == SIGABRT);
33         }
34         jmap_putval(map, &value);
35
36         /* del while holding value. */
37         value = jmap_getval(map, 0);
38         ok1(value);
39         if (!fork()) {
40                 jmap_del(map, 0);
41                 exit(0);
42         } else {
43                 wait(&status);
44                 ok1(WIFSIGNALED(status) && WTERMSIG(status) == SIGABRT);
45         }
46         jmap_putval(map, &value);
47
48         ok1(jmap_add(map, 0, 1));
49
50         /* set while holding value ok. */
51         value = jmap_getval(map, 0);
52         ok1(value);
53         if (!fork()) {
54                 jmap_set(map, 0, 2);
55                 exit(0);
56         } else {
57                 wait(&status);
58                 ok1(WIFEXITED(status) && WEXITSTATUS(status) == 0);
59         }
60         jmap_putval(map, &value);
61
62         /* FIXME: test jmap_nthval, jmap_firstval etc. */
63         jmap_free(map);
64
65         return exit_status();
66 }