1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker // Defining IPC Messages 6*6777b538SAndroid Build Coastguard Worker // 7*6777b538SAndroid Build Coastguard Worker // Your IPC messages will be defined by macros inside of an XXX_messages.h 8*6777b538SAndroid Build Coastguard Worker // header file. Most of the time, the system can automatically generate all 9*6777b538SAndroid Build Coastguard Worker // of messaging mechanism from these definitions, but sometimes some manual 10*6777b538SAndroid Build Coastguard Worker // coding is required. In these cases, you will also have an XXX_messages.cc 11*6777b538SAndroid Build Coastguard Worker // implementation file as well. 12*6777b538SAndroid Build Coastguard Worker // 13*6777b538SAndroid Build Coastguard Worker // The senders of your messages will include your XXX_messages.h file to 14*6777b538SAndroid Build Coastguard Worker // get the full set of definitions they need to send your messages. 15*6777b538SAndroid Build Coastguard Worker // 16*6777b538SAndroid Build Coastguard Worker // Each XXX_messages.h file must be registered with the IPC system. This 17*6777b538SAndroid Build Coastguard Worker // requires adding two things: 18*6777b538SAndroid Build Coastguard Worker // - An XXXMsgStart value to the IPCMessageStart enum in ipc_message_start.h 19*6777b538SAndroid Build Coastguard Worker // - An inclusion of XXX_messages.h file in a message generator .h file 20*6777b538SAndroid Build Coastguard Worker // 21*6777b538SAndroid Build Coastguard Worker // The XXXMsgStart value is an enumeration that ensures uniqueness for 22*6777b538SAndroid Build Coastguard Worker // each different message file. Later, you will use this inside your 23*6777b538SAndroid Build Coastguard Worker // XXX_messages.h file before invoking message declaration macros: 24*6777b538SAndroid Build Coastguard Worker // #define IPC_MESSAGE_START XXXMsgStart 25*6777b538SAndroid Build Coastguard Worker // ( ... your macro invocations go here ... ) 26*6777b538SAndroid Build Coastguard Worker // 27*6777b538SAndroid Build Coastguard Worker // Message Generator Files 28*6777b538SAndroid Build Coastguard Worker // 29*6777b538SAndroid Build Coastguard Worker // A message generator .h header file pulls in all other message-declaring 30*6777b538SAndroid Build Coastguard Worker // headers for a given component. It is included by a message generator 31*6777b538SAndroid Build Coastguard Worker // .cc file, which is where all the generated code will wind up. Typically, 32*6777b538SAndroid Build Coastguard Worker // you will use an existing generator (e.g. common_message_generator.cc 33*6777b538SAndroid Build Coastguard Worker // in /chrome/common), but there are circumstances where you may add a 34*6777b538SAndroid Build Coastguard Worker // new one. 35*6777b538SAndroid Build Coastguard Worker // 36*6777b538SAndroid Build Coastguard Worker // In the rare circumstances where you can't re-use an existing file, 37*6777b538SAndroid Build Coastguard Worker // your YYY_message_generator.cc file for a component YYY would contain 38*6777b538SAndroid Build Coastguard Worker // the following code: 39*6777b538SAndroid Build Coastguard Worker // // Get basic type definitions. 40*6777b538SAndroid Build Coastguard Worker // #define IPC_MESSAGE_IMPL 41*6777b538SAndroid Build Coastguard Worker // #include "path/to/YYY_message_generator.h" 42*6777b538SAndroid Build Coastguard Worker // // Generate constructors. 43*6777b538SAndroid Build Coastguard Worker // #include "ipc/struct_constructor_macros.h" 44*6777b538SAndroid Build Coastguard Worker // #include "path/to/YYY_message_generator.h" 45*6777b538SAndroid Build Coastguard Worker // // Generate param traits write methods. 46*6777b538SAndroid Build Coastguard Worker // #include "ipc/param_traits_write_macros.h" 47*6777b538SAndroid Build Coastguard Worker // namespace IPC { 48*6777b538SAndroid Build Coastguard Worker // #include "path/to/YYY_message_generator.h" 49*6777b538SAndroid Build Coastguard Worker // } // namespace IPC 50*6777b538SAndroid Build Coastguard Worker // // Generate param traits read methods. 51*6777b538SAndroid Build Coastguard Worker // #include "ipc/param_traits_read_macros.h" 52*6777b538SAndroid Build Coastguard Worker // namespace IPC { 53*6777b538SAndroid Build Coastguard Worker // #include "path/to/YYY_message_generator.h" 54*6777b538SAndroid Build Coastguard Worker // } // namespace IPC 55*6777b538SAndroid Build Coastguard Worker // // Generate param traits log methods. 56*6777b538SAndroid Build Coastguard Worker // #include "ipc/param_traits_log_macros.h" 57*6777b538SAndroid Build Coastguard Worker // namespace IPC { 58*6777b538SAndroid Build Coastguard Worker // #include "path/to/YYY_message_generator.h" 59*6777b538SAndroid Build Coastguard Worker // } // namespace IPC 60*6777b538SAndroid Build Coastguard Worker // 61*6777b538SAndroid Build Coastguard Worker // In cases where manual generation is required, in your XXX_messages.cc 62*6777b538SAndroid Build Coastguard Worker // file, put the following after all the includes for param types: 63*6777b538SAndroid Build Coastguard Worker // #define IPC_MESSAGE_IMPL 64*6777b538SAndroid Build Coastguard Worker // #include "XXX_messages.h" 65*6777b538SAndroid Build Coastguard Worker // (... implementation of traits not auto-generated ...) 66*6777b538SAndroid Build Coastguard Worker // 67*6777b538SAndroid Build Coastguard Worker // Multiple Inclusion 68*6777b538SAndroid Build Coastguard Worker // 69*6777b538SAndroid Build Coastguard Worker // The XXX_messages.h file will be multiply-included by the 70*6777b538SAndroid Build Coastguard Worker // YYY_message_generator.cc file, so your XXX_messages file can't be 71*6777b538SAndroid Build Coastguard Worker // guarded in the usual manner. Ideally, there will be no need for any 72*6777b538SAndroid Build Coastguard Worker // inclusion guard, since the XXX_messages.h file should consist solely 73*6777b538SAndroid Build Coastguard Worker // of inclusions of other headers (which are self-guarding) and IPC 74*6777b538SAndroid Build Coastguard Worker // macros (which are multiply evaluating). 75*6777b538SAndroid Build Coastguard Worker // 76*6777b538SAndroid Build Coastguard Worker // Note that #pragma once cannot be used here; doing so would mark the whole 77*6777b538SAndroid Build Coastguard Worker // file as being singly-included. Since your XXX_messages.h file is only 78*6777b538SAndroid Build Coastguard Worker // partially-guarded, care must be taken to ensure that it is only included 79*6777b538SAndroid Build Coastguard Worker // by other .cc files (and the YYY_message_generator.h file). Including an 80*6777b538SAndroid Build Coastguard Worker // XXX_messages.h file in some other .h file may result in duplicate 81*6777b538SAndroid Build Coastguard Worker // declarations and a compilation failure. 82*6777b538SAndroid Build Coastguard Worker // 83*6777b538SAndroid Build Coastguard Worker // Type Declarations 84*6777b538SAndroid Build Coastguard Worker // 85*6777b538SAndroid Build Coastguard Worker // It is generally a bad idea to have type definitions in a XXX_messages.h 86*6777b538SAndroid Build Coastguard Worker // file; most likely the typedef will then be used in the message, as opposed 87*6777b538SAndroid Build Coastguard Worker // to the struct itself. Later, an IPC message dispatcher will need to call 88*6777b538SAndroid Build Coastguard Worker // a function taking that type, and that function is declared in some other 89*6777b538SAndroid Build Coastguard Worker // header. Thus, in order to get the type definition, the other header 90*6777b538SAndroid Build Coastguard Worker // would have to include the XXX_messages.h file, violating the rule above 91*6777b538SAndroid Build Coastguard Worker // about not including XXX_messages.h file in other .h files. 92*6777b538SAndroid Build Coastguard Worker // 93*6777b538SAndroid Build Coastguard Worker // One approach here is to move these type definitions to another (guarded) 94*6777b538SAndroid Build Coastguard Worker // .h file and include this second .h in your XXX_messages.h file. This 95*6777b538SAndroid Build Coastguard Worker // is still less than ideal, because the dispatched function would have to 96*6777b538SAndroid Build Coastguard Worker // redeclare the typedef or include this second header. This may be 97*6777b538SAndroid Build Coastguard Worker // reasonable in a few cases. 98*6777b538SAndroid Build Coastguard Worker // 99*6777b538SAndroid Build Coastguard Worker // Failing all of the above, then you will want to bracket the smallest 100*6777b538SAndroid Build Coastguard Worker // possible section of your XXX_messages.h file containing these types 101*6777b538SAndroid Build Coastguard Worker // with an include guard macro. Be aware that providing an incomplete 102*6777b538SAndroid Build Coastguard Worker // class type declaration to avoid pulling in a long chain of headers is 103*6777b538SAndroid Build Coastguard Worker // acceptable when your XXX_messages.h header is being included by the 104*6777b538SAndroid Build Coastguard Worker // message sending caller's code, but not when the YYY_message_generator.c 105*6777b538SAndroid Build Coastguard Worker // is building the messages. In addition, due to the multiple inclusion 106*6777b538SAndroid Build Coastguard Worker // restriction, these type ought to be guarded. Follow a convention like: 107*6777b538SAndroid Build Coastguard Worker // #ifndef SOME_GUARD_MACRO 108*6777b538SAndroid Build Coastguard Worker // #define SOME_GUARD_MACRO 109*6777b538SAndroid Build Coastguard Worker // class some_class; // One incomplete class declaration 110*6777b538SAndroid Build Coastguard Worker // class_some_other_class; // Another incomplete class declaration 111*6777b538SAndroid Build Coastguard Worker // #endif // SOME_GUARD_MACRO 112*6777b538SAndroid Build Coastguard Worker // #ifdef IPC_MESSAGE_IMPL 113*6777b538SAndroid Build Coastguard Worker // #include "path/to/some_class.h" // Full class declaration 114*6777b538SAndroid Build Coastguard Worker // #include "path/to/some_other_class.h" // Full class declaration 115*6777b538SAndroid Build Coastguard Worker // #endif // IPC_MESSAGE_IMPL 116*6777b538SAndroid Build Coastguard Worker // (.. IPC macros using some_class and some_other_class ...) 117*6777b538SAndroid Build Coastguard Worker // 118*6777b538SAndroid Build Coastguard Worker // Macro Invocations 119*6777b538SAndroid Build Coastguard Worker // 120*6777b538SAndroid Build Coastguard Worker // You will use IPC message macro invocations for three things: 121*6777b538SAndroid Build Coastguard Worker // - New struct definitions for IPC 122*6777b538SAndroid Build Coastguard Worker // - Registering existing struct and enum definitions with IPC 123*6777b538SAndroid Build Coastguard Worker // - Defining the messages themselves 124*6777b538SAndroid Build Coastguard Worker // 125*6777b538SAndroid Build Coastguard Worker // New structs are defined with IPC_STRUCT_BEGIN(), IPC_STRUCT_MEMBER(), 126*6777b538SAndroid Build Coastguard Worker // IPC_STRUCT_END() family of macros. These cause the XXX_messages.h 127*6777b538SAndroid Build Coastguard Worker // to proclaim equivalent struct declarations for use by callers, as well 128*6777b538SAndroid Build Coastguard Worker // as later registering the type with the message generation. Note that 129*6777b538SAndroid Build Coastguard Worker // IPC_STRUCT_MEMBER() is only permitted inside matching calls to 130*6777b538SAndroid Build Coastguard Worker // IPC_STRUCT_BEGIN() / IPC_STRUCT_END(). There is also an 131*6777b538SAndroid Build Coastguard Worker // IPC_STRUCT_BEGIN_WITH_PARENT(), which behaves like IPC_STRUCT_BEGIN(), 132*6777b538SAndroid Build Coastguard Worker // but also accommodates structs that inherit from other structs. 133*6777b538SAndroid Build Coastguard Worker // 134*6777b538SAndroid Build Coastguard Worker // Externally-defined structs are registered with IPC_STRUCT_TRAITS_BEGIN(), 135*6777b538SAndroid Build Coastguard Worker // IPC_STRUCT_TRAITS_MEMBER(), and IPC_STRUCT_TRAITS_END() macros. These 136*6777b538SAndroid Build Coastguard Worker // cause registration of the types with message generation only. 137*6777b538SAndroid Build Coastguard Worker // There's also IPC_STRUCT_TRAITS_PARENT, which is used to register a parent 138*6777b538SAndroid Build Coastguard Worker // class (whose own traits are already defined). Note that 139*6777b538SAndroid Build Coastguard Worker // IPC_STRUCT_TRAITS_MEMBER() and IPC_STRUCT_TRAITS_PARENT are only permitted 140*6777b538SAndroid Build Coastguard Worker // inside matching calls to IPC_STRUCT_TRAITS_BEGIN() / 141*6777b538SAndroid Build Coastguard Worker // IPC_STRUCT_TRAITS_END(). 142*6777b538SAndroid Build Coastguard Worker // 143*6777b538SAndroid Build Coastguard Worker // Enum types are registered with a single IPC_ENUM_TRAITS_VALIDATE() macro. 144*6777b538SAndroid Build Coastguard Worker // There is no need to enumerate each value to the IPC mechanism. Instead, 145*6777b538SAndroid Build Coastguard Worker // pass an expression in terms of the parameter |value| to provide 146*6777b538SAndroid Build Coastguard Worker // range-checking. For convenience, the IPC_ENUM_TRAITS() is provided which 147*6777b538SAndroid Build Coastguard Worker // performs no checking, passing everything including out-of-range values. 148*6777b538SAndroid Build Coastguard Worker // Its use is discouraged. The IPC_ENUM_TRAITS_MAX_VALUE() macro can be used 149*6777b538SAndroid Build Coastguard Worker // for the typical case where the enum must be in the range 0..maxvalue 150*6777b538SAndroid Build Coastguard Worker // inclusive. The IPC_ENUM_TRAITS_MIN_MAX_VALUE() macro can be used for the 151*6777b538SAndroid Build Coastguard Worker // less typical case where the enum must be in the range minvalue..maxvalue 152*6777b538SAndroid Build Coastguard Worker // inclusive. 153*6777b538SAndroid Build Coastguard Worker // 154*6777b538SAndroid Build Coastguard Worker // Do not place semicolons following these IPC_ macro invocations. There 155*6777b538SAndroid Build Coastguard Worker // is no reason to expect that their expansion corresponds one-to-one with 156*6777b538SAndroid Build Coastguard Worker // C++ statements. 157*6777b538SAndroid Build Coastguard Worker // 158*6777b538SAndroid Build Coastguard Worker // Once the types have been declared / registered, message definitions follow. 159*6777b538SAndroid Build Coastguard Worker // "Sync" messages are just synchronous calls, the Send() call doesn't return 160*6777b538SAndroid Build Coastguard Worker // until a reply comes back. To declare a sync message, use the IPC_SYNC_ 161*6777b538SAndroid Build Coastguard Worker // macros. The numbers at the end show how many input/output parameters there 162*6777b538SAndroid Build Coastguard Worker // are (i.e. 1_2 is 1 in, 2 out). Input parameters are first, followed by 163*6777b538SAndroid Build Coastguard Worker // output parameters. The caller uses Send([route id, ], in1, &out1, &out2). 164*6777b538SAndroid Build Coastguard Worker // The receiver's handler function will be 165*6777b538SAndroid Build Coastguard Worker // void OnSyncMessageName(const type1& in1, type2* out1, type3* out2) 166*6777b538SAndroid Build Coastguard Worker // 167*6777b538SAndroid Build Coastguard Worker // A caller can also send a synchronous message, while the receiver can respond 168*6777b538SAndroid Build Coastguard Worker // at a later time. This is transparent from the sender's side. The receiver 169*6777b538SAndroid Build Coastguard Worker // needs to use a different handler that takes in a IPC::Message* as the output 170*6777b538SAndroid Build Coastguard Worker // type, stash the message, and when it has the data it can Send the message. 171*6777b538SAndroid Build Coastguard Worker // 172*6777b538SAndroid Build Coastguard Worker // Use the IPC_MESSAGE_HANDLER_DELAY_REPLY macro instead of IPC_MESSAGE_HANDLER 173*6777b538SAndroid Build Coastguard Worker // IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_SyncMessageName, 174*6777b538SAndroid Build Coastguard Worker // OnSyncMessageName) 175*6777b538SAndroid Build Coastguard Worker // Unlike IPC_MESSAGE_HANDLER which works with IPC_BEGIN_MESSAGE_MAP as well as 176*6777b538SAndroid Build Coastguard Worker // IPC_BEGIN_MESSAGE_MAP_WITH_PARAM, one needs to use 177*6777b538SAndroid Build Coastguard Worker // IPC_MESSAGE_HANDLER_WITH_PARAM_DELAY_REPLY to properly handle the param. 178*6777b538SAndroid Build Coastguard Worker // 179*6777b538SAndroid Build Coastguard Worker // The handler function will look like: 180*6777b538SAndroid Build Coastguard Worker // void OnSyncMessageName(const type1& in1, IPC::Message* reply_msg); 181*6777b538SAndroid Build Coastguard Worker // 182*6777b538SAndroid Build Coastguard Worker // Receiver stashes the IPC::Message* pointer, and when it's ready, it does: 183*6777b538SAndroid Build Coastguard Worker // ViewHostMsg_SyncMessageName::WriteReplyParams(reply_msg, out1, out2); 184*6777b538SAndroid Build Coastguard Worker // Send(reply_msg); 185*6777b538SAndroid Build Coastguard Worker 186*6777b538SAndroid Build Coastguard Worker // Files that want to export their ipc messages should do 187*6777b538SAndroid Build Coastguard Worker // #undef IPC_MESSAGE_EXPORT 188*6777b538SAndroid Build Coastguard Worker // #define IPC_MESSAGE_EXPORT VISIBILITY_MACRO 189*6777b538SAndroid Build Coastguard Worker // after including this header, but before using any of the macros below. 190*6777b538SAndroid Build Coastguard Worker // (This needs to be before the include guard.) 191*6777b538SAndroid Build Coastguard Worker #undef IPC_MESSAGE_EXPORT 192*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_EXPORT 193*6777b538SAndroid Build Coastguard Worker 194*6777b538SAndroid Build Coastguard Worker #ifndef IPC_IPC_MESSAGE_MACROS_H_ 195*6777b538SAndroid Build Coastguard Worker #define IPC_IPC_MESSAGE_MACROS_H_ 196*6777b538SAndroid Build Coastguard Worker 197*6777b538SAndroid Build Coastguard Worker #include <stdint.h> 198*6777b538SAndroid Build Coastguard Worker 199*6777b538SAndroid Build Coastguard Worker #include <tuple> 200*6777b538SAndroid Build Coastguard Worker 201*6777b538SAndroid Build Coastguard Worker #include "base/export_template.h" 202*6777b538SAndroid Build Coastguard Worker #include "base/hash/md5_constexpr.h" 203*6777b538SAndroid Build Coastguard Worker #include "base/notreached.h" 204*6777b538SAndroid Build Coastguard Worker #include "base/task/common/task_annotator.h" 205*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_message_templates.h" 206*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_message_utils.h" 207*6777b538SAndroid Build Coastguard Worker #include "ipc/param_traits_macros.h" 208*6777b538SAndroid Build Coastguard Worker 209*6777b538SAndroid Build Coastguard Worker // Convenience macro for defining structs without inheritance. Should not need 210*6777b538SAndroid Build Coastguard Worker // to be subsequently redefined. 211*6777b538SAndroid Build Coastguard Worker #define IPC_STRUCT_BEGIN(struct_name) \ 212*6777b538SAndroid Build Coastguard Worker IPC_STRUCT_BEGIN_WITH_PARENT(struct_name, IPC::NoParams) 213*6777b538SAndroid Build Coastguard Worker 214*6777b538SAndroid Build Coastguard Worker // Macros for defining structs. Will be subsequently redefined. 215*6777b538SAndroid Build Coastguard Worker #define IPC_STRUCT_BEGIN_WITH_PARENT(struct_name, parent) \ 216*6777b538SAndroid Build Coastguard Worker struct struct_name; \ 217*6777b538SAndroid Build Coastguard Worker IPC_STRUCT_TRAITS_BEGIN(struct_name) \ 218*6777b538SAndroid Build Coastguard Worker IPC_STRUCT_TRAITS_END() \ 219*6777b538SAndroid Build Coastguard Worker struct IPC_MESSAGE_EXPORT struct_name : parent { \ 220*6777b538SAndroid Build Coastguard Worker struct_name(); 221*6777b538SAndroid Build Coastguard Worker // Optional variadic parameters specify the default value for this struct 222*6777b538SAndroid Build Coastguard Worker // member. They are passed through to the constructor for |type|. 223*6777b538SAndroid Build Coastguard Worker #define IPC_STRUCT_MEMBER(type, name, ...) type name; 224*6777b538SAndroid Build Coastguard Worker #define IPC_STRUCT_END() }; 225*6777b538SAndroid Build Coastguard Worker 226*6777b538SAndroid Build Coastguard Worker // Message macros collect arguments and funnel them into the common message 227*6777b538SAndroid Build Coastguard Worker // generation macro. These should never be redefined. 228*6777b538SAndroid Build Coastguard Worker 229*6777b538SAndroid Build Coastguard Worker // Asynchronous messages have only in parameters and are declared like: 230*6777b538SAndroid Build Coastguard Worker // IPC_MESSAGE_CONTROL(FooMsg, int, float) 231*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_CONTROL(msg_class, ...) \ 232*6777b538SAndroid Build Coastguard Worker IPC_MESSAGE_DECL(msg_class, CONTROL, IPC_TUPLE(__VA_ARGS__), void) 233*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_ROUTED(msg_class, ...) \ 234*6777b538SAndroid Build Coastguard Worker IPC_MESSAGE_DECL(msg_class, ROUTED, IPC_TUPLE(__VA_ARGS__), void) 235*6777b538SAndroid Build Coastguard Worker 236*6777b538SAndroid Build Coastguard Worker // Synchronous messages have both in and out parameters, so the lists need to 237*6777b538SAndroid Build Coastguard Worker // be parenthesized to disambiguate: 238*6777b538SAndroid Build Coastguard Worker // IPC_SYNC_MESSAGE_CONTROL(BarMsg, (int, int), (bool)) 239*6777b538SAndroid Build Coastguard Worker // 240*6777b538SAndroid Build Coastguard Worker // Implementation detail: The parentheses supplied by the caller for 241*6777b538SAndroid Build Coastguard Worker // disambiguation are also used to trigger the IPC_TUPLE invocations below, 242*6777b538SAndroid Build Coastguard Worker // so "IPC_TUPLE in" and "IPC_TUPLE out" are intentional. 243*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_CONTROL(msg_class, in, out) \ 244*6777b538SAndroid Build Coastguard Worker IPC_MESSAGE_DECL(msg_class, CONTROL, IPC_TUPLE in, IPC_TUPLE out) 245*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_ROUTED(msg_class, in, out) \ 246*6777b538SAndroid Build Coastguard Worker IPC_MESSAGE_DECL(msg_class, ROUTED, IPC_TUPLE in, IPC_TUPLE out) 247*6777b538SAndroid Build Coastguard Worker 248*6777b538SAndroid Build Coastguard Worker #define IPC_TUPLE(...) IPC::CheckedTuple<__VA_ARGS__>::Tuple 249*6777b538SAndroid Build Coastguard Worker 250*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_DECL(msg_name, kind, in_tuple, out_tuple) \ 251*6777b538SAndroid Build Coastguard Worker struct IPC_MESSAGE_EXPORT msg_name##_Meta { \ 252*6777b538SAndroid Build Coastguard Worker using InTuple = in_tuple; \ 253*6777b538SAndroid Build Coastguard Worker using OutTuple = out_tuple; \ 254*6777b538SAndroid Build Coastguard Worker enum { ID = IPC_MESSAGE_ID() }; \ 255*6777b538SAndroid Build Coastguard Worker static const IPC::MessageKind kKind = IPC::MessageKind::kind; \ 256*6777b538SAndroid Build Coastguard Worker static const char kName[]; \ 257*6777b538SAndroid Build Coastguard Worker }; \ 258*6777b538SAndroid Build Coastguard Worker extern template class EXPORT_TEMPLATE_DECLARE(IPC_MESSAGE_EXPORT) \ 259*6777b538SAndroid Build Coastguard Worker IPC::MessageT<msg_name##_Meta>; \ 260*6777b538SAndroid Build Coastguard Worker using msg_name = IPC::MessageT<msg_name##_Meta>; \ 261*6777b538SAndroid Build Coastguard Worker IPC_MESSAGE_EXTRA(msg_name) 262*6777b538SAndroid Build Coastguard Worker 263*6777b538SAndroid Build Coastguard Worker #if defined(IPC_MESSAGE_IMPL) 264*6777b538SAndroid Build Coastguard Worker 265*6777b538SAndroid Build Coastguard Worker // "Implementation" inclusion provides the explicit template definition 266*6777b538SAndroid Build Coastguard Worker // for msg_name. 267*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_EXTRA(msg_name) \ 268*6777b538SAndroid Build Coastguard Worker const char msg_name##_Meta::kName[] = #msg_name; \ 269*6777b538SAndroid Build Coastguard Worker IPC_MESSAGE_DEFINE_KIND(msg_name) \ 270*6777b538SAndroid Build Coastguard Worker template class EXPORT_TEMPLATE_DEFINE(IPC_MESSAGE_EXPORT) \ 271*6777b538SAndroid Build Coastguard Worker IPC::MessageT<msg_name##_Meta>; 272*6777b538SAndroid Build Coastguard Worker 273*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_DEFINE_KIND(msg_name) \ 274*6777b538SAndroid Build Coastguard Worker const IPC::MessageKind msg_name##_Meta::kKind; 275*6777b538SAndroid Build Coastguard Worker 276*6777b538SAndroid Build Coastguard Worker #elif defined(IPC_MESSAGE_MACROS_LOG_ENABLED) 277*6777b538SAndroid Build Coastguard Worker 278*6777b538SAndroid Build Coastguard Worker #ifndef IPC_LOG_TABLE_ADD_ENTRY 279*6777b538SAndroid Build Coastguard Worker #error You need to define IPC_LOG_TABLE_ADD_ENTRY(msg_id, logger) 280*6777b538SAndroid Build Coastguard Worker #endif 281*6777b538SAndroid Build Coastguard Worker 282*6777b538SAndroid Build Coastguard Worker // "Log table" inclusion produces extra logging registration code. 283*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_EXTRA(msg_name) \ 284*6777b538SAndroid Build Coastguard Worker class LoggerRegisterHelper##msg_name { \ 285*6777b538SAndroid Build Coastguard Worker public: \ 286*6777b538SAndroid Build Coastguard Worker LoggerRegisterHelper##msg_name() { \ 287*6777b538SAndroid Build Coastguard Worker const uint32_t msg_id = static_cast<uint32_t>(msg_name::ID); \ 288*6777b538SAndroid Build Coastguard Worker IPC_LOG_TABLE_ADD_ENTRY(msg_id, msg_name::Log); \ 289*6777b538SAndroid Build Coastguard Worker } \ 290*6777b538SAndroid Build Coastguard Worker }; \ 291*6777b538SAndroid Build Coastguard Worker LoggerRegisterHelper##msg_name g_LoggerRegisterHelper##msg_name; 292*6777b538SAndroid Build Coastguard Worker 293*6777b538SAndroid Build Coastguard Worker #else 294*6777b538SAndroid Build Coastguard Worker 295*6777b538SAndroid Build Coastguard Worker // Normal inclusion produces nothing extra. 296*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_EXTRA(msg_name) 297*6777b538SAndroid Build Coastguard Worker 298*6777b538SAndroid Build Coastguard Worker #endif // defined(IPC_MESSAGE_IMPL) 299*6777b538SAndroid Build Coastguard Worker 300*6777b538SAndroid Build Coastguard Worker // Message IDs 301*6777b538SAndroid Build Coastguard Worker // Note: we currently use __LINE__ to give unique IDs to messages within 302*6777b538SAndroid Build Coastguard Worker // a file. They're globally unique since each file defines its own 303*6777b538SAndroid Build Coastguard Worker // IPC_MESSAGE_START. 304*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_ID() ((IPC_MESSAGE_START << 16) + __LINE__) 305*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_ID_CLASS(id) ((id) >> 16) 306*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_ID_LINE(id) ((id) & 0xffff) 307*6777b538SAndroid Build Coastguard Worker 308*6777b538SAndroid Build Coastguard Worker // Message crackers and handlers. Usage: 309*6777b538SAndroid Build Coastguard Worker // 310*6777b538SAndroid Build Coastguard Worker // bool MyClass::OnMessageReceived(const IPC::Message& msg) { 311*6777b538SAndroid Build Coastguard Worker // bool handled = true; 312*6777b538SAndroid Build Coastguard Worker // IPC_BEGIN_MESSAGE_MAP(MyClass, msg) 313*6777b538SAndroid Build Coastguard Worker // IPC_MESSAGE_HANDLER(MsgClassOne, OnMsgClassOne) 314*6777b538SAndroid Build Coastguard Worker // ...more handlers here ... 315*6777b538SAndroid Build Coastguard Worker // IPC_MESSAGE_HANDLER(MsgClassTen, OnMsgClassTen) 316*6777b538SAndroid Build Coastguard Worker // IPC_MESSAGE_UNHANDLED(handled = false) 317*6777b538SAndroid Build Coastguard Worker // IPC_END_MESSAGE_MAP() 318*6777b538SAndroid Build Coastguard Worker // return handled; 319*6777b538SAndroid Build Coastguard Worker // } 320*6777b538SAndroid Build Coastguard Worker 321*6777b538SAndroid Build Coastguard Worker #define IPC_TASK_ANNOTATOR_STRINGIFY(s) #s 322*6777b538SAndroid Build Coastguard Worker 323*6777b538SAndroid Build Coastguard Worker // A macro to be used from within the IPC_MESSAGE_FORWARD macros, for providing 324*6777b538SAndroid Build Coastguard Worker // the IPC message context to the TaskAnnotator. This allows posted tasks to be 325*6777b538SAndroid Build Coastguard Worker // associated with the incoming IPC message that caused them to be posted. 326*6777b538SAndroid Build Coastguard Worker #define IPC_TASK_ANNOTATOR_CONTEXT(msg_class) \ 327*6777b538SAndroid Build Coastguard Worker static constexpr uint32_t kMessageHash = \ 328*6777b538SAndroid Build Coastguard Worker base::MD5Hash32Constexpr(IPC_TASK_ANNOTATOR_STRINGIFY(msg_class)); \ 329*6777b538SAndroid Build Coastguard Worker base::TaskAnnotator::ScopedSetIpcHash scoped_ipc_hash(kMessageHash); 330*6777b538SAndroid Build Coastguard Worker 331*6777b538SAndroid Build Coastguard Worker #define IPC_BEGIN_MESSAGE_MAP(class_name, msg) \ 332*6777b538SAndroid Build Coastguard Worker { \ 333*6777b538SAndroid Build Coastguard Worker using _IpcMessageHandlerClass [[maybe_unused]] = class_name; \ 334*6777b538SAndroid Build Coastguard Worker [[maybe_unused]] void* param__ = nullptr; \ 335*6777b538SAndroid Build Coastguard Worker const IPC::Message& ipc_message__ = msg; \ 336*6777b538SAndroid Build Coastguard Worker switch (ipc_message__.type()) { 337*6777b538SAndroid Build Coastguard Worker 338*6777b538SAndroid Build Coastguard Worker #define IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(class_name, msg, param) \ 339*6777b538SAndroid Build Coastguard Worker { \ 340*6777b538SAndroid Build Coastguard Worker using _IpcMessageHandlerClass [[maybe_unused]] = class_name; \ 341*6777b538SAndroid Build Coastguard Worker decltype(param) param__ = param; \ 342*6777b538SAndroid Build Coastguard Worker const IPC::Message& ipc_message__ = msg; \ 343*6777b538SAndroid Build Coastguard Worker switch (ipc_message__.type()) { 344*6777b538SAndroid Build Coastguard Worker 345*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_FORWARD(msg_class, obj, member_func) \ 346*6777b538SAndroid Build Coastguard Worker case msg_class::ID: { \ 347*6777b538SAndroid Build Coastguard Worker IPC_TASK_ANNOTATOR_CONTEXT(msg_class) \ 348*6777b538SAndroid Build Coastguard Worker if (!msg_class::Dispatch(&ipc_message__, obj, this, param__, \ 349*6777b538SAndroid Build Coastguard Worker &member_func)) \ 350*6777b538SAndroid Build Coastguard Worker ipc_message__.set_dispatch_error(); \ 351*6777b538SAndroid Build Coastguard Worker } break; 352*6777b538SAndroid Build Coastguard Worker 353*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_HANDLER(msg_class, member_func) \ 354*6777b538SAndroid Build Coastguard Worker IPC_MESSAGE_FORWARD(msg_class, this, _IpcMessageHandlerClass::member_func) 355*6777b538SAndroid Build Coastguard Worker 356*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_FORWARD_DELAY_REPLY(msg_class, obj, member_func) \ 357*6777b538SAndroid Build Coastguard Worker case msg_class::ID: { \ 358*6777b538SAndroid Build Coastguard Worker IPC_TASK_ANNOTATOR_CONTEXT(msg_class) \ 359*6777b538SAndroid Build Coastguard Worker if (!msg_class::DispatchDelayReply(&ipc_message__, obj, param__, \ 360*6777b538SAndroid Build Coastguard Worker &member_func)) \ 361*6777b538SAndroid Build Coastguard Worker ipc_message__.set_dispatch_error(); \ 362*6777b538SAndroid Build Coastguard Worker } break; 363*6777b538SAndroid Build Coastguard Worker 364*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_HANDLER_DELAY_REPLY(msg_class, member_func) \ 365*6777b538SAndroid Build Coastguard Worker IPC_MESSAGE_FORWARD_DELAY_REPLY(msg_class, this, \ 366*6777b538SAndroid Build Coastguard Worker _IpcMessageHandlerClass::member_func) 367*6777b538SAndroid Build Coastguard Worker 368*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_FORWARD_WITH_PARAM_DELAY_REPLY(msg_class, obj, \ 369*6777b538SAndroid Build Coastguard Worker member_func) \ 370*6777b538SAndroid Build Coastguard Worker case msg_class::ID: { \ 371*6777b538SAndroid Build Coastguard Worker IPC_TASK_ANNOTATOR_CONTEXT(msg_class) \ 372*6777b538SAndroid Build Coastguard Worker if (!msg_class::DispatchWithParamDelayReply(&ipc_message__, obj, \ 373*6777b538SAndroid Build Coastguard Worker param__, &member_func)) \ 374*6777b538SAndroid Build Coastguard Worker ipc_message__.set_dispatch_error(); \ 375*6777b538SAndroid Build Coastguard Worker } break; 376*6777b538SAndroid Build Coastguard Worker 377*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_HANDLER_WITH_PARAM_DELAY_REPLY(msg_class, member_func) \ 378*6777b538SAndroid Build Coastguard Worker IPC_MESSAGE_FORWARD_WITH_PARAM_DELAY_REPLY( \ 379*6777b538SAndroid Build Coastguard Worker msg_class, this, _IpcMessageHandlerClass::member_func) 380*6777b538SAndroid Build Coastguard Worker 381*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_HANDLER_GENERIC(msg_class, code) \ 382*6777b538SAndroid Build Coastguard Worker case msg_class::ID: { \ 383*6777b538SAndroid Build Coastguard Worker IPC_TASK_ANNOTATOR_CONTEXT(msg_class) { code; } \ 384*6777b538SAndroid Build Coastguard Worker } break; 385*6777b538SAndroid Build Coastguard Worker 386*6777b538SAndroid Build Coastguard Worker #define IPC_REPLY_HANDLER(func) \ 387*6777b538SAndroid Build Coastguard Worker case IPC_REPLY_ID: { \ 388*6777b538SAndroid Build Coastguard Worker func(ipc_message__); \ 389*6777b538SAndroid Build Coastguard Worker } \ 390*6777b538SAndroid Build Coastguard Worker break; 391*6777b538SAndroid Build Coastguard Worker 392*6777b538SAndroid Build Coastguard Worker 393*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_UNHANDLED(code) \ 394*6777b538SAndroid Build Coastguard Worker default: { \ 395*6777b538SAndroid Build Coastguard Worker code; \ 396*6777b538SAndroid Build Coastguard Worker } \ 397*6777b538SAndroid Build Coastguard Worker break; 398*6777b538SAndroid Build Coastguard Worker 399*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_UNHANDLED_ERROR() \ 400*6777b538SAndroid Build Coastguard Worker IPC_MESSAGE_UNHANDLED(NOTREACHED() << \ 401*6777b538SAndroid Build Coastguard Worker "Invalid message with type = " << \ 402*6777b538SAndroid Build Coastguard Worker ipc_message__.type()) 403*6777b538SAndroid Build Coastguard Worker 404*6777b538SAndroid Build Coastguard Worker #define IPC_END_MESSAGE_MAP() \ 405*6777b538SAndroid Build Coastguard Worker } \ 406*6777b538SAndroid Build Coastguard Worker } 407*6777b538SAndroid Build Coastguard Worker 408*6777b538SAndroid Build Coastguard Worker // This corresponds to an enum value from IPCMessageStart. 409*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_CLASS(message) IPC_MESSAGE_ID_CLASS((message).type()) 410*6777b538SAndroid Build Coastguard Worker 411*6777b538SAndroid Build Coastguard Worker // Deprecated legacy macro names. 412*6777b538SAndroid Build Coastguard Worker // TODO(mdempsky): Replace uses with generic names. 413*6777b538SAndroid Build Coastguard Worker 414*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_CONTROL0(msg) IPC_MESSAGE_CONTROL(msg) 415*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_CONTROL1(msg, a) IPC_MESSAGE_CONTROL(msg, a) 416*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_CONTROL2(msg, a, b) IPC_MESSAGE_CONTROL(msg, a, b) 417*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_CONTROL3(msg, a, b, c) IPC_MESSAGE_CONTROL(msg, a, b, c) 418*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_CONTROL4(msg, a, b, c, d) \ 419*6777b538SAndroid Build Coastguard Worker IPC_MESSAGE_CONTROL(msg, a, b, c, d) 420*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_CONTROL5(msg, a, b, c, d, e) \ 421*6777b538SAndroid Build Coastguard Worker IPC_MESSAGE_CONTROL(msg, a, b, c, d, e) 422*6777b538SAndroid Build Coastguard Worker 423*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_ROUTED0(msg) IPC_MESSAGE_ROUTED(msg) 424*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_ROUTED1(msg, a) IPC_MESSAGE_ROUTED(msg, a) 425*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_ROUTED2(msg, a, b) IPC_MESSAGE_ROUTED(msg, a, b) 426*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_ROUTED3(msg, a, b, c) IPC_MESSAGE_ROUTED(msg, a, b, c) 427*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_ROUTED4(msg, a, b, c, d) IPC_MESSAGE_ROUTED(msg, a, b, c, d) 428*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_ROUTED5(msg, a, b, c, d, e) \ 429*6777b538SAndroid Build Coastguard Worker IPC_MESSAGE_ROUTED(msg, a, b, c, d, e) 430*6777b538SAndroid Build Coastguard Worker 431*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_CONTROL0_0(msg) IPC_SYNC_MESSAGE_CONTROL(msg, (), ()) 432*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_CONTROL0_1(msg, a) \ 433*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_CONTROL(msg, (), (a)) 434*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_CONTROL0_2(msg, a, b) \ 435*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_CONTROL(msg, (), (a, b)) 436*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_CONTROL0_3(msg, a, b, c) \ 437*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_CONTROL(msg, (), (a, b, c)) 438*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_CONTROL0_4(msg, a, b, c, d) \ 439*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_CONTROL(msg, (), (a, b, c, d)) 440*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_CONTROL1_0(msg, a) \ 441*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_CONTROL(msg, (a), ()) 442*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_CONTROL1_1(msg, a, b) \ 443*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_CONTROL(msg, (a), (b)) 444*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_CONTROL1_2(msg, a, b, c) \ 445*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_CONTROL(msg, (a), (b, c)) 446*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_CONTROL1_3(msg, a, b, c, d) \ 447*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_CONTROL(msg, (a), (b, c, d)) 448*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_CONTROL1_4(msg, a, b, c, d, e) \ 449*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_CONTROL(msg, (a), (b, c, d, e)) 450*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_CONTROL2_0(msg, a, b) \ 451*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_CONTROL(msg, (a, b), ()) 452*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_CONTROL2_1(msg, a, b, c) \ 453*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_CONTROL(msg, (a, b), (c)) 454*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_CONTROL2_2(msg, a, b, c, d) \ 455*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_CONTROL(msg, (a, b), (c, d)) 456*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_CONTROL2_3(msg, a, b, c, d, e) \ 457*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_CONTROL(msg, (a, b), (c, d, e)) 458*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_CONTROL2_4(msg, a, b, c, d, e, f) \ 459*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_CONTROL(msg, (a, b), (c, d, e, f)) 460*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_CONTROL3_0(msg, a, b, c) \ 461*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_CONTROL(msg, (a, b, c), ()) 462*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_CONTROL3_1(msg, a, b, c, d) \ 463*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_CONTROL(msg, (a, b, c), (d)) 464*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_CONTROL3_2(msg, a, b, c, d, e) \ 465*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_CONTROL(msg, (a, b, c), (d, e)) 466*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_CONTROL3_3(msg, a, b, c, d, e, f) \ 467*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_CONTROL(msg, (a, b, c), (d, e, f)) 468*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_CONTROL3_4(msg, a, b, c, d, e, f, g) \ 469*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_CONTROL(msg, (a, b, c), (d, e, f, g)) 470*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_CONTROL4_0(msg, a, b, c, d) \ 471*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_CONTROL(msg, (a, b, c, d), ()) 472*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_CONTROL4_1(msg, a, b, c, d, e) \ 473*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_CONTROL(msg, (a, b, c, d), (e)) 474*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_CONTROL4_2(msg, a, b, c, d, e, f) \ 475*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_CONTROL(msg, (a, b, c, d), (e, f)) 476*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_CONTROL4_3(msg, a, b, c, d, e, f, g) \ 477*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_CONTROL(msg, (a, b, c, d), (e, f, g)) 478*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_CONTROL4_4(msg, a, b, c, d, e, f, g, h) \ 479*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_CONTROL(msg, (a, b, c, d), (e, f, g, h)) 480*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_CONTROL5_0(msg, a, b, c, d, e) \ 481*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_CONTROL(msg, (a, b, c, d, e), ()) 482*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_CONTROL5_1(msg, a, b, c, d, e, f) \ 483*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_CONTROL(msg, (a, b, c, d, e), (f)) 484*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_CONTROL5_2(msg, a, b, c, d, e, f, g) \ 485*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_CONTROL(msg, (a, b, c, d, e), (f, g)) 486*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_CONTROL5_3(msg, a, b, c, d, e, f, g, h) \ 487*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_CONTROL(msg, (a, b, c, d, e), (f, g, h)) 488*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_CONTROL5_4(msg, a, b, c, d, e, f, g, h, i) \ 489*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_CONTROL(msg, (a, b, c, d, e), (f, g, h, i)) 490*6777b538SAndroid Build Coastguard Worker 491*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_ROUTED0_0(msg) IPC_SYNC_MESSAGE_ROUTED(msg, (), ()) 492*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_ROUTED0_1(msg, a) IPC_SYNC_MESSAGE_ROUTED(msg, (), (a)) 493*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_ROUTED0_2(msg, a, b) \ 494*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_ROUTED(msg, (), (a, b)) 495*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_ROUTED0_3(msg, a, b, c) \ 496*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_ROUTED(msg, (), (a, b, c)) 497*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_ROUTED0_4(msg, a, b, c, d) \ 498*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_ROUTED(msg, (), (a, b, c, d)) 499*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_ROUTED1_0(msg, a) IPC_SYNC_MESSAGE_ROUTED(msg, (a), ()) 500*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_ROUTED1_1(msg, a, b) \ 501*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_ROUTED(msg, (a), (b)) 502*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_ROUTED1_2(msg, a, b, c) \ 503*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_ROUTED(msg, (a), (b, c)) 504*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_ROUTED1_3(msg, a, b, c, d) \ 505*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_ROUTED(msg, (a), (b, c, d)) 506*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_ROUTED1_4(msg, a, b, c, d, e) \ 507*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_ROUTED(msg, (a), (b, c, d, e)) 508*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_ROUTED2_0(msg, a, b) \ 509*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_ROUTED(msg, (a, b), ()) 510*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_ROUTED2_1(msg, a, b, c) \ 511*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_ROUTED(msg, (a, b), (c)) 512*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_ROUTED2_2(msg, a, b, c, d) \ 513*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_ROUTED(msg, (a, b), (c, d)) 514*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_ROUTED2_3(msg, a, b, c, d, e) \ 515*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_ROUTED(msg, (a, b), (c, d, e)) 516*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_ROUTED2_4(msg, a, b, c, d, e, f) \ 517*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_ROUTED(msg, (a, b), (c, d, e, f)) 518*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_ROUTED3_0(msg, a, b, c) \ 519*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_ROUTED(msg, (a, b, c), ()) 520*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_ROUTED3_1(msg, a, b, c, d) \ 521*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_ROUTED(msg, (a, b, c), (d)) 522*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_ROUTED3_2(msg, a, b, c, d, e) \ 523*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_ROUTED(msg, (a, b, c), (d, e)) 524*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_ROUTED3_3(msg, a, b, c, d, e, f) \ 525*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_ROUTED(msg, (a, b, c), (d, e, f)) 526*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_ROUTED3_4(msg, a, b, c, d, e, f, g) \ 527*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_ROUTED(msg, (a, b, c), (d, e, f, g)) 528*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_ROUTED3_5(msg, a, b, c, d, e, f, g, h) \ 529*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_ROUTED(msg, (a, b, c), (d, e, f, g, h)) 530*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_ROUTED4_0(msg, a, b, c, d) \ 531*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_ROUTED(msg, (a, b, c, d), ()) 532*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_ROUTED4_1(msg, a, b, c, d, e) \ 533*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_ROUTED(msg, (a, b, c, d), (e)) 534*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_ROUTED4_2(msg, a, b, c, d, e, f) \ 535*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_ROUTED(msg, (a, b, c, d), (e, f)) 536*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_ROUTED4_3(msg, a, b, c, d, e, f, g) \ 537*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_ROUTED(msg, (a, b, c, d), (e, f, g)) 538*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_ROUTED4_4(msg, a, b, c, d, e, f, g, h) \ 539*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_ROUTED(msg, (a, b, c, d), (e, f, g, h)) 540*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_ROUTED5_0(msg, a, b, c, d, e) \ 541*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_ROUTED(msg, (a, b, c, d, e), ()) 542*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_ROUTED5_1(msg, a, b, c, d, e, f) \ 543*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_ROUTED(msg, (a, b, c, d, e), (f)) 544*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_ROUTED5_2(msg, a, b, c, d, e, f, g) \ 545*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_ROUTED(msg, (a, b, c, d, e), (f, g)) 546*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_ROUTED5_3(msg, a, b, c, d, e, f, g, h) \ 547*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_ROUTED(msg, (a, b, c, d, e), (f, g, h)) 548*6777b538SAndroid Build Coastguard Worker #define IPC_SYNC_MESSAGE_ROUTED5_4(msg, a, b, c, d, e, f, g, h, i) \ 549*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_ROUTED(msg, (a, b, c, d, e), (f, g, h, i)) 550*6777b538SAndroid Build Coastguard Worker 551*6777b538SAndroid Build Coastguard Worker #endif // IPC_IPC_MESSAGE_MACROS_H_ 552*6777b538SAndroid Build Coastguard Worker 553*6777b538SAndroid Build Coastguard Worker // Clean up IPC_MESSAGE_START in this unguarded section so that the 554*6777b538SAndroid Build Coastguard Worker // XXX_messages.h files need not do so themselves. This makes the 555*6777b538SAndroid Build Coastguard Worker // XXX_messages.h files easier to write. 556*6777b538SAndroid Build Coastguard Worker #undef IPC_MESSAGE_START 557