void Fiber::resume() { DCHECK_EQ(state_, AWAITING); state_ = READY_TO_RUN; if (fiberManager_.observer_) { fiberManager_.observer_->runnable(reinterpret_cast<uintptr_t>(this)); } if (LIKELY(threadId_ == localThreadId())) { fiberManager_.readyFibers_.push_back(*this); fiberManager_.ensureLoopScheduled(); } else { fiberManager_.remoteReadyInsert(this); } }
void Fiber::fiberFunc() { #ifdef FOLLY_SANITIZE_ADDRESS fiberManager_.registerFinishSwitchStackWithAsan( nullptr, &asanMainStackBase_, &asanMainStackSize_); #endif while (true) { DCHECK_EQ(state_, NOT_STARTED); threadId_ = localThreadId(); state_ = RUNNING; try { if (resultFunc_) { DCHECK(finallyFunc_); DCHECK(!func_); resultFunc_(); } else { DCHECK(func_); func_(); } } catch (...) { fiberManager_.exceptionCallback_( std::current_exception(), "running Fiber func_/resultFunc_"); } if (UNLIKELY(recordStackUsed_)) { fiberManager_.stackHighWatermark_ = std::max( fiberManager_.stackHighWatermark_, nonMagicInBytes(fcontext_)); VLOG(3) << "Max stack usage: " << fiberManager_.stackHighWatermark_; CHECK( fiberManager_.stackHighWatermark_ < fiberManager_.options_.stackSize - 64) << "Fiber stack overflow"; } state_ = INVALID; auto context = fiberManager_.deactivateFiber(this); DCHECK_EQ(reinterpret_cast<Fiber*>(context), this); } }