Commit 09446426 authored by Yedidya Feldblum's avatar Yedidya Feldblum Committed by Facebook Github Bot

Put the current fiber manager behind an accessor

Summary: [Folly] Put the current fiber manager behind an accessor function v.s. having it as a static class member.

Reviewed By: andriigrynenko

Differential Revision: D19229507

fbshipit-source-id: 7cf4eab00ee281bc6104f994a71f5e48d9553852
parent ac05b70a
...@@ -78,12 +78,15 @@ struct hash<folly::fibers::FiberManager::Options> { ...@@ -78,12 +78,15 @@ struct hash<folly::fibers::FiberManager::Options> {
namespace folly { namespace folly {
namespace fibers { namespace fibers {
FOLLY_TLS FiberManager* FiberManager::currentFiberManager_ = nullptr;
auto FiberManager::FrozenOptions::create(const Options& options) -> ssize_t { auto FiberManager::FrozenOptions::create(const Options& options) -> ssize_t {
return std::hash<Options>()(options); return std::hash<Options>()(options);
} }
/* static */ FiberManager*& FiberManager::getCurrentFiberManager() {
static FOLLY_TLS FiberManager* currentFiberManager;
return currentFiberManager;
}
FiberManager::FiberManager( FiberManager::FiberManager(
std::unique_ptr<LoopController> loopController, std::unique_ptr<LoopController> loopController,
Options options) Options options)
......
...@@ -202,7 +202,7 @@ void FiberManager::runFibersHelper(LoopFunc&& loopFunc) { ...@@ -202,7 +202,7 @@ void FiberManager::runFibersHelper(LoopFunc&& loopFunc) {
#endif #endif
// Support nested FiberManagers // Support nested FiberManagers
auto originalFiberManager = std::exchange(currentFiberManager_, this); auto originalFiberManager = std::exchange(getCurrentFiberManager(), this);
numUncaughtExceptions_ = uncaught_exceptions(); numUncaughtExceptions_ = uncaught_exceptions();
currentException_ = std::current_exception(); currentException_ = std::current_exception();
...@@ -227,7 +227,7 @@ void FiberManager::runFibersHelper(LoopFunc&& loopFunc) { ...@@ -227,7 +227,7 @@ void FiberManager::runFibersHelper(LoopFunc&& loopFunc) {
if (!readyFibers_.empty()) { if (!readyFibers_.empty()) {
ensureLoopScheduled(); ensureLoopScheduled();
} }
std::swap(currentFiberManager_, originalFiberManager); std::swap(getCurrentFiberManager(), originalFiberManager);
CHECK_EQ(this, originalFiberManager); CHECK_EQ(this, originalFiberManager);
}; };
...@@ -534,12 +534,12 @@ invoke_result_t<F> FiberManager::runInMainContext(F&& func) { ...@@ -534,12 +534,12 @@ invoke_result_t<F> FiberManager::runInMainContext(F&& func) {
} }
inline FiberManager& FiberManager::getFiberManager() { inline FiberManager& FiberManager::getFiberManager() {
assert(currentFiberManager_ != nullptr); assert(getCurrentFiberManager() != nullptr);
return *currentFiberManager_; return *getCurrentFiberManager();
} }
inline FiberManager* FiberManager::getFiberManagerUnsafe() { inline FiberManager* FiberManager::getFiberManagerUnsafe() {
return currentFiberManager_; return getCurrentFiberManager();
} }
inline bool FiberManager::hasActiveFiber() const { inline bool FiberManager::hasActiveFiber() const {
...@@ -547,7 +547,7 @@ inline bool FiberManager::hasActiveFiber() const { ...@@ -547,7 +547,7 @@ inline bool FiberManager::hasActiveFiber() const {
} }
inline void FiberManager::yield() { inline void FiberManager::yield() {
assert(currentFiberManager_ == this); assert(getCurrentFiberManager() == this);
assert(activeFiber_ != nullptr); assert(activeFiber_ != nullptr);
assert(activeFiber_->state_ == Fiber::RUNNING); assert(activeFiber_->state_ == Fiber::RUNNING);
activeFiber_->preempt(Fiber::YIELDED); activeFiber_->preempt(Fiber::YIELDED);
......
...@@ -490,7 +490,7 @@ class FiberManager : public ::folly::Executor { ...@@ -490,7 +490,7 @@ class FiberManager : public ::folly::Executor {
* When we are inside FiberManager loop this points to FiberManager. Otherwise * When we are inside FiberManager loop this points to FiberManager. Otherwise
* it's nullptr * it's nullptr
*/ */
static FOLLY_TLS FiberManager* currentFiberManager_; static FiberManager*& getCurrentFiberManager();
/** /**
* Allocator used to allocate stack for Fibers in the pool. * Allocator used to allocate stack for Fibers in the pool.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment