3 #include <ccan/coroutine/coroutine.h>
4 #include <ccan/tap/tap.h>
7 struct coroutine_state c1, c2;
8 struct coroutine_state master;
12 static void f1(void *p)
14 struct state *state = (struct state *)p;
16 coroutine_switch(&state->c1, &state->c2);
18 ok(state->val == 17, "state->val == %d [expected 17]", state->val);
21 coroutine_switch(&state->c1, &state->c2);
23 ok(state->val == 24, "state->val == %d [expected 24]", state->val);
25 coroutine_switch(&state->c1, &state->c2);
27 ok(state->val == 26, "state->val == %d [expected 26]", state->val);
29 coroutine_switch(&state->c1, &state->c2);
31 ok(state->val == 29, "state->val == %d [expected 29]", state->val);
33 coroutine_switch(&state->c1, &state->c2);
36 static void f2(void *p)
38 struct state *state = (struct state *)p;
42 coroutine_switch(&state->c2, &state->c1);
44 ok(state->val == 23, "state->val == %d [expected 23]", state->val);
47 coroutine_switch(&state->c2, &state->c1);
51 coroutine_switch(&state->c2, &state->c1);
55 coroutine_switch(&state->c2, &state->c1);
57 coroutine_jump(&state->master);
60 static void test1(size_t bufsz)
63 struct coroutine_stack *stack1, *stack2;
67 stack1 = coroutine_stack_init(buf1, bufsz, 0);
68 diag("buf1=%p stack1=%p bufsz=0x%zx overhead=0x%zx\n",
69 buf1, stack1, bufsz, COROUTINE_STK_OVERHEAD);
70 ok1(coroutine_stack_check(stack1, NULL) == stack1);
71 ok1(coroutine_stack_size(stack1) == bufsz - COROUTINE_STK_OVERHEAD);
75 stack2 = coroutine_stack_init(buf2, bufsz, 0);
76 ok1(coroutine_stack_check(stack2, NULL) == stack2);
77 ok1(coroutine_stack_size(stack2) == bufsz - COROUTINE_STK_OVERHEAD);
79 if (COROUTINE_AVAILABLE) {
82 coroutine_init(&s.c1, f1, &s, stack1);
83 coroutine_init(&s.c2, f2, &s, stack2);
85 coroutine_switch(&s.master, &s.c1);
87 skip(5, "Coroutines not available");
90 ok(1, "Completed test1");
92 coroutine_stack_release(stack1, 0);
93 ok1(coroutine_stack_check(stack1, NULL) == NULL);
95 coroutine_stack_release(stack2, 0);
96 ok1(coroutine_stack_check(stack2, NULL) == NULL);
103 /* This is how many tests you plan to run */
108 /* This exits depending on whether all tests passed */
109 return exit_status();