diff options
author | Lang Hames <lhames@gmail.com> | 2016-08-29 21:56:30 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2016-08-29 21:56:30 +0000 |
commit | 3d0657d2eefef27886734673e5d2d1d43d4cbc62 (patch) | |
tree | be8b921e9d38b00632ca3b063b0687e77eab3c79 | |
parent | 124186616a446128cfc78c0c048484401fa308e2 (diff) | |
download | bcm5719-llvm-3d0657d2eefef27886734673e5d2d1d43d4cbc62.tar.gz bcm5719-llvm-3d0657d2eefef27886734673e5d2d1d43d4cbc62.zip |
[ORC][RPC] Make the future type of an Orc RPC call Error/Expected rather than
Optional.
For void functions the return type of a nonblocking call changes from
Expected<future<Optional<bool>>> to Expected<future<Error>>, and for functions
returning T the return type changes from Expected<future<Optional<T>>> to
Expected<future<Expected<T>>>.
Inner results need to be checked (since the RPC connection may have dropped
out before a result came back) and Error/Expected provide stronger checking
requirements. It also allows us drop the crufty 'optionalToError' function and
just collapse Errors in the single-threaded call primitives.
llvm-svn: 280016
-rw-r--r-- | llvm/include/llvm/ExecutionEngine/Orc/RPCUtils.h | 62 | ||||
-rw-r--r-- | llvm/unittests/ExecutionEngine/Orc/RPCUtilsTest.cpp | 8 |
2 files changed, 29 insertions, 41 deletions
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/RPCUtils.h b/llvm/include/llvm/ExecutionEngine/Orc/RPCUtils.h index 966a4968434..31c22de449a 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/RPCUtils.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/RPCUtils.h @@ -17,7 +17,6 @@ #include <map> #include <vector> -#include "llvm/ADT/Optional.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ExecutionEngine/Orc/OrcError.h" @@ -61,6 +60,7 @@ public: // partially specialized. class RPCBase { protected: + // RPC Function description type. // // This class provides the information and operations needed to support the @@ -69,10 +69,7 @@ protected: // betwen the two. Both specializations have the same interface: // // Id - The function's unique identifier. - // OptionalReturn - The return type for asyncronous calls. - // ErrorReturn - The return type for synchronous calls. - // optionalToErrorReturn - Conversion from a valid OptionalReturn to an - // ErrorReturn. + // ErrorReturn - The return type for blocking calls. // readResult - Deserialize a result from a channel. // abandon - Abandon a promised (asynchronous) result. // respond - Retun a result on the channel. @@ -91,32 +88,25 @@ protected: static const FunctionIdT Id = FuncId; - typedef Optional<RetT> OptionalReturn; - typedef Expected<RetT> ErrorReturn; - static ErrorReturn optionalToErrorReturn(OptionalReturn &&V) { - assert(V && "Return value not available"); - return std::move(*V); - } - template <typename ChannelT> - static Error readResult(ChannelT &C, std::promise<OptionalReturn> &P) { + static Error readResult(ChannelT &C, std::promise<ErrorReturn> &P) { RetT Val; auto Err = deserialize(C, Val); auto Err2 = endReceiveMessage(C); Err = joinErrors(std::move(Err), std::move(Err2)); - - if (Err) { - P.set_value(OptionalReturn()); + if (Err) return Err; - } + P.set_value(std::move(Val)); return Error::success(); } - static void abandon(std::promise<OptionalReturn> &P) { - P.set_value(OptionalReturn()); + static void abandon(std::promise<ErrorReturn> &P) { + P.set_value( + make_error<StringError>("RPC function call failed to return", + inconvertibleErrorCode())); } template <typename ChannelT, typename SequenceNumberT> @@ -148,22 +138,20 @@ protected: static const FunctionIdT Id = FuncId; - typedef bool OptionalReturn; typedef Error ErrorReturn; - static ErrorReturn optionalToErrorReturn(OptionalReturn &&V) { - assert(V && "Return value not available"); - return Error::success(); - } - template <typename ChannelT> - static Error readResult(ChannelT &C, std::promise<OptionalReturn> &P) { + static Error readResult(ChannelT &C, std::promise<ErrorReturn> &P) { // Void functions don't have anything to deserialize, so we're good. - P.set_value(true); + P.set_value(Error::success()); return endReceiveMessage(C); } - static void abandon(std::promise<OptionalReturn> &P) { P.set_value(false); } + static void abandon(std::promise<ErrorReturn> &P) { + P.set_value( + make_error<StringError>("RPC function call failed to return", + inconvertibleErrorCode())); + } template <typename ChannelT, typename SequenceNumberT> static Error respond(ChannelT &C, SequenceNumberT SeqNo, @@ -380,17 +368,17 @@ public: /// Return type for asynchronous call primitives. template <typename Func> - using AsyncCallResult = std::future<typename Func::OptionalReturn>; + using AsyncCallResult = std::future<typename Func::ErrorReturn>; /// Return type for asynchronous call-with-seq primitives. template <typename Func> using AsyncCallWithSeqResult = - std::pair<std::future<typename Func::OptionalReturn>, SequenceNumberT>; + std::pair<AsyncCallResult<Func>, SequenceNumberT>; /// Serialize Args... to channel C, but do not call C.send(). /// /// Returns an error (on serialization failure) or a pair of: - /// (1) A future Optional<T> (or future<bool> for void functions), and + /// (1) A future Expected<T> (or future<bool> for void functions), and /// (2) A sequence number. /// /// This utility function is primarily used for single-threaded mode support, @@ -401,7 +389,7 @@ public: Expected<AsyncCallWithSeqResult<Func>> appendCallAsyncWithSeq(ChannelT &C, const ArgTs &... Args) { auto SeqNo = SequenceNumberMgr.getSequenceNumber(); - std::promise<typename Func::OptionalReturn> Promise; + std::promise<typename Func::ErrorReturn> Promise; auto Result = Promise.get_future(); OutstandingResults[SeqNo] = createOutstandingResult<Func>(std::move(Promise)); @@ -431,7 +419,7 @@ public: /// Serialize Args... to channel C, but do not call send. /// Returns an error if serialization fails, otherwise returns a - /// std::future<Optional<T>> (or a future<bool> for void functions). + /// std::future<Expected<T>> (or a future<bool> for void functions). template <typename Func, typename... ArgTs> Expected<AsyncCallResult<Func>> appendCallAsync(ChannelT &C, const ArgTs &... Args) { @@ -460,7 +448,7 @@ public: auto &ResultAndSeqNo = *ResultAndSeqNoOrErr; if (auto Err = waitForResult(C, ResultAndSeqNo.second, HandleOther)) return std::move(Err); - return Func::optionalToErrorReturn(ResultAndSeqNo.first.get()); + return ResultAndSeqNo.first.get(); } else return ResultAndSeqNoOrErr.takeError(); } @@ -656,7 +644,7 @@ private: class OutstandingResultImpl : public OutstandingResult { private: public: - OutstandingResultImpl(std::promise<typename Func::OptionalReturn> &&P) + OutstandingResultImpl(std::promise<typename Func::ErrorReturn> &&P) : P(std::move(P)) {} Error readResult(ChannelT &C) override { return Func::readResult(C, P); } @@ -664,13 +652,13 @@ private: void abandon() override { Func::abandon(P); } private: - std::promise<typename Func::OptionalReturn> P; + std::promise<typename Func::ErrorReturn> P; }; // Create an outstanding result for the given function. template <typename Func> std::unique_ptr<OutstandingResult> - createOutstandingResult(std::promise<typename Func::OptionalReturn> &&P) { + createOutstandingResult(std::promise<typename Func::ErrorReturn> &&P) { return llvm::make_unique<OutstandingResultImpl<Func>>(std::move(P)); } diff --git a/llvm/unittests/ExecutionEngine/Orc/RPCUtilsTest.cpp b/llvm/unittests/ExecutionEngine/Orc/RPCUtilsTest.cpp index 7d55641e4ce..22d3739adc6 100644 --- a/llvm/unittests/ExecutionEngine/Orc/RPCUtilsTest.cpp +++ b/llvm/unittests/ExecutionEngine/Orc/RPCUtilsTest.cpp @@ -102,8 +102,8 @@ TEST_F(DummyRPC, TestAsyncVoidBool) { } // Verify that the function returned ok. - auto Val = ResOrErr->first.get(); - EXPECT_TRUE(Val) << "Remote void function failed to execute."; + auto Err = ResOrErr->first.get(); + EXPECT_TRUE(!!Err) << "Remote void function failed to execute."; } TEST_F(DummyRPC, TestAsyncIntInt) { @@ -179,8 +179,8 @@ TEST_F(DummyRPC, TestSerialization) { } // Verify that the function returned ok. - auto Val = ResOrErr->first.get(); - EXPECT_TRUE(Val) << "Remote void function failed to execute."; + auto Err = ResOrErr->first.get(); + EXPECT_TRUE(!!Err) << "Remote void function failed to execute."; } // Test the synchronous call API. |