cmake: add checks to generate folly-config.h correctly
[folly.git] / folly / fibers / Baton.cpp
index 7161f9fb97f8a49e4e763e842ce6bf97080f1a57..5780202d86839aec7570cc45987cf8536c6e52d2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016 Facebook, Inc.
+ * Copyright 2017-present Facebook, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,7 +18,7 @@
 #include <chrono>
 
 #include <folly/detail/MemoryIdler.h>
-#include <folly/fibers/FiberManager.h>
+#include <folly/fibers/FiberManagerInternal.h>
 #include <folly/portability/Asm.h>
 
 namespace folly {
@@ -41,10 +41,6 @@ void Baton::wait(TimeoutHandler& timeoutHandler) {
   timeoutHandler.cancelTimeout();
 }
 
-bool Baton::timed_wait(TimeoutController::Duration timeout) {
-  return timed_wait(timeout, []() {});
-}
-
 void Baton::waitThread() {
   if (spinWaitForEarlyPost()) {
     assert(waitingFiber_.load(std::memory_order_acquire) == POSTED);
@@ -57,8 +53,9 @@ void Baton::waitThread() {
           fiber == NO_WAITER &&
           waitingFiber_.compare_exchange_strong(fiber, THREAD_WAITING))) {
     do {
-      folly::detail::MemoryIdler::futexWait(futex_.futex, THREAD_WAITING);
-      fiber = waitingFiber_.load(std::memory_order_relaxed);
+      folly::detail::MemoryIdler::futexWait(
+          futex_.futex, uint32_t(THREAD_WAITING));
+      fiber = waitingFiber_.load(std::memory_order_acquire);
     } while (fiber == THREAD_WAITING);
   }
 
@@ -109,7 +106,7 @@ bool Baton::timedWaitThread(TimeoutController::Duration timeout) {
     auto deadline = TimeoutController::Clock::now() + timeout;
     do {
       const auto wait_rv =
-          futex_.futex.futexWaitUntil(THREAD_WAITING, deadline);
+          futex_.futex.futexWaitUntil(uint32_t(THREAD_WAITING), deadline);
       if (wait_rv == folly::detail::FutexResult::TIMEDOUT) {
         return false;
       }
@@ -151,13 +148,12 @@ void Baton::postHelper(intptr_t new_value) {
   } while (!waitingFiber_.compare_exchange_weak(fiber, new_value));
 
   if (fiber != NO_WAITER) {
-    reinterpret_cast<Fiber*>(fiber)->setData(0);
+    reinterpret_cast<Fiber*>(fiber)->resume();
   }
 }
 
 bool Baton::try_wait() {
-  auto state = waitingFiber_.load();
-  return state == POSTED;
+  return ready();
 }
 
 void Baton::postThread() {
@@ -192,5 +188,5 @@ void Baton::TimeoutHandler::cancelTimeout() {
     fiberManager_->timeoutManager_->cancel(timeoutPtr_);
   }
 }
-}
-}
+} // namespace fibers
+} // namespace folly