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 void *generator_new_(generator_wrapper_ *fn, size_t retsize)
16 size_t size = DEFAULT_STATE_SIZE;
18 struct generator_ *gen;
24 retsize = (retsize + STATE_ALIGN) & ~(STATE_ALIGN - 1);
25 ret = base + size - retsize;
26 gen = (struct generator_ *)ret - 1;
29 gen->complete = false;
31 getcontext(&gen->gen);
33 gen->gen.uc_stack.ss_sp = gen->base;
34 gen->gen.uc_stack.ss_size = (char *)gen - base;
36 if (HAVE_POINTER_SAFE_MAKECONTEXT) {
37 makecontext(&gen->gen, (void *)fn, 1, ret);
39 ptrdiff_t si = ptr2int(ret);
40 ptrdiff_t mask = (1UL << (sizeof(int) * 8)) - 1;
42 int hi = si >> (sizeof(int) * 8);
44 makecontext(&gen->gen, (void *)fn, 2, lo, hi);
50 void generator_free_(void *ret)
52 struct generator_ *gen = generator_state_(ret);