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 2014/08/12 06:45:24 UTC
git commit: Added missing 'defer' helpers.
Repository: mesos
Updated Branches:
refs/heads/master 37b9676c8 -> abda779d3
Added missing 'defer' helpers.
Fixes compilation issue when building with gcc 4.4, see MESOS-1692 for
more details.
Review: https://reviews.apache.org/r/24569
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/abda779d
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/abda779d
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/abda779d
Branch: refs/heads/master
Commit: abda779d39cfa124801a7e94ab454b1bc2789237
Parents: 37b9676
Author: Benjamin Hindman <be...@gmail.com>
Authored: Mon Aug 11 11:43:28 2014 -0700
Committer: Benjamin Hindman <be...@gmail.com>
Committed: Mon Aug 11 21:44:56 2014 -0700
----------------------------------------------------------------------
3rdparty/libprocess/include/process/defer.hpp | 49 ++++++++++++++++++---
3rdparty/libprocess/include/process/future.hpp | 6 +++
2 files changed, 48 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/abda779d/3rdparty/libprocess/include/process/defer.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/include/process/defer.hpp b/3rdparty/libprocess/include/process/defer.hpp
index dce7f3b..ebe6f2d 100644
--- a/3rdparty/libprocess/include/process/defer.hpp
+++ b/3rdparty/libprocess/include/process/defer.hpp
@@ -343,7 +343,7 @@ inline void dispatcher(
#define TEMPLATE(Z, N, DATA) \
template <ENUM_PARAMS(N, typename A)> \
- void CAT(invoker, N)( \
+ void CAT(vinvoker, N)( \
ProcessBase* _, \
const std::tr1::function<void(ENUM_PARAMS(N, A))>& f, \
ENUM_BINARY_PARAMS(N, A, a)) \
@@ -351,20 +351,55 @@ inline void dispatcher(
f(ENUM_PARAMS(N, a)); \
} \
\
+ template <typename R, ENUM_PARAMS(N, typename A)> \
+ void CAT(invoker, N)( \
+ ProcessBase* _, \
+ const std::tr1::function<Future<R>(ENUM_PARAMS(N, A))>& f, \
+ const std::tr1::shared_ptr<Promise<R> >& promise, \
+ ENUM_BINARY_PARAMS(N, A, a)) \
+ { \
+ if (promise->future().hasDiscard()) { \
+ promise->discard(); \
+ } else { \
+ promise->set(f(ENUM_PARAMS(N, a))); \
+ } \
+ } \
+ \
template <ENUM_PARAMS(N, typename A)> \
- void CAT(dispatcher, N)( \
+ void CAT(vdispatcher, N)( \
const UPID& pid, \
const std::tr1::function<void(ENUM_PARAMS(N, A))>& f, \
ENUM_BINARY_PARAMS(N, A, a)) \
{ \
std::tr1::shared_ptr<std::tr1::function<void(ProcessBase*)> > invoker( \
new std::tr1::function<void(ProcessBase*)>( \
- std::tr1::bind(&internal::CAT(invoker, N)<ENUM_PARAMS(N, A)>, \
+ std::tr1::bind(&internal::CAT(vinvoker, N)<ENUM_PARAMS(N, A)>, \
+ std::tr1::placeholders::_1, \
+ f, \
+ ENUM_PARAMS(N, a)))); \
+ \
+ internal::dispatch(pid, invoker); \
+ } \
+ \
+ template <typename R, ENUM_PARAMS(N, typename A)> \
+ Future<R> CAT(dispatcher, N)( \
+ const UPID& pid, \
+ const std::tr1::function<Future<R>(ENUM_PARAMS(N, A))>& f, \
+ ENUM_BINARY_PARAMS(N, A, a)) \
+ { \
+ std::tr1::shared_ptr<Promise<R> > promise(new Promise<R>()); \
+ \
+ std::tr1::shared_ptr<std::tr1::function<void(ProcessBase*)> > invoker( \
+ new std::tr1::function<void(ProcessBase*)>( \
+ std::tr1::bind(&internal::CAT(invoker, N)<R, ENUM_PARAMS(N, A)>, \
std::tr1::placeholders::_1, \
f, \
+ promise, \
ENUM_PARAMS(N, a)))); \
\
internal::dispatch(pid, invoker); \
+ \
+ return promise->future(); \
}
REPEAT_FROM_TO(1, 11, TEMPLATE, _) // Args A0 -> A9.
@@ -421,7 +456,7 @@ inline Deferred<void(void)> defer(const std::tr1::function<void(void)>& f)
const std::tr1::function<void(ENUM_PARAMS(N, A))>& f) \
{ \
return std::tr1::function<void(ENUM_PARAMS(N, A))>( \
- std::tr1::bind(&internal::CAT(dispatcher, N)<ENUM_PARAMS(N, A)>, \
+ std::tr1::bind(&internal::CAT(vdispatcher, N)<ENUM_PARAMS(N, A)>, \
pid, \
f, \
ENUM_BINARY_PARAMS(N, internal::_, () INTERCEPT))); \
@@ -433,7 +468,7 @@ inline Deferred<void(void)> defer(const std::tr1::function<void(void)>& f)
{ \
if (__process__ != NULL) { \
return std::tr1::function<void(ENUM_PARAMS(N, A))>( \
- std::tr1::bind(&internal::CAT(dispatcher, N)<ENUM_PARAMS(N, A)>, \
+ std::tr1::bind(&internal::CAT(vdispatcher, N)<ENUM_PARAMS(N, A)>, \
__process__->self(), \
f, \
ENUM_BINARY_PARAMS(N, internal::_, () INTERCEPT))); \
@@ -448,7 +483,7 @@ inline Deferred<void(void)> defer(const std::tr1::function<void(void)>& f)
const std::tr1::function<Future<R>(ENUM_PARAMS(N, A))>& f) \
{ \
return std::tr1::function<Future<R>(ENUM_PARAMS(N, A))>( \
- std::tr1::bind(&internal::CAT(dispatcher, N)<ENUM_PARAMS(N, A)>, \
+ std::tr1::bind(&internal::CAT(dispatcher, N)<R, ENUM_PARAMS(N, A)>, \
pid, \
f, \
ENUM_BINARY_PARAMS(N, internal::_, () INTERCEPT))); \
@@ -460,7 +495,7 @@ inline Deferred<void(void)> defer(const std::tr1::function<void(void)>& f)
{ \
if (__process__ != NULL) { \
return std::tr1::function<Future<R>(ENUM_PARAMS(N, A))>( \
- std::tr1::bind(&internal::CAT(dispatcher, N)<ENUM_PARAMS(N, A)>, \
+ std::tr1::bind(&internal::CAT(dispatcher, N)<R, ENUM_PARAMS(N, A)>, \
__process__->self(), \
f, \
ENUM_BINARY_PARAMS(N, internal::_, () INTERCEPT))); \
http://git-wip-us.apache.org/repos/asf/mesos/blob/abda779d/3rdparty/libprocess/include/process/future.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/include/process/future.hpp b/3rdparty/libprocess/include/process/future.hpp
index db7fcbc..46ae16b 100644
--- a/3rdparty/libprocess/include/process/future.hpp
+++ b/3rdparty/libprocess/include/process/future.hpp
@@ -327,6 +327,12 @@ public:
return then(lambda::function<X(const T&)>(lambda::bind(f)));
}
+ template <typename X>
+ Future<X> then(const Deferred<Future<X>(T)>& f) const
+ {
+ return then(lambda::function<Future<X>(const T&)>(f));
+ }
+
#if __cplusplus >= 201103L
private:
template <typename F, typename X = typename internal::unwrap<typename std::result_of<F(const T&)>::type>::type> // NOLINT(whitespace/line_length)