实现一个简单的C++协程库(二)
hedulerImpl::ResumeCoroutine(int id, uintptr_t y)
{
coroutine* cor = id2routine_[id];
if (cor == NULL || cor->status == CO_RUNNING) return 0;
cor->yield = y;
switch (cor->status)
{
case CO_READY:
{
getcontext(&cor->cxt);
cor->status = CO_RUNNING;
cor->cxt.uc_stack.ss_sp = cor->stack;
cor->cxt.uc_stack.ss_size = stacksize_;
// sucessor context.
cor->cxt.uc_link = &mainContext_;
running_ = id;
makecontext(&cor->cxt, (void (*)())Schedule, 1, this);
swapcontext(&mainContext_, &cor->cxt);
}
break;
case CO_SUSPENDED:
{
running_ = id;
cor->status = CO_RUNNING;
swapcontext(&mainContext_, &cor->cxt);
}
break;
default:
assert(0);
}
uintptr_t ret = cor->yield;
if (running_ == -1 && cor->status == CO_FINISHED) DestroyCoroutine(id);
return ret;
}
uintptr_t CoroutineScheduler::SchedulerImpl::Yield(uintptr_t y)
{
if (running_ < 0) return 0;
int cur = running_;
running_ = -1;
coroutine* cor = id2routine_[cur];
cor->yield = y;
cor->status = CO_SUSPENDED;
swapcontext(&cor->cxt, &mainContext_);
return cor->yield;
}