[llvm] r280016 - [ORC][RPC] Make the future type of an Orc RPC call Error/Expected rather than

Lang Hames via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 30 09:18:44 PDT 2016


Hi Reid,

I guess the way to work around this is to create some kind of wrapper
> around the Error that is trivially copyable...


Yeah - that sounds like the way to go. Sorry about the overnight
bot-breakage!

- Lang.

On Tue, Aug 30, 2016 at 8:22 AM, Reid Kleckner <rnk at google.com> wrote:

> Adding the wrapper type doesn't feel like a trivial fix, so I reverted the
> six relevant changes in r280100.
>
> On Tue, Aug 30, 2016 at 8:11 AM, Reid Kleckner <rnk at google.com> wrote:
>
>> The tests still fail at runtime, because their std::future implementation
>> constructs Error objects that are destroyed without being checked:
>>
>> $ ./unittests/ExecutionEngine/Orc/OrcJITTests.exe
>> --gtest_filter=DummyRPC.TestSerialization
>> Note: Google Test filter = DummyRPC.TestSerialization
>> [==========] Running 1 test from 1 test case.
>> [----------] Global test environment set-up.
>> [----------] 1 test from DummyRPC
>> [ RUN      ] DummyRPC.TestSerialization
>> Program aborted due to an unhandled Error:
>> Error value was Success. (Note: Success values must still be checked
>> prior to being destroyed).
>> #0 0x00d9bbe7 HandleAbort c:\src\llvm\lib\support\window
>> s\signals.inc:404:0
>> #1 0x0175e7f5 raise d:\th\minkernel\crts\ucrt\src\
>> appcrt\misc\signal.cpp:516:0
>> #2 0x01737b04 abort d:\th\minkernel\crts\ucrt\src\
>> appcrt\startup\abort.cpp:64:0
>> #3 0x00bab53c llvm::Error::assertIsChecked(void)
>> c:\src\llvm\include\llvm\support\error.h:235:0
>> #4 0x00bc3815 ?_Set_value_raw@?$_Associated_state at VError@llvm@@@std@
>> @QAEX$$QAVError at llvm@@PAV?$unique_lock at Vmutex@std@@@2 at _N@Z c:\program
>> files (x86)\microsoft visual studio 14.0\vc\include\future:394:0
>> #5 0x00bc3721 ?_Set_value@?$_Associated_state at VError@llvm@@@std@@QAEX$$
>> QAVError at llvm@@_N at Z c:\program files (x86)\microsoft visual studio
>> 14.0\vc\include\future:386:0
>> #6 0x00bc574d ?set_value@?$promise at VError@llvm@@@std@@QAEX$$QAVError at llvm
>> @@@Z c:\program files (x86)\microsoft visual studio
>> 14.0\vc\include\future:1547:0
>> #7 0x00bc5464 llvm::orc::remote::RPC<class QueueChannel,unsigned
>> int,unsigned short>::OutstandingResultImpl<class
>> llvm::orc::remote::RPCBase::FunctionHelper<unsigned int,4,void (signed
>> char,unsigned char,short,unsigned short,int,unsigned int,__int64,unsigned
>> __int64,bool,class std::basic_string<char,struct
>> std::char_traits<char>,class std::allocator<char> >,class
>> std::vector<int,class std::allocator<int> >)> >::readResult(class
>> QueueChannel &) c:\src\llvm\include\llvm\execu
>> tionengine\orc\rpcutils.h:682:0
>> #8 0x00bc4e88 llvm::orc::remote::RPC<class QueueChannel,unsigned
>> int,unsigned short>::handleResponse(class QueueChannel &,unsigned short *)
>> c:\src\llvm\include\llvm\executionengine\orc\rpcutils.h:580:0
>> #9 0x00bc07a3 llvm::orc::remote::RPC<class QueueChannel,unsigned
>> int,unsigned short>::waitForResult<class llvm::Error (class QueueChannel
>> &,unsigned int)>(class QueueChannel &,unsigned short,class llvm::Error
>> (&)(class QueueChannel &,unsigned int)) c:\src\llvm\include\llvm\execu
>> tionengine\orc\rpcutils.h:605:0
>> #10 0x00bb7fe4 DummyRPC_TestSerialization_Test::TestBody(void)
>> c:\src\llvm\unittests\executionengine\orc\rpcutilstest.cpp:178:0
>> #11 0x00f81e80 testing::internal::HandleSehExceptionsInMethodIfSupported<class
>> testing::Test,void>(class testing::Test *,void (
>> testing::Test::*)(void),char const *) c:\src\llvm\utils\unittest\goo
>> gletest\src\gtest.cc:2075:0
>> #12 0x00f93b9d testing::Test::Run(void) c:\src\llvm\utils\unittest\goo
>> gletest\src\gtest.cc:2161:0
>> #13 0x00f93d92 testing::TestInfo::Run(void) c:\src\llvm\utils\unittest\goo
>> gletest\src\gtest.cc:2313:0
>> #14 0x00f93c76 testing::TestCase::Run(void) c:\src\llvm\utils\unittest\goo
>> gletest\src\gtest.cc:2416:0
>> #15 0x00f94079 testing::internal::UnitTestImpl::RunAllTests(void)
>> c:\src\llvm\utils\unittest\googletest\src\gtest.cc:4207:0
>> #16 0x00f82110 testing::internal::HandleSehExceptionsInMethodIfSupported<class
>> testing::internal::UnitTestImpl,bool>(class
>> testing::internal::UnitTestImpl *,bool ( testing::internal::UnitTestImpl::*)(void),char
>> const *) c:\src\llvm\utils\unittest\googletest\src\gtest.cc:2075:0
>> #17 0x00f93e82 testing::UnitTest::Run(void) c:\src\llvm\utils\unittest\goo
>> gletest\src\gtest.cc:3841:0
>> #18 0x016fce32 _scrt_common_main_seh f:\dd\vctools\crt\vcstartup\sr
>> c\startup\exe_common.inl:253:0
>> #19 0x76ac38f4 (C:\Windows\SYSTEM32\KERNEL32.DLL+0x138f4)
>> #20 0x76f95de3 (C:\Windows\SYSTEM32\ntdll.dll+0x65de3)
>> #21 0x76f95dae (C:\Windows\SYSTEM32\ntdll.dll+0x65dae)
>>
>> I guess the way to work around this is to create some kind of wrapper
>> around the Error that is trivially copyable etc, and pull the Error out on
>> the other side of the future.
>>
>> On Mon, Aug 29, 2016 at 11:10 PM, Lang Hames via llvm-commits <
>> llvm-commits at lists.llvm.org> wrote:
>>
>>> Hi Douglas,
>>>
>>> Hopefully this should be fixed by r280058 and r280059.
>>>
>>> Cheers,
>>> Lang.
>>>
>>> On Mon, Aug 29, 2016 at 7:40 PM, Lang Hames <lhames at gmail.com> wrote:
>>>
>>>> Hi Yung,
>>>>
>>>> Bummer.
>>>>
>>>> At first glance this looks like a failure to construct a future for a
>>>> type with no default constructor - is that your read? Do you know if MSVC
>>>> 2013's futures library supports that?
>>>>
>>>> I'm on the road, but will be back in ~3 hours - when I get back I can
>>>> try some workarounds for this. If that's too long for the builders, feel
>>>> free to revert for now.
>>>>
>>>> - Lang.
>>>>
>>>>
>>>> On Mon, Aug 29, 2016 at 5:44 PM, Yung, Douglas <douglas.yung at sony.com>
>>>> wrote:
>>>>
>>>>> Hi Lang,
>>>>>
>>>>> I believe your checkin caused the Windows build to break when
>>>>> compiling with Visual Studio 2013. When building your change, I am seeing
>>>>> the following errors:
>>>>>
>>>>> C:\Program Files (x86)\Microsoft Visual Studio
>>>>> 12.0\VC\include\future(294): error C2512: 'llvm::Expected<int>' : no
>>>>> appropriate default constructor available [C:\src\build\tools\lli\
>>>>> lli.vcxproj]
>>>>>           C:\Program Files (x86)\Microsoft Visual Studio
>>>>> 12.0\VC\include\future(286) : while compiling class template member
>>>>> function 'std::_Associated_state<_Ty>::_Associated_state(std::_Deleter_base<_Ty>
>>>>> *)'
>>>>>           with
>>>>>           [
>>>>>               _Ty=llvm::Expected<int>
>>>>>           ]
>>>>>           C:\Program Files (x86)\Microsoft Visual Studio
>>>>> 12.0\VC\include\future(1481) : see reference to function template
>>>>> instantiation 'std::_Associated_state<_Ty>::
>>>>> _Associated_state(std::_Deleter_base<_Ty> *)' being compiled
>>>>>           with
>>>>>           [
>>>>>               _Ty=llvm::Expected<int>
>>>>>           ]
>>>>>           C:\Program Files (x86)\Microsoft Visual Studio
>>>>> 12.0\VC\include\future(1018) : see reference to class template
>>>>> instantiation 'std::_Associated_state<_Ty>' being compiled
>>>>>           with
>>>>>           [
>>>>>               _Ty=llvm::Expected<int>
>>>>>           ]
>>>>>           C:\Program Files (x86)\Microsoft Visual Studio
>>>>> 12.0\VC\include\future(1014) : while compiling class template member
>>>>> function 'llvm::Expected<int> &std::_State_manager<_Ty>::_Get_value(void)
>>>>> const'
>>>>>           with
>>>>>           [
>>>>>               _Ty=llvm::Expected<int>
>>>>>           ]
>>>>>           C:\Program Files (x86)\Microsoft Visual Studio
>>>>> 12.0\VC\include\future(1132) : see reference to function template
>>>>> instantiation 'llvm::Expected<int> &std::_State_manager<_Ty>::_Get_value(void)
>>>>> const' being compiled
>>>>>           with
>>>>>           [
>>>>>               _Ty=llvm::Expected<int>
>>>>>           ]
>>>>>           C:\Program Files (x86)\Microsoft Visual Studio
>>>>> 12.0\VC\include\future(1101) : see reference to class template
>>>>> instantiation 'std::_State_manager<_Ty>' being compiled
>>>>>           with
>>>>>           [
>>>>>               _Ty=llvm::Expected<int>
>>>>>           ]
>>>>>           C:\Program Files (x86)\Microsoft Visual Studio
>>>>> 12.0\VC\include\utility(198) : see reference to class template
>>>>> instantiation 'std::future<llvm::Expected<int>>' being compiled
>>>>>           C:\src\llvm\include\llvm/Support/AlignOf.h(224) : see
>>>>> reference to class template instantiation 'std::pair<std::future<llvm::E
>>>>> xpected<int>>,SequenceNumberT>' being compiled
>>>>>           with
>>>>>           [
>>>>>               SequenceNumberT=uint16_t
>>>>>           ]
>>>>>           C:\Program Files (x86)\Microsoft Visual Studio
>>>>> 12.0\VC\include\type_traits(584) : see reference to class template
>>>>> instantiation 'llvm::detail::AlignerImpl<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>'
>>>>> being compiled
>>>>>           with
>>>>>           [
>>>>>               T1=std::pair<std::future<llvm::Expected<int>>,uint16_t>
>>>>>   ,            T2=char
>>>>>   ,            T3=char
>>>>>   ,            T4=char
>>>>>   ,            T5=char
>>>>>   ,            T6=char
>>>>>   ,            T7=char
>>>>>   ,            T8=char
>>>>>   ,            T9=char
>>>>>   ,            T10=char
>>>>>           ]
>>>>>           C:\src\llvm\include\llvm/Support/AlignOf.h(83) : see
>>>>> reference to class template instantiation 'std::is_abstract<T>' being
>>>>> compiled
>>>>>           with
>>>>>           [
>>>>>               T=llvm::detail::AlignerImpl<st
>>>>> d::pair<std::future<llvm::Expected<int>>,uint16_t>,char,char
>>>>> ,char,char,char,char,char,char,char>
>>>>>           ]
>>>>>           C:\src\llvm\include\llvm/Support/AlignOf.h(253) : see
>>>>> reference to class template instantiation 'llvm::AlignOf<llvm::detail::A
>>>>> lignerImpl<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>>' being compiled
>>>>>   Building Custom Rule C:/src/llvm/tools/clang/tools/
>>>>> arcmt-test/CMakeLists.txt
>>>>>           with
>>>>>           [
>>>>>               T1=std::pair<std::future<llvm::Expected<int>>,uint16_t>
>>>>>   ,            T2=char
>>>>>   ,            T3=char
>>>>>   ,            T4=char
>>>>>   ,            T5=char
>>>>>   ,            T6=char
>>>>>   ,            T7=char
>>>>>   ,            T8=char
>>>>>   ,            T9=char
>>>>>   ,            T10=char
>>>>>           ]
>>>>>           C:\src\llvm\include\llvm/Support/Error.h(831) : see
>>>>> reference to class template instantiation 'llvm::AlignedCharArrayUnion<s
>>>>> td::pair<std::future<llvm::Expected<int>>,SequenceNumberT>,c
>>>>> har,char,char,char,char,char,char,char,char>' being compiled
>>>>>           with
>>>>>           [
>>>>>   CMake does not need to re-run because C:\src\build\tools\clang\tools
>>>>> \arcmt-test\CMakeFiles\generate.stamp is up-to-date.
>>>>>               SequenceNumberT=uint16_t
>>>>>           ]
>>>>>           c:\src\llvm\include\llvm\executionengine\orc\RPCUtils.h(447)
>>>>> : see reference to class template instantiation
>>>>> 'llvm::Expected<std::pair<std::future<llvm::Expected<int>>,SequenceNumberT>>'
>>>>> being compiled
>>>>>           with
>>>>>           [
>>>>>               SequenceNumberT=uint16_t
>>>>>           ]
>>>>>           C:\src\llvm\include\llvm/ExecutionEngine/Orc/OrcRemoteTargetClient.h(606)
>>>>> : see reference to function template instantiation 'llvm::Expected<int>
>>>>> llvm::orc::remote::RPC<llvm::orc::remote::RPCChannel,uint32_
>>>>> t,uint16_t>::callSTHandling<llvm::orc::remote::OrcRemoteTarg
>>>>> etRPCAPI::CallIntVoid,llvm::orc::remote::OrcRemoteTargetClie
>>>>> nt<llvm::orc::remote::RPCChannel>::callIntVoid::<lambda_
>>>>> 1e43ba3f76d819646569b43fe46505bc>,llvm::JITTargetAddress>(ChannelT
>>>>> &,HandleFtor &,const llvm::JITTargetAddress &)' being compiled
>>>>>           with
>>>>>           [
>>>>>               ChannelT=llvm::orc::remote::RPCChannel
>>>>>   ,            HandleFtor=llvm::orc::remote::
>>>>> OrcRemoteTargetClient<llvm::orc::remote::RPCChannel>::callIn
>>>>> tVoid::<lambda_1e43ba3f76d819646569b43fe46505bc>
>>>>>           ]
>>>>>           C:\src\llvm\include\llvm/ExecutionEngine/Orc/OrcRemoteTargetClient.h(606)
>>>>> : see reference to function template instantiation 'llvm::Expected<int>
>>>>> llvm::orc::remote::RPC<llvm::orc::remote::RPCChannel,uint32_
>>>>> t,uint16_t>::callSTHandling<llvm::orc::remote::OrcRemoteTarg
>>>>> etRPCAPI::CallIntVoid,llvm::orc::remote::OrcRemoteTargetClie
>>>>> nt<llvm::orc::remote::RPCChannel>::callIntVoid::<lambda_
>>>>> 1e43ba3f76d819646569b43fe46505bc>,llvm::JITTargetAddress>(ChannelT
>>>>> &,HandleFtor &,const llvm::JITTargetAddress &)' being compiled
>>>>>           with
>>>>>           [
>>>>>               ChannelT=llvm::orc::remote::RPCChannel
>>>>>   ,            HandleFtor=llvm::orc::remote::
>>>>> OrcRemoteTargetClient<llvm::orc::remote::RPCChannel>::callIn
>>>>> tVoid::<lambda_1e43ba3f76d819646569b43fe46505bc>
>>>>>           ]
>>>>>           C:\src\llvm\include\llvm/ExecutionEngine/Orc/OrcRemoteTargetClient.h(600)
>>>>> : while compiling class template member function 'llvm::Expected<int>
>>>>> llvm::orc::remote::OrcRemoteTargetClient<llvm::orc::remote::
>>>>> RPCChannel>::callIntVoid(llvm::JITTargetAddress)'
>>>>>           C:\src\llvm\tools\lli\lli.cpp(694) : see reference to
>>>>> function template instantiation 'llvm::Expected<int>
>>>>> llvm::orc::remote::OrcRemoteTargetClient<llvm::orc::remote::
>>>>> RPCChannel>::callIntVoid(llvm::JITTargetAddress)' being compiled
>>>>>           C:\src\llvm\tools\lli\lli.cpp(666) : see reference to class
>>>>> template instantiation 'llvm::orc::remote::OrcRemoteT
>>>>> argetClient<llvm::orc::remote::RPCChannel>' being compiled
>>>>>   OrcLazyJIT.cpp
>>>>>
>>>>>
>>>>> Can you take a look into this?
>>>>>
>>>>> Douglas Yung
>>>>>
>>>>> > -----Original Message-----
>>>>> > From: llvm-commits [mailto:llvm-commits-bounces at lists.llvm.org] On
>>>>> > Behalf Of Lang Hames via llvm-commits
>>>>> > Sent: Monday, August 29, 2016 14:57
>>>>> > To: llvm-commits at lists.llvm.org
>>>>> > Subject: [llvm] r280016 - [ORC][RPC] Make the future type of an Orc
>>>>> RPC
>>>>> > call Error/Expected rather than
>>>>> >
>>>>> > Author: lhames
>>>>> > Date: Mon Aug 29 16:56:30 2016
>>>>> > New Revision: 280016
>>>>> >
>>>>> > URL: http://llvm.org/viewvc/llvm-project?rev=280016&view=rev
>>>>> > Log:
>>>>> > [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.
>>>>> >
>>>>> >
>>>>> > Modified:
>>>>> >     llvm/trunk/include/llvm/ExecutionEngine/Orc/RPCUtils.h
>>>>> >     llvm/trunk/unittests/ExecutionEngine/Orc/RPCUtilsTest.cpp
>>>>> >
>>>>> > Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/RPCUtils.h
>>>>> > URL: http://llvm.org/viewvc/llvm-
>>>>> > project/llvm/trunk/include/llvm/ExecutionEngine/Orc/RPCUtils
>>>>> .h?rev=2800
>>>>> > 16&r1=280015&r2=280016&view=diff
>>>>> > ============================================================
>>>>> ===========
>>>>> > =======
>>>>> > --- llvm/trunk/include/llvm/ExecutionEngine/Orc/RPCUtils.h
>>>>> (original)
>>>>> > +++ llvm/trunk/include/llvm/ExecutionEngine/Orc/RPCUtils.h Mon Aug
>>>>> 29
>>>>> > +++ 16:56:30 2016
>>>>> > @@ -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(Re
>>>>> sultAndSeqNo.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));
>>>>> >    }
>>>>> >
>>>>> >
>>>>> > Modified: llvm/trunk/unittests/ExecutionEngine/Orc/RPCUtilsTest.cpp
>>>>> > URL: http://llvm.org/viewvc/llvm-
>>>>> > project/llvm/trunk/unittests/ExecutionEngine/Orc/RPCUtilsTes
>>>>> t.cpp?rev=2
>>>>> > 80016&r1=280015&r2=280016&view=diff
>>>>> > ============================================================
>>>>> ===========
>>>>> > =======
>>>>> > --- llvm/trunk/unittests/ExecutionEngine/Orc/RPCUtilsTest.cpp
>>>>> > (original)
>>>>> > +++ llvm/trunk/unittests/ExecutionEngine/Orc/RPCUtilsTest.cpp Mon
>>>>> Aug
>>>>> > 29
>>>>> > +++ 16:56:30 2016
>>>>> > @@ -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.
>>>>> >
>>>>> >
>>>>> > _______________________________________________
>>>>> > llvm-commits mailing list
>>>>> > llvm-commits at lists.llvm.org
>>>>> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>>>>
>>>>
>>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160830/bc067263/attachment.html>


More information about the llvm-commits mailing list