1 /* Licensed LGPLv2.1+ - see LICENSE file for details */
6 #include <ccan/alignof/alignof.h>
8 #include <ccan/generator/generator.h>
10 #define DEFAULT_STATE_SIZE 8192
11 #define STATE_ALIGN ALIGNOF(struct generator_)
13 static size_t generator_metasize(size_t retsize)
15 retsize = (retsize + STATE_ALIGN) & ~(STATE_ALIGN - 1);
16 return sizeof(struct generator_) + retsize;
19 void *generator_new_(void (*fn)(void *), size_t retsize)
22 size_t size = DEFAULT_STATE_SIZE;
23 size_t metasize = generator_metasize(retsize);
24 struct coroutine_stack *stack;
26 struct generator_ *gen;
32 retsize = (retsize + STATE_ALIGN) & ~(STATE_ALIGN - 1);
34 stack = coroutine_stack_init(base, size, metasize);
35 gen = coroutine_stack_to_metadata(stack, metasize);
39 gen->complete = false;
41 coroutine_init(&gen->gen, fn, ret, stack);
46 void generator_free_(void *ret, size_t retsize)
48 struct generator_ *gen = generator_state_(ret);
49 size_t metasize = generator_metasize(retsize);
50 struct coroutine_stack *stack;
52 stack = coroutine_stack_from_metadata(gen, metasize);
53 coroutine_stack_release(stack, metasize);