Add getSemiFuture to folly::SharedPromise
authorLee Howes <lwh@fb.com>
Wed, 27 Dec 2017 04:11:48 +0000 (20:11 -0800)
committerFacebook Github Bot <facebook-github-bot@users.noreply.github.com>
Wed, 27 Dec 2017 04:30:53 +0000 (20:30 -0800)
Summary: Adds getSemiFuture functionality to folly::SharedPromise. Implements getFuture in terms of this, using folly::InlineExecutor to ensure that there is no change of behaviour.

Reviewed By: yfeldblum

Differential Revision: D6628723

fbshipit-source-id: 0ce7c7773b9290998ce87f84fa5d82ba957f0313

folly/futures/SharedPromise-inl.h
folly/futures/SharedPromise.h
folly/futures/test/SharedPromiseTest.cpp

index 362736ec031c197dd75527efa67299c4424b6a0b..3c9af5a6b58095908b69804ed55d336a012ec6bf 100644 (file)
@@ -54,7 +54,7 @@ size_t SharedPromise<T>::size() {
 }
 
 template <class T>
-Future<T> SharedPromise<T>::getFuture() {
+SemiFuture<T> SharedPromise<T>::getSemiFuture() {
   std::lock_guard<std::mutex> g(mutex_);
   size_++;
   if (hasValue_) {
@@ -64,10 +64,15 @@ Future<T> SharedPromise<T>::getFuture() {
     if (interruptHandler_) {
       promises_.back().setInterruptHandler(interruptHandler_);
     }
-    return promises_.back().getFuture();
+    return promises_.back().getSemiFuture();
   }
 }
 
+template <class T>
+Future<T> SharedPromise<T>::getFuture() {
+  return getSemiFuture().via(&folly::InlineExecutor::instance());
+}
+
 template <class T>
 template <class E>
 typename std::enable_if<std::is_base_of<std::exception, E>::value>::type
index d3b363efb4c5efd8a444f6bcf3c3773e27a4e5ac..70579267b3557842df45258e4f689e77cd46568a 100644 (file)
@@ -17,6 +17,7 @@
 #pragma once
 
 #include <folly/Portability.h>
+#include <folly/executors/InlineExecutor.h>
 #include <folly/futures/Promise.h>
 
 namespace folly {
@@ -50,6 +51,15 @@ class SharedPromise {
    * Return a Future tied to the shared core state. Unlike Promise::getFuture,
    * this can be called an unlimited number of times per SharedPromise.
    */
+  SemiFuture<T> getSemiFuture();
+
+  /**
+   * Return a Future tied to the shared core state. Unlike Promise::getFuture,
+   * this can be called an unlimited number of times per SharedPromise.
+   * NOTE: This function is deprecated. Please use getSemiFuture and pass the
+   *       appropriate executor to .via on the returned SemiFuture to get a
+   *       valid Future where necessary.
+   */
   Future<T> getFuture();
 
   /** Return the number of Futures associated with this SharedPromise */
index 3cb878ddc0565baf6460bb3d046679cf060da91a..f49bdd439f434dfd1a4606f728874a8305e8976e 100644 (file)
 
 using namespace folly;
 
+TEST(SharedPromise, setGetSemiFuture) {
+  SharedPromise<int> p;
+  p.setValue(1);
+  auto f1 = p.getSemiFuture();
+  auto f2 = p.getSemiFuture();
+  EXPECT_EQ(1, f1.value());
+  EXPECT_EQ(1, f2.value());
+}
+
+TEST(SharedPromise, setGetMixed) {
+  SharedPromise<int> p;
+  p.setValue(1);
+  auto f1 = p.getSemiFuture();
+  auto f2 = p.getFuture();
+  EXPECT_EQ(1, f1.value());
+  EXPECT_EQ(1, f2.value());
+}
+
 TEST(SharedPromise, setGet) {
   SharedPromise<int> p;
   p.setValue(1);