예제 #1
0
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;
}
예제 #2
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);
}