void fiberEntry( transfer_t t ){ Fiber *fiber=(Fiber*)t.data; fiber->fcontext2=t.fcontext; fiber->dbContext->init(); fiber->gcFiber->link(); setCurrFiber( fiber ); fiber->gcFiber->entry(); fiber->gcFiber->unlink(); jump_fcontext( freeFiber( fiber ),nullptr ); }
// This must be called under the same scheduler lock // that added the thread to tDeadThread, we simply use // the thread_local to pass it between fibers. static void checkDeadContext() { auto coreId = cpu::this_core::id(); auto deadContext = sDeadContext[coreId]; if (deadContext) { sDeadContext[coreId] = nullptr; // Something broken if we are accidentally cleaning // up currently active context... decaf_check(deadContext != sCurrentContext[coreId]); // Something is broken if we have no fiber decaf_check(deadContext->fiber); // Destroy the fiber freeFiber(deadContext->fiber); deadContext->fiber = nullptr; } }