int main(void) { ConcurrentContext *context; unsigned char *stack; const int stack_size = 1024 * 4; concurrent_init(); context = malloc(ctx_sizeof()); stack = malloc(sizeof(*stack) * stack_size); ctx_construct(context, stack, stack_size, generator, NULL); printf("generate: %s\n", (char *)gen_voidptr(context)); printf("generate: %s\n", (char *)gen_voidptr(context)); printf("generate: %s\n", (char *)gen_voidptr(context)); printf("generate: %s\n", (char *)gen_voidptr(context)); ctx_reset(context); printf("generate: %s\n", (char *)gen_voidptr(context)); printf("generate: %s\n", (char *)gen_voidptr(context)); printf("generate: %s\n", (char *)gen_voidptr(context)); printf("generate: %s\n", (char *)gen_voidptr(context)); ctx_destruct(context); free(stack); free(context); concurrent_fin(); return 0; }
/* coroutine in coroutine recursive */ void coro(ConcurrentContext *aContext) { ConcurrentContext *context; unsigned char *stack; int deep; deep = (int)ctx_get_userptr(aContext); if (deep == 0) { return; } printf("%*scoro(deep=%d) start\n", deep, " ", deep); context = malloc(ctx_sizeof()); stack = malloc(sizeof(*stack) * STACK_SIZE); ctx_construct(context, stack, STACK_SIZE, coro, (void *)(deep - 1)); while (!ctx_is_done(context)) { printf("%*scoro(deep=%d) first\n", deep, " ", deep); ctx_resume(context); yield(aContext); } ctx_reset(context); while (!ctx_is_done(context)) { printf("%*scoro(deep=%d) second\n", deep, " ", deep); ctx_resume(context); yield(aContext); } ctx_destruct(context); free(stack); free(context); printf("%*scoro(deep=%d) finish\n", deep, " ", deep); }