Baton::ready, a const variant of try_wait
authorYedidya Feldblum <yfeldblum@fb.com>
Tue, 19 Dec 2017 01:13:12 +0000 (17:13 -0800)
committerFacebook Github Bot <facebook-github-bot@users.noreply.github.com>
Tue, 19 Dec 2017 01:21:59 +0000 (17:21 -0800)
Summary: [Folly] `Baton::ready`, a `const` variant of `try_wait`.

Reviewed By: djwatson

Differential Revision: D6508064

fbshipit-source-id: ba458577574ba58165408a93238da7eb09adf1e6

folly/fibers/Baton.cpp
folly/fibers/Baton.h
folly/synchronization/Baton.h
folly/synchronization/test/BatonTestHelpers.h

index baaa15b0ae4cd6695b73758482ea5dceff7cc87e..5780202d86839aec7570cc45987cf8536c6e52d2 100644 (file)
@@ -153,8 +153,7 @@ void Baton::postHelper(intptr_t new_value) {
 }
 
 bool Baton::try_wait() {
-  auto state = waitingFiber_.load();
-  return state == POSTED;
+  return ready();
 }
 
 void Baton::postThread() {
index d2b5885fd9dfe61f48a2523d015944214fe492a6..286ded79299cfcc090c06c178236ffc40b1e1f76 100644 (file)
@@ -40,6 +40,11 @@ class Baton {
 
   ~Baton() {}
 
+  bool ready() const {
+    auto state = waitingFiber_.load();
+    return state == POSTED;
+  }
+
   /**
    * Puts active fiber to sleep. Returns when post is called.
    */
index ff6b2978ad7ff5124ff9c77b5934213dbb8ccc2b..69135d00e163ca3d1bb18b909d851f9d283e17cb 100644 (file)
@@ -79,6 +79,12 @@ struct Baton {
     assert(state_.load(std::memory_order_relaxed) != WAITING);
   }
 
+  FOLLY_ALWAYS_INLINE bool ready() const noexcept {
+    auto s = state_.load(std::memory_order_acquire);
+    assert(s == INIT || s == EARLY_DELIVERY);
+    return LIKELY(s == EARLY_DELIVERY);
+  }
+
   /// Equivalent to destroying the Baton and creating a new one.  It is
   /// a bug to call this while there is a waiting thread, so in practice
   /// the waiter will be the one that resets the baton.
@@ -176,9 +182,7 @@ struct Baton {
   ///
   /// @return       true if baton has been posted, false othewise
   FOLLY_ALWAYS_INLINE bool try_wait() const noexcept {
-    auto s = state_.load(std::memory_order_acquire);
-    assert(s == INIT || s == EARLY_DELIVERY);
-    return LIKELY(s == EARLY_DELIVERY);
+    return ready();
   }
 
   /// Similar to wait, but with a timeout. The thread is unblocked if the
index f1f4670362e35c90ca67ac6bdc2ea5d87ff77b57..a0bba6e051166e7a7ab07e64b2c0ada8c193c4d4 100644 (file)
@@ -107,8 +107,10 @@ void run_timed_wait_regular_test() {
 template <template <typename> class Atom, bool Blocking>
 void run_try_wait_tests() {
   Baton<Atom, Blocking> b;
+  EXPECT_FALSE(b.ready());
   EXPECT_FALSE(b.try_wait());
   b.post();
+  EXPECT_TRUE(b.ready());
   EXPECT_TRUE(b.try_wait());
 }