From 9c19d342f183828bdde591258cf00d6de0981dcb Mon Sep 17 00:00:00 2001 From: Andrii Grynenko Date: Thu, 2 Apr 2015 17:29:35 -0700 Subject: [PATCH] Use Fiber locals for TAO Fiber-locals Summary: This simplifies TAO fibers locals, using FiberManager based fiber-local storage. This depends on D1958135. Test Plan: integration tests Reviewed By: bwatling@fb.com Subscribers: alikhtarov FB internal diff: D1962214 Signature: t1:1962214:1427997755:b546b9039382a7600f234b0a2a60cc96da34e662 --- folly/experimental/fibers/Fiber-inl.h | 6 ---- folly/experimental/fibers/Fiber.h | 5 ---- folly/experimental/fibers/FiberManager-inl.h | 31 +++++++------------- folly/experimental/fibers/FiberManager.h | 21 +++++-------- 4 files changed, 18 insertions(+), 45 deletions(-) diff --git a/folly/experimental/fibers/Fiber-inl.h b/folly/experimental/fibers/Fiber-inl.h index 8823caf6..9ba00115 100644 --- a/folly/experimental/fibers/Fiber-inl.h +++ b/folly/experimental/fibers/Fiber-inl.h @@ -39,12 +39,6 @@ inline void* Fiber::getUserBuffer() { return &userBuffer_; } -template -void Fiber::setReadyFunction(G&& func) { - assert(state_ == INVALID || state_ == NOT_STARTED); - readyFunc_ = std::move(func); -} - template T& Fiber::LocalData::get() { if (data_) { diff --git a/folly/experimental/fibers/Fiber.h b/folly/experimental/fibers/Fiber.h index e3a38d55..df9668d6 100644 --- a/folly/experimental/fibers/Fiber.h +++ b/folly/experimental/fibers/Fiber.h @@ -75,9 +75,6 @@ class Fiber { template void setFunctionFinally(F&& func, G&& finally); - template - void setReadyFunction(G&& func); - static void fiberFuncHelper(intptr_t fiber); void fiberFunc(); @@ -101,8 +98,6 @@ class Fiber { FContext fcontext_; /**< current task execution context */ intptr_t data_; /**< Used to keep some data with the Fiber */ std::function func_; /**< task function */ - std::function readyFunc_; /**< function to be executed before jumping - to this fiber */ /** * Points to next fiber in remote ready list diff --git a/folly/experimental/fibers/FiberManager-inl.h b/folly/experimental/fibers/FiberManager-inl.h index cf963ee0..4fe0f24f 100644 --- a/folly/experimental/fibers/FiberManager-inl.h +++ b/folly/experimental/fibers/FiberManager-inl.h @@ -46,9 +46,6 @@ inline void FiberManager::runReadyFiber(Fiber* fiber) { while (fiber->state_ == Fiber::NOT_STARTED || fiber->state_ == Fiber::READY_TO_RUN) { activeFiber_ = fiber; - if (fiber->readyFunc_) { - fiber->readyFunc_(); - } jumpContext(&mainContext_, &fiber->fcontext_, fiber->data_); if (fiber->state_ == Fiber::AWAITING_IMMEDIATE) { try { @@ -198,22 +195,6 @@ void FiberManager::addTask(F&& func) { ensureLoopScheduled(); } -template -void FiberManager::addTaskReadyFunc(F&& func, G&& readyFunc) { - auto fiber = getFiber(); - if (currentFiber_) { - fiber->localData_ = currentFiber_->localData_; - } - - fiber->setFunction(std::forward(func)); - fiber->setReadyFunction(std::forward(readyFunc)); - - fiber->data_ = reinterpret_cast(fiber); - readyFibers_.push_back(*fiber); - - ensureLoopScheduled(); -} - template void FiberManager::addTaskRemote(F&& func) { auto task = [&]() { @@ -402,8 +383,16 @@ inline bool FiberManager::hasActiveFiber() { template T& FiberManager::local() { - assert(getFiberManager().currentFiber_ != nullptr); - return currentFiber_->localData_.get(); + if (currentFiber_) { + return currentFiber_->localData_.get(); + } + return localThread(); +} + +template +T& FiberManager::localThread() { + static thread_local T t; + return t; } template diff --git a/folly/experimental/fibers/FiberManager.h b/folly/experimental/fibers/FiberManager.h index e0fbf71c..bddfac99 100644 --- a/folly/experimental/fibers/FiberManager.h +++ b/folly/experimental/fibers/FiberManager.h @@ -135,18 +135,6 @@ class FiberManager { template void addTask(F&& func); - /** - * Add a new task to be executed, along with a function readyFunc_ which needs - * to be executed just before jumping to the ready fiber - * - * @param func Task functor; must have a signature of `T func()` for some T. - * @param readyFunc functor that needs to be executed just before jumping to - * ready fiber on the main context. This can for example be - * used to set up state before starting or resuming a fiber. - */ - template - void addTaskReadyFunc(F&& func, G&& readyFunc); - /** * Add a new task to be executed. Safe to call from other threads. * @@ -189,6 +177,9 @@ class FiberManager { template T& local(); + template + static T& localThread(); + /** * @return How many fiber objects (and stacks) has this manager allocated. */ @@ -403,7 +394,11 @@ inline runInMainContext(F&& func) { */ template T& local() { - return FiberManager::getFiberManager().local(); + auto fm = FiberManager::getFiberManagerUnsafe(); + if (fm) { + return fm->local(); + } + return FiberManager::localThread(); } }} -- 2.34.1