xref: /aosp_15_r20/external/cronet/ipc/ipc_logging.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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 #include "ipc/ipc_logging.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include "base/task/single_thread_task_runner.h"
8*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IPC_MESSAGE_LOG_ENABLED)
11*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_MACROS_LOG_ENABLED
12*6777b538SAndroid Build Coastguard Worker #endif
13*6777b538SAndroid Build Coastguard Worker 
14*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
15*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
16*6777b538SAndroid Build Coastguard Worker 
17*6777b538SAndroid Build Coastguard Worker #include "base/command_line.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/functional/bind.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback_helpers.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/location.h"
21*6777b538SAndroid Build Coastguard Worker #include "base/logging.h"
22*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_number_conversions.h"
23*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_util.h"
24*6777b538SAndroid Build Coastguard Worker #include "base/strings/stringprintf.h"
25*6777b538SAndroid Build Coastguard Worker #include "base/threading/thread.h"
26*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
27*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
28*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_message_utils.h"
29*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_sender.h"
30*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_sync_message.h"
31*6777b538SAndroid Build Coastguard Worker 
32*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_POSIX)
33*6777b538SAndroid Build Coastguard Worker #include <unistd.h>
34*6777b538SAndroid Build Coastguard Worker #endif
35*6777b538SAndroid Build Coastguard Worker 
36*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IPC_MESSAGE_LOG_ENABLED)
37*6777b538SAndroid Build Coastguard Worker 
38*6777b538SAndroid Build Coastguard Worker using base::Time;
39*6777b538SAndroid Build Coastguard Worker 
40*6777b538SAndroid Build Coastguard Worker namespace IPC {
41*6777b538SAndroid Build Coastguard Worker 
42*6777b538SAndroid Build Coastguard Worker const int kLogSendDelayMs = 100;
43*6777b538SAndroid Build Coastguard Worker 
44*6777b538SAndroid Build Coastguard Worker // We use a pointer to the function table to avoid any linker dependencies on
45*6777b538SAndroid Build Coastguard Worker // all the traits used as IPC message parameters.
46*6777b538SAndroid Build Coastguard Worker LogFunctionMap* Logging::log_function_map_;
47*6777b538SAndroid Build Coastguard Worker 
Logging()48*6777b538SAndroid Build Coastguard Worker Logging::Logging()
49*6777b538SAndroid Build Coastguard Worker     : enabled_(false),
50*6777b538SAndroid Build Coastguard Worker       enabled_on_stderr_(false),
51*6777b538SAndroid Build Coastguard Worker       enabled_color_(false),
52*6777b538SAndroid Build Coastguard Worker       queue_invoke_later_pending_(false),
53*6777b538SAndroid Build Coastguard Worker       sender_(nullptr),
54*6777b538SAndroid Build Coastguard Worker       main_thread_(base::SingleThreadTaskRunner::GetCurrentDefault()),
55*6777b538SAndroid Build Coastguard Worker       consumer_(nullptr) {
56*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
57*6777b538SAndroid Build Coastguard Worker   // getenv triggers an unsafe warning. Simply check how big of a buffer
58*6777b538SAndroid Build Coastguard Worker   // would be needed to fetch the value to see if the enviornment variable is
59*6777b538SAndroid Build Coastguard Worker   // set.
60*6777b538SAndroid Build Coastguard Worker   size_t requiredSize = 0;
61*6777b538SAndroid Build Coastguard Worker   getenv_s(&requiredSize, NULL, 0, "CHROME_IPC_LOGGING");
62*6777b538SAndroid Build Coastguard Worker   bool logging_env_var_set = (requiredSize != 0);
63*6777b538SAndroid Build Coastguard Worker   if (requiredSize <= 6) {
64*6777b538SAndroid Build Coastguard Worker     char buffer[6];
65*6777b538SAndroid Build Coastguard Worker     getenv_s(&requiredSize, buffer, sizeof(buffer), "CHROME_IPC_LOGGING");
66*6777b538SAndroid Build Coastguard Worker     if (requiredSize && !strncmp("color", buffer, 6))
67*6777b538SAndroid Build Coastguard Worker       enabled_color_ = true;
68*6777b538SAndroid Build Coastguard Worker   }
69*6777b538SAndroid Build Coastguard Worker #else   // !BUILDFLAG(IS_WIN)
70*6777b538SAndroid Build Coastguard Worker   const char* ipc_logging = getenv("CHROME_IPC_LOGGING");
71*6777b538SAndroid Build Coastguard Worker   bool logging_env_var_set = (ipc_logging != NULL);
72*6777b538SAndroid Build Coastguard Worker   if (ipc_logging && !strcmp(ipc_logging, "color"))
73*6777b538SAndroid Build Coastguard Worker     enabled_color_ = true;
74*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_WIN)
75*6777b538SAndroid Build Coastguard Worker   if (logging_env_var_set) {
76*6777b538SAndroid Build Coastguard Worker     enabled_ = true;
77*6777b538SAndroid Build Coastguard Worker     enabled_on_stderr_ = true;
78*6777b538SAndroid Build Coastguard Worker   }
79*6777b538SAndroid Build Coastguard Worker }
80*6777b538SAndroid Build Coastguard Worker 
~Logging()81*6777b538SAndroid Build Coastguard Worker Logging::~Logging() {
82*6777b538SAndroid Build Coastguard Worker }
83*6777b538SAndroid Build Coastguard Worker 
GetInstance()84*6777b538SAndroid Build Coastguard Worker Logging* Logging::GetInstance() {
85*6777b538SAndroid Build Coastguard Worker   return base::Singleton<Logging>::get();
86*6777b538SAndroid Build Coastguard Worker }
87*6777b538SAndroid Build Coastguard Worker 
SetConsumer(Consumer * consumer)88*6777b538SAndroid Build Coastguard Worker void Logging::SetConsumer(Consumer* consumer) {
89*6777b538SAndroid Build Coastguard Worker   consumer_ = consumer;
90*6777b538SAndroid Build Coastguard Worker }
91*6777b538SAndroid Build Coastguard Worker 
Enable()92*6777b538SAndroid Build Coastguard Worker void Logging::Enable() {
93*6777b538SAndroid Build Coastguard Worker   enabled_ = true;
94*6777b538SAndroid Build Coastguard Worker }
95*6777b538SAndroid Build Coastguard Worker 
Disable()96*6777b538SAndroid Build Coastguard Worker void Logging::Disable() {
97*6777b538SAndroid Build Coastguard Worker   enabled_ = false;
98*6777b538SAndroid Build Coastguard Worker }
99*6777b538SAndroid Build Coastguard Worker 
OnSendLogs()100*6777b538SAndroid Build Coastguard Worker void Logging::OnSendLogs() {
101*6777b538SAndroid Build Coastguard Worker   queue_invoke_later_pending_ = false;
102*6777b538SAndroid Build Coastguard Worker   if (!sender_)
103*6777b538SAndroid Build Coastguard Worker     return;
104*6777b538SAndroid Build Coastguard Worker 
105*6777b538SAndroid Build Coastguard Worker   Message* msg = new Message(
106*6777b538SAndroid Build Coastguard Worker       MSG_ROUTING_CONTROL, IPC_LOGGING_ID, Message::PRIORITY_NORMAL);
107*6777b538SAndroid Build Coastguard Worker   WriteParam(msg, queued_logs_);
108*6777b538SAndroid Build Coastguard Worker   queued_logs_.clear();
109*6777b538SAndroid Build Coastguard Worker   sender_->Send(msg);
110*6777b538SAndroid Build Coastguard Worker }
111*6777b538SAndroid Build Coastguard Worker 
SetIPCSender(IPC::Sender * sender)112*6777b538SAndroid Build Coastguard Worker void Logging::SetIPCSender(IPC::Sender* sender) {
113*6777b538SAndroid Build Coastguard Worker   sender_ = sender;
114*6777b538SAndroid Build Coastguard Worker }
115*6777b538SAndroid Build Coastguard Worker 
OnReceivedLoggingMessage(const Message & message)116*6777b538SAndroid Build Coastguard Worker void Logging::OnReceivedLoggingMessage(const Message& message) {
117*6777b538SAndroid Build Coastguard Worker   std::vector<LogData> data;
118*6777b538SAndroid Build Coastguard Worker   base::PickleIterator iter(message);
119*6777b538SAndroid Build Coastguard Worker   if (!ReadParam(&message, &iter, &data))
120*6777b538SAndroid Build Coastguard Worker     return;
121*6777b538SAndroid Build Coastguard Worker 
122*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < data.size(); ++i) {
123*6777b538SAndroid Build Coastguard Worker     Log(data[i]);
124*6777b538SAndroid Build Coastguard Worker   }
125*6777b538SAndroid Build Coastguard Worker }
126*6777b538SAndroid Build Coastguard Worker 
OnSendMessage(Message * message)127*6777b538SAndroid Build Coastguard Worker void Logging::OnSendMessage(Message* message) {
128*6777b538SAndroid Build Coastguard Worker   if (!Enabled())
129*6777b538SAndroid Build Coastguard Worker     return;
130*6777b538SAndroid Build Coastguard Worker 
131*6777b538SAndroid Build Coastguard Worker   if (message->is_reply()) {
132*6777b538SAndroid Build Coastguard Worker     LogData* data = message->sync_log_data();
133*6777b538SAndroid Build Coastguard Worker     if (!data)
134*6777b538SAndroid Build Coastguard Worker       return;
135*6777b538SAndroid Build Coastguard Worker 
136*6777b538SAndroid Build Coastguard Worker     // This is actually the delayed reply to a sync message.  Create a string
137*6777b538SAndroid Build Coastguard Worker     // of the output parameters, add it to the LogData that was earlier stashed
138*6777b538SAndroid Build Coastguard Worker     // with the reply, and log the result.
139*6777b538SAndroid Build Coastguard Worker     GenerateLogData(*message, data, true);
140*6777b538SAndroid Build Coastguard Worker     Log(*data);
141*6777b538SAndroid Build Coastguard Worker     delete data;
142*6777b538SAndroid Build Coastguard Worker     message->set_sync_log_data(NULL);
143*6777b538SAndroid Build Coastguard Worker   } else {
144*6777b538SAndroid Build Coastguard Worker     // If the time has already been set (i.e. by ChannelProxy), keep that time
145*6777b538SAndroid Build Coastguard Worker     // instead as it's more accurate.
146*6777b538SAndroid Build Coastguard Worker     if (!message->sent_time()) {
147*6777b538SAndroid Build Coastguard Worker       message->set_sent_time(
148*6777b538SAndroid Build Coastguard Worker           Time::Now().ToDeltaSinceWindowsEpoch().InMicroseconds());
149*6777b538SAndroid Build Coastguard Worker     }
150*6777b538SAndroid Build Coastguard Worker   }
151*6777b538SAndroid Build Coastguard Worker }
152*6777b538SAndroid Build Coastguard Worker 
OnPreDispatchMessage(const Message & message)153*6777b538SAndroid Build Coastguard Worker void Logging::OnPreDispatchMessage(const Message& message) {
154*6777b538SAndroid Build Coastguard Worker   message.set_received_time(
155*6777b538SAndroid Build Coastguard Worker       Time::Now().ToDeltaSinceWindowsEpoch().InMicroseconds());
156*6777b538SAndroid Build Coastguard Worker }
157*6777b538SAndroid Build Coastguard Worker 
OnPostDispatchMessage(const Message & message)158*6777b538SAndroid Build Coastguard Worker void Logging::OnPostDispatchMessage(const Message& message) {
159*6777b538SAndroid Build Coastguard Worker   if (!Enabled() ||
160*6777b538SAndroid Build Coastguard Worker       !message.sent_time() ||
161*6777b538SAndroid Build Coastguard Worker       !message.received_time() ||
162*6777b538SAndroid Build Coastguard Worker       message.dont_log())
163*6777b538SAndroid Build Coastguard Worker     return;
164*6777b538SAndroid Build Coastguard Worker 
165*6777b538SAndroid Build Coastguard Worker   LogData data;
166*6777b538SAndroid Build Coastguard Worker   GenerateLogData(message, &data, true);
167*6777b538SAndroid Build Coastguard Worker 
168*6777b538SAndroid Build Coastguard Worker   if (main_thread_->BelongsToCurrentThread()) {
169*6777b538SAndroid Build Coastguard Worker     Log(data);
170*6777b538SAndroid Build Coastguard Worker   } else {
171*6777b538SAndroid Build Coastguard Worker     main_thread_->PostTask(
172*6777b538SAndroid Build Coastguard Worker         FROM_HERE, base::BindOnce(&Logging::Log, base::Unretained(this), data));
173*6777b538SAndroid Build Coastguard Worker   }
174*6777b538SAndroid Build Coastguard Worker }
175*6777b538SAndroid Build Coastguard Worker 
GetMessageText(uint32_t type,std::string * name,const Message * message,std::string * params)176*6777b538SAndroid Build Coastguard Worker void Logging::GetMessageText(uint32_t type, std::string* name,
177*6777b538SAndroid Build Coastguard Worker                              const Message* message,
178*6777b538SAndroid Build Coastguard Worker                              std::string* params) {
179*6777b538SAndroid Build Coastguard Worker   if (!log_function_map_)
180*6777b538SAndroid Build Coastguard Worker     return;
181*6777b538SAndroid Build Coastguard Worker 
182*6777b538SAndroid Build Coastguard Worker   LogFunctionMap::iterator it = log_function_map_->find(type);
183*6777b538SAndroid Build Coastguard Worker   if (it == log_function_map_->end()) {
184*6777b538SAndroid Build Coastguard Worker     if (name) {
185*6777b538SAndroid Build Coastguard Worker       *name = "[UNKNOWN MSG ";
186*6777b538SAndroid Build Coastguard Worker       *name += base::NumberToString(type);
187*6777b538SAndroid Build Coastguard Worker       *name += " ]";
188*6777b538SAndroid Build Coastguard Worker     }
189*6777b538SAndroid Build Coastguard Worker     return;
190*6777b538SAndroid Build Coastguard Worker   }
191*6777b538SAndroid Build Coastguard Worker 
192*6777b538SAndroid Build Coastguard Worker   (*it->second)(name, message, params);
193*6777b538SAndroid Build Coastguard Worker }
194*6777b538SAndroid Build Coastguard Worker 
ANSIEscape(ANSIColor color)195*6777b538SAndroid Build Coastguard Worker const char* Logging::ANSIEscape(ANSIColor color) {
196*6777b538SAndroid Build Coastguard Worker   if (!enabled_color_)
197*6777b538SAndroid Build Coastguard Worker     return "";
198*6777b538SAndroid Build Coastguard Worker   switch (color) {
199*6777b538SAndroid Build Coastguard Worker     case ANSI_COLOR_RESET:
200*6777b538SAndroid Build Coastguard Worker       return "\033[m";
201*6777b538SAndroid Build Coastguard Worker     case ANSI_COLOR_BLACK:
202*6777b538SAndroid Build Coastguard Worker       return "\033[0;30m";
203*6777b538SAndroid Build Coastguard Worker     case ANSI_COLOR_RED:
204*6777b538SAndroid Build Coastguard Worker       return "\033[0;31m";
205*6777b538SAndroid Build Coastguard Worker     case ANSI_COLOR_GREEN:
206*6777b538SAndroid Build Coastguard Worker       return "\033[0;32m";
207*6777b538SAndroid Build Coastguard Worker     case ANSI_COLOR_YELLOW:
208*6777b538SAndroid Build Coastguard Worker       return "\033[0;33m";
209*6777b538SAndroid Build Coastguard Worker     case ANSI_COLOR_BLUE:
210*6777b538SAndroid Build Coastguard Worker       return "\033[0;34m";
211*6777b538SAndroid Build Coastguard Worker     case ANSI_COLOR_MAGENTA:
212*6777b538SAndroid Build Coastguard Worker       return "\033[0;35m";
213*6777b538SAndroid Build Coastguard Worker     case ANSI_COLOR_CYAN:
214*6777b538SAndroid Build Coastguard Worker       return "\033[0;36m";
215*6777b538SAndroid Build Coastguard Worker     case ANSI_COLOR_WHITE:
216*6777b538SAndroid Build Coastguard Worker       return "\033[0;37m";
217*6777b538SAndroid Build Coastguard Worker   }
218*6777b538SAndroid Build Coastguard Worker   return "";
219*6777b538SAndroid Build Coastguard Worker }
220*6777b538SAndroid Build Coastguard Worker 
DelayColor(double delay)221*6777b538SAndroid Build Coastguard Worker Logging::ANSIColor Logging::DelayColor(double delay) {
222*6777b538SAndroid Build Coastguard Worker   if (delay < 0.1)
223*6777b538SAndroid Build Coastguard Worker     return ANSI_COLOR_GREEN;
224*6777b538SAndroid Build Coastguard Worker   if (delay < 0.25)
225*6777b538SAndroid Build Coastguard Worker     return ANSI_COLOR_BLACK;
226*6777b538SAndroid Build Coastguard Worker   if (delay < 0.5)
227*6777b538SAndroid Build Coastguard Worker     return ANSI_COLOR_YELLOW;
228*6777b538SAndroid Build Coastguard Worker   return ANSI_COLOR_RED;
229*6777b538SAndroid Build Coastguard Worker }
230*6777b538SAndroid Build Coastguard Worker 
Log(const LogData & data)231*6777b538SAndroid Build Coastguard Worker void Logging::Log(const LogData& data) {
232*6777b538SAndroid Build Coastguard Worker   if (consumer_) {
233*6777b538SAndroid Build Coastguard Worker     // We're in the browser process.
234*6777b538SAndroid Build Coastguard Worker     consumer_->Log(data);
235*6777b538SAndroid Build Coastguard Worker   } else {
236*6777b538SAndroid Build Coastguard Worker     // We're in the renderer or plugin processes.
237*6777b538SAndroid Build Coastguard Worker     if (sender_) {
238*6777b538SAndroid Build Coastguard Worker       queued_logs_.push_back(data);
239*6777b538SAndroid Build Coastguard Worker       if (!queue_invoke_later_pending_) {
240*6777b538SAndroid Build Coastguard Worker         queue_invoke_later_pending_ = true;
241*6777b538SAndroid Build Coastguard Worker         base::SingleThreadTaskRunner::GetCurrentDefault()->PostDelayedTask(
242*6777b538SAndroid Build Coastguard Worker             FROM_HERE,
243*6777b538SAndroid Build Coastguard Worker             base::BindOnce(&Logging::OnSendLogs, base::Unretained(this)),
244*6777b538SAndroid Build Coastguard Worker             base::Milliseconds(kLogSendDelayMs));
245*6777b538SAndroid Build Coastguard Worker       }
246*6777b538SAndroid Build Coastguard Worker     }
247*6777b538SAndroid Build Coastguard Worker   }
248*6777b538SAndroid Build Coastguard Worker   if (enabled_on_stderr_) {
249*6777b538SAndroid Build Coastguard Worker     std::string message_name;
250*6777b538SAndroid Build Coastguard Worker     if (data.message_name.empty()) {
251*6777b538SAndroid Build Coastguard Worker       message_name = base::StringPrintf("[unknown type %d]", data.type);
252*6777b538SAndroid Build Coastguard Worker     } else {
253*6777b538SAndroid Build Coastguard Worker       message_name = data.message_name;
254*6777b538SAndroid Build Coastguard Worker     }
255*6777b538SAndroid Build Coastguard Worker     double receive_delay =
256*6777b538SAndroid Build Coastguard Worker         (Time::FromDeltaSinceWindowsEpoch(base::Microseconds(data.receive)) -
257*6777b538SAndroid Build Coastguard Worker          Time::FromDeltaSinceWindowsEpoch(base::Microseconds(data.sent)))
258*6777b538SAndroid Build Coastguard Worker             .InSecondsF();
259*6777b538SAndroid Build Coastguard Worker     double dispatch_delay =
260*6777b538SAndroid Build Coastguard Worker         (Time::FromDeltaSinceWindowsEpoch(base::Microseconds(data.dispatch)) -
261*6777b538SAndroid Build Coastguard Worker          Time::FromDeltaSinceWindowsEpoch(base::Microseconds(data.sent)))
262*6777b538SAndroid Build Coastguard Worker             .InSecondsF();
263*6777b538SAndroid Build Coastguard Worker     fprintf(stderr, "ipc %d %s %s%s %s%s\n  %18.5f %s%18.5f %s%18.5f%s\n",
264*6777b538SAndroid Build Coastguard Worker             data.routing_id, data.flags.c_str(),
265*6777b538SAndroid Build Coastguard Worker             ANSIEscape(sender_ ? ANSI_COLOR_BLUE : ANSI_COLOR_CYAN),
266*6777b538SAndroid Build Coastguard Worker             message_name.c_str(), ANSIEscape(ANSI_COLOR_RESET),
267*6777b538SAndroid Build Coastguard Worker             data.params.c_str(),
268*6777b538SAndroid Build Coastguard Worker             Time::FromDeltaSinceWindowsEpoch(base::Microseconds(data.sent))
269*6777b538SAndroid Build Coastguard Worker                 .InSecondsFSinceUnixEpoch(),
270*6777b538SAndroid Build Coastguard Worker             ANSIEscape(DelayColor(receive_delay)),
271*6777b538SAndroid Build Coastguard Worker             Time::FromDeltaSinceWindowsEpoch(base::Microseconds(data.receive))
272*6777b538SAndroid Build Coastguard Worker                 .InSecondsFSinceUnixEpoch(),
273*6777b538SAndroid Build Coastguard Worker             ANSIEscape(DelayColor(dispatch_delay)),
274*6777b538SAndroid Build Coastguard Worker             Time::FromDeltaSinceWindowsEpoch(base::Microseconds(data.dispatch))
275*6777b538SAndroid Build Coastguard Worker                 .InSecondsFSinceUnixEpoch(),
276*6777b538SAndroid Build Coastguard Worker             ANSIEscape(ANSI_COLOR_RESET));
277*6777b538SAndroid Build Coastguard Worker   }
278*6777b538SAndroid Build Coastguard Worker }
279*6777b538SAndroid Build Coastguard Worker 
GenerateLogData(const Message & message,LogData * data,bool get_params)280*6777b538SAndroid Build Coastguard Worker void GenerateLogData(const Message& message, LogData* data, bool get_params) {
281*6777b538SAndroid Build Coastguard Worker   if (message.is_reply()) {
282*6777b538SAndroid Build Coastguard Worker     // "data" should already be filled in.
283*6777b538SAndroid Build Coastguard Worker     std::string params;
284*6777b538SAndroid Build Coastguard Worker     Logging::GetMessageText(data->type, NULL, &message, &params);
285*6777b538SAndroid Build Coastguard Worker 
286*6777b538SAndroid Build Coastguard Worker     if (!data->params.empty() && !params.empty())
287*6777b538SAndroid Build Coastguard Worker       data->params += ", ";
288*6777b538SAndroid Build Coastguard Worker 
289*6777b538SAndroid Build Coastguard Worker     data->flags += " DR";
290*6777b538SAndroid Build Coastguard Worker 
291*6777b538SAndroid Build Coastguard Worker     data->params += params;
292*6777b538SAndroid Build Coastguard Worker   } else {
293*6777b538SAndroid Build Coastguard Worker     std::string flags;
294*6777b538SAndroid Build Coastguard Worker     if (message.is_sync())
295*6777b538SAndroid Build Coastguard Worker       flags = "S";
296*6777b538SAndroid Build Coastguard Worker 
297*6777b538SAndroid Build Coastguard Worker     if (message.is_reply())
298*6777b538SAndroid Build Coastguard Worker       flags += "R";
299*6777b538SAndroid Build Coastguard Worker 
300*6777b538SAndroid Build Coastguard Worker     if (message.is_reply_error())
301*6777b538SAndroid Build Coastguard Worker       flags += "E";
302*6777b538SAndroid Build Coastguard Worker 
303*6777b538SAndroid Build Coastguard Worker     std::string params, message_name;
304*6777b538SAndroid Build Coastguard Worker     Logging::GetMessageText(message.type(), &message_name, &message,
305*6777b538SAndroid Build Coastguard Worker                             get_params ? &params : NULL);
306*6777b538SAndroid Build Coastguard Worker 
307*6777b538SAndroid Build Coastguard Worker     data->routing_id = message.routing_id();
308*6777b538SAndroid Build Coastguard Worker     data->type = message.type();
309*6777b538SAndroid Build Coastguard Worker     data->flags = flags;
310*6777b538SAndroid Build Coastguard Worker     data->sent = message.sent_time();
311*6777b538SAndroid Build Coastguard Worker     data->receive = message.received_time();
312*6777b538SAndroid Build Coastguard Worker     data->dispatch = Time::Now().ToDeltaSinceWindowsEpoch().InMicroseconds();
313*6777b538SAndroid Build Coastguard Worker     data->params = params;
314*6777b538SAndroid Build Coastguard Worker     data->message_name = message_name;
315*6777b538SAndroid Build Coastguard Worker   }
316*6777b538SAndroid Build Coastguard Worker }
317*6777b538SAndroid Build Coastguard Worker 
318*6777b538SAndroid Build Coastguard Worker }
319*6777b538SAndroid Build Coastguard Worker 
320*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IPC_MESSAGE_LOG_ENABLED)
321