| Index: ipc/ipc_message_templates.h
|
| diff --git a/ipc/ipc_message_templates.h b/ipc/ipc_message_templates.h
|
| index f5c28cca4a68978b3b5794d12a9d5e7108726eee..c0108596e2718ca847426d4008cb716b1bc650ef 100644
|
| --- a/ipc/ipc_message_templates.h
|
| +++ b/ipc/ipc_message_templates.h
|
| @@ -52,6 +52,58 @@ DispatchToMethod(ObjT* obj,
|
| base::MakeIndexSequence<sizeof...(Ts)>());
|
| }
|
|
|
| +// This function is for all the sync IPCs that don't pass an extra parameter
|
| +// using IPC_BEGIN_MESSAGE_MAP_WITH_PARAM.
|
| +template <typename ObjT,
|
| + typename Method,
|
| + typename P,
|
| + typename Tuple,
|
| + typename ReplyParam>
|
| +void DispatchToSyncMethod(ObjT* obj,
|
| + Method method,
|
| + P*,
|
| + const Tuple& tuple,
|
| + ReplyParam* reply) {
|
| + base::DispatchToMethod(obj, method, tuple, reply);
|
| +}
|
| +
|
| +template <typename ObjT,
|
| + typename Method,
|
| + typename P,
|
| + typename InTuple,
|
| + typename OutTuple,
|
| + size_t... InNs,
|
| + size_t... OutNs>
|
| +inline void DispatchToSyncMethodImpl(const ObjT& obj,
|
| + Method method,
|
| + P* parameter,
|
| + InTuple&& in,
|
| + OutTuple* out,
|
| + base::IndexSequence<InNs...>,
|
| + base::IndexSequence<OutNs...>) {
|
| + (obj->*method)(parameter, base::get<InNs>(std::forward<InTuple>(in))...,
|
| + &std::get<OutNs>(*out)...);
|
| +}
|
| +
|
| +// The following function is for sync IPCs which have a dispatcher with an
|
| +// extra parameter specified using IPC_BEGIN_MESSAGE_MAP_WITH_PARAM.
|
| +template <typename ObjT,
|
| + typename P,
|
| + typename... Args,
|
| + typename... InParam,
|
| + typename... OutParam>
|
| +typename std::enable_if<sizeof...(Args) ==
|
| + sizeof...(InParam) + sizeof...(OutParam)>::type
|
| +DispatchToSyncMethod(ObjT* obj,
|
| + void (ObjT::*method)(P*, Args...),
|
| + P* parameter,
|
| + const std::tuple<InParam...>& in,
|
| + std::tuple<OutParam...>* out) {
|
| + DispatchToSyncMethodImpl(obj, method, parameter, in, out,
|
| + base::MakeIndexSequence<sizeof...(InParam)>(),
|
| + base::MakeIndexSequence<sizeof...(OutParam)>());
|
| +}
|
| +
|
| enum class MessageKind {
|
| CONTROL,
|
| ROUTED,
|
| @@ -170,7 +222,7 @@ class MessageT<Meta, std::tuple<Ins...>, std::tuple<Outs...>>
|
| Message* reply = SyncMessage::GenerateReply(msg);
|
| if (ok) {
|
| ReplyParam reply_params;
|
| - base::DispatchToMethod(obj, func, send_params, &reply_params);
|
| + DispatchToSyncMethod(obj, func, parameter, send_params, &reply_params);
|
| WriteParam(reply, reply_params);
|
| LogReplyParamsToMessage(reply_params, msg);
|
| } else {
|
| @@ -193,7 +245,7 @@ class MessageT<Meta, std::tuple<Ins...>, std::tuple<Outs...>>
|
| if (ok) {
|
| std::tuple<Message&> t = std::tie(*reply);
|
| ConnectMessageAndReply(msg, reply);
|
| - base::DispatchToMethod(obj, func, send_params, &t);
|
| + DispatchToSyncMethod(obj, func, parameter, send_params, &t);
|
| } else {
|
| NOTREACHED() << "Error deserializing message " << msg->type();
|
| reply->set_reply_error();
|
|
|