cloudwu / coroutine

A asymmetric coroutine library for C.
MIT License
2.44k stars 685 forks source link

save [stack, sp]function _save_stack疑问 #9

Open Qinch opened 5 years ago

Qinch commented 5 years ago

_save_stack函数中dummy变量定义在coroutine_yield是不是更好?

static void
_save_stack(struct coroutine *C, char *top, char *bottom) {
       //top:stack bottom:sp
    assert(top - bottom <= STACK_SIZE);
    if (C->cap < top - bottom) {
        free(C->stack);
        C->cap = top-bottom;
        C->stack = malloc(C->cap);
    }
    C->size = top - bottom;
    memcpy(C->stack, bottom, C->size);
}

void
coroutine_yield(struct schedule * S) {
    int id = S->running;
    assert(id >= 0);
    struct coroutine * C = S->co[id];
    assert((char *)&C > S->stack);
    char dummy = 0;
    _save_stack(C,S->stack + STACK_SIZE, &dummy);
    C->status = COROUTINE_SUSPEND;
    S->running = -1;
    swapcontext(&C->ctx , &S->main);
}
qingdujun commented 4 years ago

这样会多压一个,函数call栈

Prince-Hervoet commented 4 months ago

感觉这里可以适当采用宏函数去展开,抵消掉函数调用压入的返回地址等的空间