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)
62 struct coroutine_stack *stack1, *stack2;
64 stack1 = coroutine_stack_alloc(bufsz, 0);
65 ok1(coroutine_stack_check(stack1, NULL) == stack1);
66 ok1(coroutine_stack_size(stack1) == bufsz - COROUTINE_STK_OVERHEAD);
68 stack2 = coroutine_stack_alloc(bufsz, 0);
69 ok1(coroutine_stack_check(stack2, NULL) == stack2);
70 ok1(coroutine_stack_size(stack2) == bufsz - COROUTINE_STK_OVERHEAD);
72 if (COROUTINE_AVAILABLE) {
75 coroutine_init(&s.c1, f1, &s, stack1);
76 coroutine_init(&s.c2, f2, &s, stack2);
78 coroutine_switch(&s.master, &s.c1);
80 skip(5, "Coroutines not available");
83 ok(1, "Completed test1");
85 coroutine_stack_release(stack1, 0);
86 coroutine_stack_release(stack2, 0);
92 /* This is how many tests you plan to run */
97 /* This exits depending on whether all tests passed */