Move OpenSSLPtrTypes.h from folly/io/async/ssl to folly/ssl
[folly.git] / folly / fibers / FiberManagerInternal-inl.h
index 352817f856e788f9c48f5a487d22e80d1e3b91ba..df354aaa4070a9b7933758ea31f83695f08fd639 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016 Facebook, Inc.
+ * Copyright 2017 Facebook, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -37,8 +37,8 @@ namespace fibers {
 namespace {
 
 inline FiberManager::Options preprocessOptions(FiberManager::Options opts) {
-#ifdef FOLLY_SANITIZE_ADDRESS
-  /* ASAN needs a lot of extra stack space.
+#if defined(FOLLY_SANITIZE_ADDRESS) || defined(UNDEFINED_SANITIZER)
+  /* ASAN/UBSAN needs a lot of extra stack space.
      16x is a conservative estimate, 8x also worked with tests
      where it mattered.  Note that overallocating here does not necessarily
      increase RSS, since unused memory is pretty much free. */
@@ -58,7 +58,7 @@ inline void FiberManager::ensureLoopScheduled() {
   loopController_->schedule();
 }
 
-inline FContext::FiberData FiberManager::activateFiber(Fiber* fiber) {
+inline void FiberManager::activateFiber(Fiber* fiber) {
   DCHECK_EQ(activeFiber_, (Fiber*)nullptr);
 
 #ifdef FOLLY_SANITIZE_ADDRESS
@@ -75,21 +75,20 @@ inline FContext::FiberData FiberManager::activateFiber(Fiber* fiber) {
 #endif
 
   activeFiber_ = fiber;
-  return jumpContext(&mainContext_, &fiber->fcontext_, fiber->data_);
+  fiber->fiberImpl_.activate();
 }
 
-inline FContext::FiberData FiberManager::deactivateFiber(Fiber* fiber) {
+inline void FiberManager::deactivateFiber(Fiber* fiber) {
   DCHECK_EQ(activeFiber_, fiber);
 
 #ifdef FOLLY_SANITIZE_ADDRESS
   DCHECK(fiber->asanMainStackBase_);
   DCHECK(fiber->asanMainStackSize_);
 
-  // Release fake stack if fiber is completed
-  auto saveFakeStackPtr =
-      fiber->state_ == Fiber::INVALID ? nullptr : &fiber->asanFakeStack_;
   registerStartSwitchStackWithAsan(
-      saveFakeStackPtr, fiber->asanMainStackBase_, fiber->asanMainStackSize_);
+      &fiber->asanFakeStack_,
+      fiber->asanMainStackBase_,
+      fiber->asanMainStackSize_);
   SCOPE_EXIT {
     registerFinishSwitchStackWithAsan(
         fiber->asanFakeStack_,
@@ -100,7 +99,7 @@ inline FContext::FiberData FiberManager::deactivateFiber(Fiber* fiber) {
 #endif
 
   activeFiber_ = nullptr;
-  return jumpContext(&fiber->fcontext_, &mainContext_, 0);
+  fiber->fiberImpl_.deactivate();
 }
 
 inline void FiberManager::runReadyFiber(Fiber* fiber) {
@@ -185,7 +184,11 @@ inline void FiberManager::runReadyFiber(Fiber* fiber) {
   }
 }
 
-inline bool FiberManager::loopUntilNoReady() {
+inline void FiberManager::loopUntilNoReady() {
+  return loopController_->runLoop();
+}
+
+inline void FiberManager::loopUntilNoReadyImpl() {
 #ifndef _WIN32
   if (UNLIKELY(!alternateSignalStackRegistered_)) {
     registerAlternateSignalStack();
@@ -229,7 +232,6 @@ inline bool FiberManager::loopUntilNoReady() {
       fiber->rcontext_ = std::move(task->rcontext);
 
       fiber->setFunction(std::move(task->func));
-      fiber->data_ = reinterpret_cast<FContext::FiberData>(fiber);
       if (observer_) {
         observer_->runnable(reinterpret_cast<uintptr_t>(fiber));
       }
@@ -244,8 +246,6 @@ inline bool FiberManager::loopUntilNoReady() {
     }
   }
   readyFibers_.splice(readyFibers_.end(), yieldedFibers_);
-
-  return fibersActive_ > 0;
 }
 
 // We need this to be in a struct, not inlined in addTask, because clang crashes
@@ -299,7 +299,6 @@ void FiberManager::addTask(F&& func) {
     fiber->setFunction(std::ref(*funcLoc));
   }
 
-  fiber->data_ = reinterpret_cast<FContext::FiberData>(fiber);
   readyFibers_.push_back(*fiber);
   if (observer_) {
     observer_->runnable(reinterpret_cast<uintptr_t>(fiber));
@@ -434,7 +433,6 @@ void FiberManager::addTaskFinally(F&& func, G&& finally) {
     fiber->setFunctionFinally(std::ref(*funcLoc), std::ref(*finallyLoc));
   }
 
-  fiber->data_ = reinterpret_cast<FContext::FiberData>(fiber);
   readyFibers_.push_back(*fiber);
   if (observer_) {
     observer_->runnable(reinterpret_cast<uintptr_t>(fiber));