[Orc] Clang-format the recent RPC update (r286620 and related).

llvm-svn: 287195
This commit is contained in:
Lang Hames 2016-11-17 02:33:47 +00:00
parent 63de4725df
commit 81c19e289d
5 changed files with 301 additions and 372 deletions

View File

@ -36,7 +36,6 @@ namespace remote {
template <typename ChannelT>
class OrcRemoteTargetClient : public OrcRemoteTargetRPCAPI {
public:
/// Remote memory manager.
class RCMemoryManager : public RuntimeDyld::MemoryManager {
public:
@ -544,8 +543,8 @@ public:
static Expected<std::unique_ptr<OrcRemoteTargetClient>>
Create(ChannelT &Channel) {
Error Err = Error::success();
std::unique_ptr<OrcRemoteTargetClient>
Client(new OrcRemoteTargetClient(Channel, Err));
std::unique_ptr<OrcRemoteTargetClient> Client(
new OrcRemoteTargetClient(Channel, Err));
if (Err)
return std::move(Err);
return std::move(Client);
@ -631,7 +630,6 @@ public:
Error terminateSession() { return callB<TerminateSession>(); }
private:
OrcRemoteTargetClient(ChannelT &Channel, Error &Err)
: OrcRemoteTargetRPCAPI(Channel) {
ErrorAsOutParameter EAO(&Err);

View File

@ -16,8 +16,8 @@
#ifndef LLVM_EXECUTIONENGINE_ORC_ORCREMOTETARGETRPCAPI_H
#define LLVM_EXECUTIONENGINE_ORC_ORCREMOTETARGETRPCAPI_H
#include "RawByteChannel.h"
#include "RPCUtils.h"
#include "RawByteChannel.h"
#include "llvm/ExecutionEngine/JITSymbol.h"
namespace llvm {
@ -44,19 +44,17 @@ private:
namespace rpc {
template <>
class RPCTypeName<remote::DirectBufferWriter> {
template <> class RPCTypeName<remote::DirectBufferWriter> {
public:
static const char *getName() { return "DirectBufferWriter"; }
};
template <typename ChannelT>
class SerializationTraits<ChannelT, remote::DirectBufferWriter, remote::DirectBufferWriter,
class SerializationTraits<
ChannelT, remote::DirectBufferWriter, remote::DirectBufferWriter,
typename std::enable_if<
std::is_base_of<RawByteChannel, ChannelT>::
value>::type> {
std::is_base_of<RawByteChannel, ChannelT>::value>::type> {
public:
static Error serialize(ChannelT &C, const remote::DirectBufferWriter &DBW) {
if (auto EC = serializeSeq(C, DBW.getDst()))
return EC;
@ -112,22 +110,21 @@ public:
OrcRemoteTargetRPCAPI(rpc::RawByteChannel &C)
: rpc::SingleThreadedRPC<rpc::RawByteChannel>(C, true) {}
class CallIntVoid : public rpc::Function<CallIntVoid,
int32_t(JITTargetAddress Addr)> {
class CallIntVoid
: public rpc::Function<CallIntVoid, int32_t(JITTargetAddress Addr)> {
public:
static const char *getName() { return "CallIntVoid"; }
};
class CallMain
: public rpc::Function<CallMain,
int32_t(JITTargetAddress Addr,
: public rpc::Function<CallMain, int32_t(JITTargetAddress Addr,
std::vector<std::string> Args)> {
public:
static const char *getName() { return "CallMain"; }
};
class CallVoidVoid : public rpc::Function<CallVoidVoid,
void(JITTargetAddress FnAddr)> {
class CallVoidVoid
: public rpc::Function<CallVoidVoid, void(JITTargetAddress FnAddr)> {
public:
static const char *getName() { return "CallVoidVoid"; }
};
@ -169,9 +166,9 @@ public:
/// EmitIndirectStubs result is (StubsBase, PtrsBase, NumStubsEmitted).
class EmitIndirectStubs
: public rpc::Function<EmitIndirectStubs,
std::tuple<JITTargetAddress, JITTargetAddress,
uint32_t>(
: public rpc::Function<
EmitIndirectStubs,
std::tuple<JITTargetAddress, JITTargetAddress, uint32_t>(
ResourceIdMgr::ResourceId StubsOwnerID,
uint32_t NumStubsRequired)> {
public:
@ -201,16 +198,15 @@ public:
/// GetRemoteInfo result is (Triple, PointerSize, PageSize, TrampolineSize,
/// IndirectStubsSize).
class GetRemoteInfo
: public rpc::Function<GetRemoteInfo,
std::tuple<std::string, uint32_t, uint32_t,
uint32_t, uint32_t>()> {
: public rpc::Function<
GetRemoteInfo,
std::tuple<std::string, uint32_t, uint32_t, uint32_t, uint32_t>()> {
public:
static const char *getName() { return "GetRemoteInfo"; }
};
class ReadMem
: public rpc::Function<ReadMem,
std::vector<uint8_t>(JITTargetAddress Src,
: public rpc::Function<ReadMem, std::vector<uint8_t>(JITTargetAddress Src,
uint64_t Size)> {
public:
static const char *getName() { return "ReadMem"; }
@ -232,8 +228,8 @@ public:
};
class RequestCompile
: public rpc::Function<RequestCompile,
JITTargetAddress(JITTargetAddress TrampolineAddr)> {
: public rpc::Function<
RequestCompile, JITTargetAddress(JITTargetAddress TrampolineAddr)> {
public:
static const char *getName() { return "RequestCompile"; }
};
@ -241,8 +237,7 @@ public:
class SetProtections
: public rpc::Function<SetProtections,
void(ResourceIdMgr::ResourceId AllocID,
JITTargetAddress Dst,
uint32_t ProtFlags)> {
JITTargetAddress Dst, uint32_t ProtFlags)> {
public:
static const char *getName() { return "SetProtections"; }
};
@ -252,19 +247,17 @@ public:
static const char *getName() { return "TerminateSession"; }
};
class WriteMem : public rpc::Function<WriteMem,
void(remote::DirectBufferWriter DB)> {
class WriteMem
: public rpc::Function<WriteMem, void(remote::DirectBufferWriter DB)> {
public:
static const char *getName() { return "WriteMem"; }
};
class WritePtr
: public rpc::Function<WritePtr,
void(JITTargetAddress Dst, JITTargetAddress Val)> {
class WritePtr : public rpc::Function<WritePtr, void(JITTargetAddress Dst,
JITTargetAddress Val)> {
public:
static const char *getName() { return "WritePtr"; }
};
};
} // end namespace remote

View File

@ -16,9 +16,9 @@
#define LLVM_EXECUTIONENGINE_ORC_ORCREMOTETARGETSERVER_H
#include "OrcRemoteTargetRPCAPI.h"
#include "llvm/ExecutionEngine/RTDyldMemoryManager.h"
#include "llvm/ExecutionEngine/JITSymbol.h"
#include "llvm/ExecutionEngine/Orc/OrcError.h"
#include "llvm/ExecutionEngine/RTDyldMemoryManager.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/Format.h"
@ -68,13 +68,13 @@ public:
addHandler<CallVoidVoid>(*this, &ThisT::handleCallVoidVoid);
addHandler<CreateRemoteAllocator>(*this,
&ThisT::handleCreateRemoteAllocator);
addHandler<CreateIndirectStubsOwner>(*this,
&ThisT::handleCreateIndirectStubsOwner);
addHandler<CreateIndirectStubsOwner>(
*this, &ThisT::handleCreateIndirectStubsOwner);
addHandler<DeregisterEHFrames>(*this, &ThisT::handleDeregisterEHFrames);
addHandler<DestroyRemoteAllocator>(*this,
&ThisT::handleDestroyRemoteAllocator);
addHandler<DestroyIndirectStubsOwner>(*this,
&ThisT::handleDestroyIndirectStubsOwner);
addHandler<DestroyIndirectStubsOwner>(
*this, &ThisT::handleDestroyIndirectStubsOwner);
addHandler<EmitIndirectStubs>(*this, &ThisT::handleEmitIndirectStubs);
addHandler<EmitResolverBlock>(*this, &ThisT::handleEmitResolverBlock);
addHandler<EmitTrampolineBlock>(*this, &ThisT::handleEmitTrampolineBlock);
@ -96,7 +96,6 @@ public:
OrcRemoteTargetServer(OrcRemoteTargetServer &&Other) = default;
OrcRemoteTargetServer &operator=(OrcRemoteTargetServer &&) = delete;
Expected<JITTargetAddress> requestCompile(JITTargetAddress TrampolineAddr) {
return callB<RequestCompile>(TrampolineAddr);
}
@ -254,11 +253,9 @@ private:
TargetT::emitIndirectStubsBlock(IS, NumStubsRequired, nullptr))
return std::move(Err);
JITTargetAddress StubsBase =
static_cast<JITTargetAddress>(
JITTargetAddress StubsBase = static_cast<JITTargetAddress>(
reinterpret_cast<uintptr_t>(IS.getStub(0)));
JITTargetAddress PtrsBase =
static_cast<JITTargetAddress>(
JITTargetAddress PtrsBase = static_cast<JITTargetAddress>(
reinterpret_cast<uintptr_t>(IS.getPtr(0)));
uint32_t NumStubsEmitted = IS.getNumStubs();
@ -307,8 +304,7 @@ private:
TrampolineBlocks.push_back(std::move(TrampolineBlock));
auto TrampolineBaseAddr =
static_cast<JITTargetAddress>(
auto TrampolineBaseAddr = static_cast<JITTargetAddress>(
reinterpret_cast<uintptr_t>(TrampolineMem));
return std::make_tuple(TrampolineBaseAddr, NumTrampolines);
@ -374,15 +370,14 @@ private:
DEBUG(dbgs() << " Allocator " << Id << " reserved " << LocalAllocAddr
<< " (" << Size << " bytes, alignment " << Align << ")\n");
JITTargetAddress AllocAddr =
static_cast<JITTargetAddress>(
JITTargetAddress AllocAddr = static_cast<JITTargetAddress>(
reinterpret_cast<uintptr_t>(LocalAllocAddr));
return AllocAddr;
}
Error handleSetProtections(ResourceIdMgr::ResourceId Id, JITTargetAddress Addr,
uint32_t Flags) {
Error handleSetProtections(ResourceIdMgr::ResourceId Id,
JITTargetAddress Addr, uint32_t Flags) {
auto I = Allocators.find(Id);
if (I == Allocators.end())
return orcError(OrcErrorCode::RemoteAllocatorDoesNotExist);

View File

@ -47,8 +47,7 @@ namespace llvm {
namespace orc {
namespace rpc {
template <typename DerivedFunc, typename FnT>
class Function;
template <typename DerivedFunc, typename FnT> class Function;
// RPC Function class.
// DerivedFunc should be a user defined class with a static 'getName()' method
@ -56,7 +55,6 @@ class Function;
template <typename DerivedFunc, typename RetT, typename... ArgTs>
class Function<DerivedFunc, RetT(ArgTs...)> {
public:
/// User defined function type.
using Type = RetT(ArgTs...);
@ -72,12 +70,12 @@ public:
<< "(" << llvm::orc::rpc::RPCTypeNameSequence<ArgTs...>() << ")";
return Name.data();
}
private:
static std::mutex NameMutex;
static std::string Name;
};
template <typename DerivedFunc, typename RetT, typename... ArgTs>
std::mutex Function<DerivedFunc, RetT(ArgTs...)>::NameMutex;
@ -101,24 +99,20 @@ std::string Function<DerivedFunc, RetT(ArgTs...)>::Name;
///
/// template <typename Func> T allocate():
/// Allocate a unique id for function Func.
template <typename T, typename = void>
class RPCFunctionIdAllocator;
template <typename T, typename = void> class RPCFunctionIdAllocator;
/// This specialization of RPCFunctionIdAllocator provides a default
/// implementation for integral types.
template <typename T>
class RPCFunctionIdAllocator<T,
typename std::enable_if<
std::is_integral<T>::value
>::type> {
class RPCFunctionIdAllocator<
T, typename std::enable_if<std::is_integral<T>::value>::type> {
public:
static T getInvalidId() { return T(0); }
static T getResponseId() { return T(1); }
static T getNegotiateId() { return T(2); }
template <typename Func>
T allocate(){ return NextId++; }
template <typename Func> T allocate() { return NextId++; }
private:
T NextId = 3;
};
@ -137,10 +131,7 @@ namespace msvc_hacks {
// already.
class MSVCPError : public Error {
public:
MSVCPError() {
(void)!!*this;
}
MSVCPError() { (void)!!*this; }
MSVCPError(MSVCPError &&Other) : Error(std::move(Other)) {}
@ -153,10 +144,8 @@ namespace msvc_hacks {
};
// Work around MSVC's future implementation, similar to MSVCPError.
template <typename T>
class MSVCPExpected : public Expected<T> {
template <typename T> class MSVCPExpected : public Expected<T> {
public:
MSVCPExpected()
: Expected<T>(make_error<StringError>("", inconvertibleErrorCode())) {
consumeError(this->takeError());
@ -172,21 +161,25 @@ namespace msvc_hacks {
MSVCPExpected(Error Err) : Expected<T>(std::move(Err)) {}
template <typename OtherT>
MSVCPExpected(OtherT &&Val,
typename std::enable_if<std::is_convertible<OtherT, T>::value>::type
* = nullptr) : Expected<T>(std::move(Val)) {}
MSVCPExpected(
OtherT &&Val,
typename std::enable_if<std::is_convertible<OtherT, T>::value>::type * =
nullptr)
: Expected<T>(std::move(Val)) {}
template <class OtherT>
MSVCPExpected(
Expected<OtherT> &&Other,
typename std::enable_if<std::is_convertible<OtherT, T>::value>::type * =
nullptr) : Expected<T>(std::move(Other)) {}
nullptr)
: Expected<T>(std::move(Other)) {}
template <class OtherT>
explicit MSVCPExpected(
Expected<OtherT> &&Other,
typename std::enable_if<!std::is_convertible<OtherT, T>::value>::type * =
nullptr) : Expected<T>(std::move(Other)) {}
nullptr)
: Expected<T>(std::move(Other)) {}
};
} // end namespace msvc_hacks
@ -195,10 +188,8 @@ namespace msvc_hacks {
// ResultTraits provides typedefs and utilities specific to the return type
// of functions.
template <typename RetT>
class ResultTraits {
template <typename RetT> class ResultTraits {
public:
// The return type wrapped in llvm::Expected.
using ErrorReturnType = Expected<RetT>;
@ -229,10 +220,8 @@ public:
};
// ResultTraits specialization for void functions.
template <>
class ResultTraits<void> {
template <> class ResultTraits<void> {
public:
// For void functions, ErrorReturnType is llvm::Error.
using ErrorReturnType = Error;
@ -266,8 +255,7 @@ public:
// handlers for void RPC functions to return either void (in which case they
// implicitly succeed) or Error (in which case their error return is
// propagated). See usage in HandlerTraits::runHandlerHelper.
template <>
class ResultTraits<Error> : public ResultTraits<void> {};
template <> class ResultTraits<Error> : public ResultTraits<void> {};
// ResultTraits<Expected<T>> is equivalent to ResultTraits<T>. This allows
// handlers for RPC functions returning a T to return either a T (in which
@ -293,8 +281,9 @@ static Error respond(ChannelT &C, const FunctionIdT &ResponseId,
return Err;
// Serialize the result.
if (auto Err = SerializationTraits<ChannelT, WireRetT, HandlerRetT>::
serialize(C, *ResultOrErr))
if (auto Err =
SerializationTraits<ChannelT, WireRetT, HandlerRetT>::serialize(
C, *ResultOrErr))
return Err;
// Close the response message.
@ -315,32 +304,27 @@ static Error respond(ChannelT &C, const FunctionIdT &ResponseId,
}
// Converts a given type to the equivalent error return type.
template <typename T>
class WrappedHandlerReturn {
template <typename T> class WrappedHandlerReturn {
public:
using Type = Expected<T>;
};
template <typename T>
class WrappedHandlerReturn<Expected<T>> {
template <typename T> class WrappedHandlerReturn<Expected<T>> {
public:
using Type = Expected<T>;
};
template <>
class WrappedHandlerReturn<void> {
template <> class WrappedHandlerReturn<void> {
public:
using Type = Error;
};
template <>
class WrappedHandlerReturn<Error> {
template <> class WrappedHandlerReturn<Error> {
public:
using Type = Error;
};
template <>
class WrappedHandlerReturn<ErrorSuccess> {
template <> class WrappedHandlerReturn<ErrorSuccess> {
public:
using Type = Error;
};
@ -350,15 +334,14 @@ public:
// specialized for function types) and inherits from the appropriate
// speciilization for the given non-function type's call operator.
template <typename HandlerT>
class HandlerTraits
: public HandlerTraits<decltype(
&std::remove_reference<HandlerT>::type::operator())> {};
class HandlerTraits : public HandlerTraits<decltype(
&std::remove_reference<HandlerT>::type::operator())> {
};
// Traits for handlers with a given function type.
template <typename RetT, typename... ArgTs>
class HandlerTraits<RetT(ArgTs...)> {
public:
// Function type of the handler.
using Type = RetT(ArgTs...);
@ -366,9 +349,7 @@ public:
using ReturnType = RetT;
// A std::tuple wrapping the handler arguments.
using ArgStorage =
std::tuple<
typename std::decay<
using ArgStorage = std::tuple<typename std::decay<
typename std::remove_reference<ArgTs>::type>::type...>;
// Call the given handler with the given arguments.
@ -393,7 +374,6 @@ public:
}
private:
// For non-void user handlers: unwrap the args tuple and call the handler,
// returning the result.
template <typename RetTAlt, typename HandlerT, size_t... Indexes>
@ -414,13 +394,11 @@ private:
}
template <typename ChannelT, typename... CArgTs, size_t... Indexes>
static
Error deserializeArgsHelper(ChannelT &C, std::tuple<CArgTs...> &Args,
static Error deserializeArgsHelper(ChannelT &C, std::tuple<CArgTs...> &Args,
llvm::index_sequence<Indexes...> _) {
return SequenceSerialization<ChannelT, ArgTs...>::
deserialize(C, std::get<Indexes>(Args)...);
return SequenceSerialization<ChannelT, ArgTs...>::deserialize(
C, std::get<Indexes>(Args)...);
}
};
// Handler traits for class methods (especially call operators for lambdas).
@ -435,11 +413,9 @@ class HandlerTraits<RetT (Class::*)(ArgTs...) const>
: public HandlerTraits<RetT(ArgTs...)> {};
// Utility to peel the Expected wrapper off a response handler error type.
template <typename HandlerT>
class UnwrapResponseHandlerArg;
template <typename HandlerT> class UnwrapResponseHandlerArg;
template <typename ArgT>
class UnwrapResponseHandlerArg<Error(Expected<ArgT>)> {
template <typename ArgT> class UnwrapResponseHandlerArg<Error(Expected<ArgT>)> {
public:
using ArgType = ArgT;
};
@ -450,11 +426,9 @@ public:
using ArgType = ArgT;
};
// ResponseHandler represents a handler for a not-yet-received function call
// result.
template <typename ChannelT>
class ResponseHandler {
template <typename ChannelT> class ResponseHandler {
public:
virtual ~ResponseHandler() {}
@ -478,8 +452,7 @@ public:
template <typename ChannelT, typename FuncRetT, typename HandlerT>
class ResponseHandlerImpl : public ResponseHandler<ChannelT> {
public:
ResponseHandlerImpl(HandlerT Handler)
: Handler(std::move(Handler)) {}
ResponseHandlerImpl(HandlerT Handler) : Handler(std::move(Handler)) {}
// Handle the result by deserializing it from the channel then passing it
// to the user defined handler.
@ -487,8 +460,9 @@ public:
using ArgType = typename UnwrapResponseHandlerArg<
typename HandlerTraits<HandlerT>::Type>::ArgType;
ArgType Result;
if (auto Err = SerializationTraits<ChannelT, FuncRetT, ArgType>::
deserialize(C, Result))
if (auto Err =
SerializationTraits<ChannelT, FuncRetT, ArgType>::deserialize(
C, Result))
return Err;
if (auto Err = C.endReceiveMessage())
return Err;
@ -513,8 +487,7 @@ template <typename ChannelT, typename HandlerT>
class ResponseHandlerImpl<ChannelT, void, HandlerT>
: public ResponseHandler<ChannelT> {
public:
ResponseHandlerImpl(HandlerT Handler)
: Handler(std::move(Handler)) {}
ResponseHandlerImpl(HandlerT Handler) : Handler(std::move(Handler)) {}
// Handle the result (no actual value, just a notification that the function
// has completed on the remote end) by calling the user-defined handler with
@ -540,10 +513,9 @@ private:
// Create a ResponseHandler from a given user handler.
template <typename ChannelT, typename FuncRetT, typename HandlerT>
std::unique_ptr<ResponseHandler<ChannelT>>
createResponseHandler(HandlerT H) {
return llvm::make_unique<
ResponseHandlerImpl<ChannelT, FuncRetT, HandlerT>>(std::move(H));
std::unique_ptr<ResponseHandler<ChannelT>> createResponseHandler(HandlerT H) {
return llvm::make_unique<ResponseHandlerImpl<ChannelT, FuncRetT, HandlerT>>(
std::move(H));
}
// Helper for wrapping member functions up as functors. This is useful for
@ -557,6 +529,7 @@ public:
RetT operator()(ArgTs &&... Args) {
return (Instance.*Method)(std::move(Args)...);
}
private:
ClassT &Instance;
MethodT Method;
@ -578,13 +551,13 @@ public:
this->Arg = std::move(ArgVal);
return ReadArgs<ArgTs...>::operator()(ArgVals...);
}
private:
ArgT &Arg;
};
// Manage sequence numbers.
template <typename SequenceNumberT>
class SequenceNumberManager {
template <typename SequenceNumberT> class SequenceNumberManager {
public:
// Reset, making all sequence numbers available.
void reset() {
@ -630,7 +603,6 @@ template <typename ImplT, typename ChannelT, typename FunctionIdT,
typename SequenceNumberT>
class RPCBase {
protected:
class OrcRPCInvalid : public Function<OrcRPCInvalid, void()> {
public:
static const char *getName() { return "__orc_rpc$invalid"; }
@ -648,7 +620,6 @@ protected:
};
public:
/// Construct an RPC instance on a channel.
RPCBase(ChannelT &C, bool LazyAutoNegotiation)
: C(C), LazyAutoNegotiation(LazyAutoNegotiation) {
@ -660,10 +631,9 @@ public:
// Register the negotiate function id and handler.
auto NegotiateId = FnIdAllocator.getNegotiateId();
RemoteFunctionIds[OrcRPCNegotiate::getPrototype()] = NegotiateId;
Handlers[NegotiateId] =
wrapHandler<OrcRPCNegotiate>([this](const std::string &Name) {
return handleNegotiate(Name);
}, LaunchPolicy());
Handlers[NegotiateId] = wrapHandler<OrcRPCNegotiate>(
[this](const std::string &Name) { return handleNegotiate(Name); },
LaunchPolicy());
}
/// Append a call Func, does not call send on the channel.
@ -703,9 +673,8 @@ public:
}
// Serialize the call arguments.
if (auto Err =
detail::HandlerTraits<typename Func::Type>::
serializeArgs(C, Args...)) {
if (auto Err = detail::HandlerTraits<typename Func::Type>::serializeArgs(
C, Args...)) {
abandonPendingResponses();
return joinErrors(std::move(Err), C.endSendMessage());
}
@ -719,7 +688,6 @@ public:
return Error::success();
}
template <typename Func, typename HandlerT, typename... ArgTs>
Error callAsync(HandlerT Handler, const ArgTs &... Args) {
if (auto Err = appendCallAsync<Func>(std::move(Handler), Args...))
@ -772,8 +740,8 @@ protected:
void addHandlerImpl(HandlerT Handler, LaunchPolicy Launch) {
FunctionIdT NewFnId = FnIdAllocator.template allocate<Func>();
LocalFunctionIds[Func::getPrototype()] = NewFnId;
Handlers[NewFnId] = wrapHandler<Func>(std::move(Handler),
std::move(Launch));
Handlers[NewFnId] =
wrapHandler<Func>(std::move(Handler), std::move(Launch));
}
// Abandon all outstanding results.
@ -813,8 +781,7 @@ protected:
// Find the remote FunctionId for the given function, which must be in the
// RemoteFunctionIds map.
template <typename Func>
Expected<FunctionIdT> getRemoteFunctionId() {
template <typename Func> Expected<FunctionIdT> getRemoteFunctionId() {
// Try to find the id for the given function.
auto I = RemoteFunctionIds.find(Func::getPrototype());
@ -855,14 +822,14 @@ protected:
// result-serialization code, and call to the launch policy (if present).
template <typename Func, typename HandlerT>
WrappedHandlerFn wrapHandler(HandlerT Handler, LaunchPolicy Launch) {
return
[this, Handler, Launch](ChannelT &Channel, SequenceNumberT SeqNo) mutable
-> Error {
return [this, Handler, Launch](ChannelT &Channel,
SequenceNumberT SeqNo) mutable -> Error {
// Start by deserializing the arguments.
auto Args =
std::make_shared<typename detail::HandlerTraits<HandlerT>::ArgStorage>();
if (auto Err = detail::HandlerTraits<typename Func::Type>::
deserializeArgs(Channel, *Args))
auto Args = std::make_shared<
typename detail::HandlerTraits<HandlerT>::ArgStorage>();
if (auto Err =
detail::HandlerTraits<typename Func::Type>::deserializeArgs(
Channel, *Args))
return Err;
// GCC 4.7 and 4.8 incorrectly issue a -Wunused-but-set-variable warning
@ -875,13 +842,12 @@ protected:
return Err;
// Build the handler/responder.
auto Responder =
[this, Handler, Args, &Channel, SeqNo]() mutable -> Error {
auto Responder = [this, Handler, Args, &Channel,
SeqNo]() mutable -> Error {
using HTraits = detail::HandlerTraits<HandlerT>;
using FuncReturn = typename Func::ReturnType;
return detail::respond<FuncReturn>(Channel, ResponseId, SeqNo,
HTraits::runHandler(Handler,
*Args));
HTraits::runHandler(Handler, *Args));
};
// If there is an explicit launch policy then use it to launch the
@ -913,21 +879,18 @@ protected:
} // end namespace detail
template <typename ChannelT,
typename FunctionIdT = uint32_t,
template <typename ChannelT, typename FunctionIdT = uint32_t,
typename SequenceNumberT = uint32_t>
class MultiThreadedRPC
: public detail::RPCBase<MultiThreadedRPC<ChannelT, FunctionIdT,
SequenceNumberT>,
ChannelT, FunctionIdT, SequenceNumberT> {
: public detail::RPCBase<
MultiThreadedRPC<ChannelT, FunctionIdT, SequenceNumberT>, ChannelT,
FunctionIdT, SequenceNumberT> {
private:
using BaseClass =
detail::RPCBase<MultiThreadedRPC<ChannelT, FunctionIdT, SequenceNumberT>,
ChannelT, FunctionIdT, SequenceNumberT>;
public:
MultiThreadedRPC(ChannelT &C, bool LazyAutoNegotiation)
: BaseClass(C, LazyAutoNegotiation) {}
@ -959,8 +922,7 @@ public:
}
/// Negotiate a function id for Func with the other end of the channel.
template <typename Func>
Error negotiateFunction() {
template <typename Func> Error negotiateFunction() {
using OrcRPCNegotiate = typename BaseClass::OrcRPCNegotiate;
if (auto RemoteIdOrErr = callB<OrcRPCNegotiate>(Func::getPrototype())) {
@ -971,8 +933,7 @@ public:
}
/// Convenience method for negotiating multiple functions at once.
template <typename Func>
Error negotiateFunctions() {
template <typename Func> Error negotiateFunctions() {
return negotiateFunction<Func>();
}
@ -986,8 +947,8 @@ public:
/// Return type for non-blocking call primitives.
template <typename Func>
using NonBlockingCallResult =
typename detail::ResultTraits<typename Func::ReturnType>::ReturnFutureType;
using NonBlockingCallResult = typename detail::ResultTraits<
typename Func::ReturnType>::ReturnFutureType;
/// Call Func on Channel C. Does not block, does not call send. Returns a pair
/// of a future result and the sequence number assigned to the result.
@ -997,8 +958,7 @@ public:
/// result. In multi-threaded mode the appendCallNB method, which does not
/// return the sequence numeber, should be preferred.
template <typename Func, typename... ArgTs>
Expected<NonBlockingCallResult<Func>>
appendCallNB(const ArgTs &... Args) {
Expected<NonBlockingCallResult<Func>> appendCallNB(const ArgTs &... Args) {
using RTraits = detail::ResultTraits<typename Func::ReturnType>;
using ErrorReturn = typename RTraits::ErrorReturnType;
using ErrorReturnPromise = typename RTraits::ReturnPromiseType;
@ -1012,7 +972,8 @@ public:
[Promise](ErrorReturn RetOrErr) {
Promise->set_value(std::move(RetOrErr));
return Error::success();
}, Args...)) {
},
Args...)) {
this->abandonPendingResponses();
RTraits::consumeAbandoned(FutureResult.get());
return std::move(Err);
@ -1023,15 +984,14 @@ public:
/// The same as appendCallNBWithSeq, except that it calls C.send() to
/// flush the channel after serializing the call.
template <typename Func, typename... ArgTs>
Expected<NonBlockingCallResult<Func>>
callNB(const ArgTs &... Args) {
Expected<NonBlockingCallResult<Func>> callNB(const ArgTs &... Args) {
auto Result = appendCallNB<Func>(Args...);
if (!Result)
return Result;
if (auto Err = this->C.send()) {
this->abandonPendingResponses();
detail::ResultTraits<typename Func::ReturnType>::
consumeAbandoned(std::move(Result->get()));
detail::ResultTraits<typename Func::ReturnType>::consumeAbandoned(
std::move(Result->get()));
return std::move(Err);
}
return Result;
@ -1049,8 +1009,8 @@ public:
if (auto FutureResOrErr = callNB<Func>(Args...)) {
if (auto Err = this->C.send()) {
this->abandonPendingResponses();
detail::ResultTraits<typename Func::ReturnType>::
consumeAbandoned(std::move(FutureResOrErr->get()));
detail::ResultTraits<typename Func::ReturnType>::consumeAbandoned(
std::move(FutureResOrErr->get()));
return std::move(Err);
}
return FutureResOrErr->get();
@ -1065,27 +1025,22 @@ public:
return Err;
return Error::success();
}
};
template <typename ChannelT,
typename FunctionIdT = uint32_t,
template <typename ChannelT, typename FunctionIdT = uint32_t,
typename SequenceNumberT = uint32_t>
class SingleThreadedRPC
: public detail::RPCBase<SingleThreadedRPC<ChannelT, FunctionIdT,
SequenceNumberT>,
ChannelT, FunctionIdT,
SequenceNumberT> {
: public detail::RPCBase<
SingleThreadedRPC<ChannelT, FunctionIdT, SequenceNumberT>, ChannelT,
FunctionIdT, SequenceNumberT> {
private:
using BaseClass = detail::RPCBase<SingleThreadedRPC<ChannelT, FunctionIdT,
SequenceNumberT>,
using BaseClass =
detail::RPCBase<SingleThreadedRPC<ChannelT, FunctionIdT, SequenceNumberT>,
ChannelT, FunctionIdT, SequenceNumberT>;
using LaunchPolicy = typename BaseClass::LaunchPolicy;
public:
SingleThreadedRPC(ChannelT &C, bool LazyAutoNegotiation)
: BaseClass(C, LazyAutoNegotiation) {}
@ -1102,8 +1057,7 @@ public:
}
/// Negotiate a function id for Func with the other end of the channel.
template <typename Func>
Error negotiateFunction() {
template <typename Func> Error negotiateFunction() {
using OrcRPCNegotiate = typename BaseClass::OrcRPCNegotiate;
if (auto RemoteIdOrErr = callB<OrcRPCNegotiate>(Func::getPrototype())) {
@ -1114,8 +1068,7 @@ public:
}
/// Convenience method for negotiating multiple functions at once.
template <typename Func>
Error negotiateFunctions() {
template <typename Func> Error negotiateFunctions() {
return negotiateFunction<Func>();
}
@ -1132,8 +1085,7 @@ public:
typename detail::ResultTraits<AltRetT>::ErrorReturnType
callB(const ArgTs &... Args) {
bool ReceivedResponse = false;
using ResultType =
typename detail::ResultTraits<AltRetT>::ErrorReturnType;
using ResultType = typename detail::ResultTraits<AltRetT>::ErrorReturnType;
auto Result = detail::ResultTraits<AltRetT>::createBlankErrorReturnValue();
// We have to 'Check' result (which we know is in a success state at this
@ -1145,27 +1097,25 @@ public:
Result = std::move(R);
ReceivedResponse = true;
return Error::success();
}, Args...)) {
},
Args...)) {
this->abandonPendingResponses();
detail::ResultTraits<typename Func::ReturnType>::
consumeAbandoned(std::move(Result));
detail::ResultTraits<typename Func::ReturnType>::consumeAbandoned(
std::move(Result));
return std::move(Err);
}
while (!ReceivedResponse) {
if (auto Err = this->handleOne()) {
this->abandonPendingResponses();
detail::ResultTraits<typename Func::ReturnType>::
consumeAbandoned(std::move(Result));
detail::ResultTraits<typename Func::ReturnType>::consumeAbandoned(
std::move(Result));
return std::move(Err);
}
}
return Result;
}
//using detail::RPCBase<ChannelT, FunctionIdT, SequenceNumberT>::handleOne;
};
} // end namespace rpc

View File

@ -86,17 +86,14 @@ private:
};
template <typename ChannelT, typename T>
class SerializationTraits<ChannelT, T, T,
class SerializationTraits<
ChannelT, T, T,
typename std::enable_if<
std::is_base_of<RawByteChannel, ChannelT>::value &&
(std::is_same<T, uint8_t>::value ||
std::is_same<T, int8_t>::value ||
std::is_same<T, uint16_t>::value ||
std::is_same<T, int16_t>::value ||
std::is_same<T, uint32_t>::value ||
std::is_same<T, int32_t>::value ||
std::is_same<T, uint64_t>::value ||
std::is_same<T, int64_t>::value ||
(std::is_same<T, uint8_t>::value || std::is_same<T, int8_t>::value ||
std::is_same<T, uint16_t>::value || std::is_same<T, int16_t>::value ||
std::is_same<T, uint32_t>::value || std::is_same<T, int32_t>::value ||
std::is_same<T, uint64_t>::value || std::is_same<T, int64_t>::value ||
std::is_same<T, char>::value)>::type> {
public:
static Error serialize(ChannelT &C, T V) {
@ -114,9 +111,8 @@ public:
template <typename ChannelT>
class SerializationTraits<ChannelT, bool, bool,
typename std::enable_if<
std::is_base_of<RawByteChannel, ChannelT>::value>::
type> {
typename std::enable_if<std::is_base_of<
RawByteChannel, ChannelT>::value>::type> {
public:
static Error serialize(ChannelT &C, bool V) {
return C.appendBytes(reinterpret_cast<const char *>(&V), 1);
@ -129,9 +125,8 @@ public:
template <typename ChannelT>
class SerializationTraits<ChannelT, std::string, StringRef,
typename std::enable_if<
std::is_base_of<RawByteChannel, ChannelT>::value>::
type> {
typename std::enable_if<std::is_base_of<
RawByteChannel, ChannelT>::value>::type> {
public:
/// RPC channel serialization for std::strings.
static Error serialize(RawByteChannel &C, StringRef S) {
@ -143,26 +138,24 @@ public:
template <typename ChannelT>
class SerializationTraits<ChannelT, std::string, const char *,
typename std::enable_if<
std::is_base_of<RawByteChannel, ChannelT>::value>::
type> {
typename std::enable_if<std::is_base_of<
RawByteChannel, ChannelT>::value>::type> {
public:
static Error serialize(RawByteChannel &C, const char *S) {
return SerializationTraits<ChannelT, std::string, StringRef>::
serialize(C, S);
return SerializationTraits<ChannelT, std::string, StringRef>::serialize(C,
S);
}
};
template <typename ChannelT>
class SerializationTraits<ChannelT, std::string, std::string,
typename std::enable_if<
std::is_base_of<RawByteChannel, ChannelT>::value>::
type> {
typename std::enable_if<std::is_base_of<
RawByteChannel, ChannelT>::value>::type> {
public:
/// RPC channel serialization for std::strings.
static Error serialize(RawByteChannel &C, const std::string &S) {
return SerializationTraits<ChannelT, std::string, StringRef>::
serialize(C, S);
return SerializationTraits<ChannelT, std::string, StringRef>::serialize(C,
S);
}
/// RPC channel deserialization for std::strings.