You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by be...@apache.org on 2012/08/24 22:53:25 UTC

svn commit: r1377106 - in /incubator/mesos/trunk/third_party/libprocess: include/process/future.hpp src/process.cpp

Author: benh
Date: Fri Aug 24 20:53:25 2012
New Revision: 1377106

URL: http://svn.apache.org/viewvc?rev=1377106&view=rev
Log:
Bug fixes for C++11 implementation of then.

Modified:
    incubator/mesos/trunk/third_party/libprocess/include/process/future.hpp
    incubator/mesos/trunk/third_party/libprocess/src/process.cpp

Modified: incubator/mesos/trunk/third_party/libprocess/include/process/future.hpp
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/third_party/libprocess/include/process/future.hpp?rev=1377106&r1=1377105&r2=1377106&view=diff
==============================================================================
--- incubator/mesos/trunk/third_party/libprocess/include/process/future.hpp (original)
+++ incubator/mesos/trunk/third_party/libprocess/include/process/future.hpp Fri Aug 24 20:53:25 2012
@@ -803,19 +803,25 @@ auto Future<T>::then(F f) const
 
   std::tr1::shared_ptr<Promise<X>> promise(new Promise<X>());
 
+  // TODO(benh): Need to use a weak_ptr here so that we don't keep the
+  // future from getting cleaned up when there are no actually no more
+  // references!
+  Future<T> future(*this);
+
   onAny([=] () {
-      if (this->isReady()) {
-        promise->set(f(this->get()));
-      } else if (this->isFailed()) {
-        promise->fail(this->failure());
-      } else if (this->isDiscarded()) {
+      if (future.isReady()) {
+        promise->set(f(future.get()));
+      } else if (future.isFailed()) {
+        promise->fail(future.failure());
+      } else if (future.isDiscarded()) {
         promise->future().discard();
+      } else if (future.isPending()) {
       }
     });
 
   promise->future().onDiscarded([=] () {
-      if (this->isPending()) {
-        this->discard();
+      if (future.isPending()) {
+        Future<T>(future).discard(); // Need copy since 'discard' isn't const.
       }
     });
 

Modified: incubator/mesos/trunk/third_party/libprocess/src/process.cpp
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/third_party/libprocess/src/process.cpp?rev=1377106&r1=1377105&r2=1377106&view=diff
==============================================================================
--- incubator/mesos/trunk/third_party/libprocess/src/process.cpp (original)
+++ incubator/mesos/trunk/third_party/libprocess/src/process.cpp Fri Aug 24 20:53:25 2012
@@ -3040,6 +3040,8 @@ void read(int fd,
 
 Future<short> poll(int fd, short events)
 {
+  process::initialize();
+
   // TODO(benh): Check if the file descriptor is non-blocking?
 
   Promise<short>* promise = new Promise<short>();
@@ -3066,6 +3068,8 @@ Future<short> poll(int fd, short events)
 
 Future<size_t> read(int fd, void* data, size_t size)
 {
+  process::initialize();
+
   std::tr1::shared_ptr<Promise<size_t> > promise(new Promise<size_t>());
 
   // Check the file descriptor.