diff options
Diffstat (limited to 'sys/base/coro/coro.c')
-rw-r--r-- | sys/base/coro/coro.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/sys/base/coro/coro.c b/sys/base/coro/coro.c new file mode 100644 index 0000000..2255c99 --- /dev/null +++ b/sys/base/coro/coro.c @@ -0,0 +1,43 @@ +#include "internal.h" + +/* Co-routine context */ +Coro* +coro·make(uintptr stk, uintptr (*func)(Coro*, uintptr)) +{ + if (!func) return nil; + if (stk == 0) stk = 8192; + + byte *block = malloc(stk); + Coro *co = (Coro*)&block[stk - sizeof(Coro)]; + co->bp = block; + co->size = stk; + + _newcoro(co, func, co); + return co; +} + +error +coro·free(Coro *co) +{ + enum + { + NIL, + GOOD, + EMPTY, + LOST, + }; + + if (!co) return NIL; + if (!co->bp) return LOST; + if (co->size == 0) return EMPTY; + + free(co->bp); + + return GOOD; +} + +uintptr +coro·yield(Coro *c, uintptr arg) +{ + return _coroyield(c, arg); +} |