xref: /aosp_15_r20/external/cronet/ipc/ipc_logging.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2011 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 #ifndef IPC_IPC_LOGGING_H_
6*6777b538SAndroid Build Coastguard Worker #define IPC_IPC_LOGGING_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include "base/task/single_thread_task_runner.h"
9*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_buildflags.h"
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IPC_MESSAGE_LOG_ENABLED)
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
14*6777b538SAndroid Build Coastguard Worker #include <unordered_map>
15*6777b538SAndroid Build Coastguard Worker #include <vector>
16*6777b538SAndroid Build Coastguard Worker 
17*6777b538SAndroid Build Coastguard Worker #include "base/component_export.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/memory/ref_counted.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/memory/singleton.h"
21*6777b538SAndroid Build Coastguard Worker #include "base/task/single_thread_task_runner.h"
22*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_message.h"
23*6777b538SAndroid Build Coastguard Worker 
24*6777b538SAndroid Build Coastguard Worker // Logging function. |name| is a string in ASCII and |params| is a string in
25*6777b538SAndroid Build Coastguard Worker // UTF-8.
26*6777b538SAndroid Build Coastguard Worker typedef void (*LogFunction)(std::string* name,
27*6777b538SAndroid Build Coastguard Worker                             const IPC::Message* msg,
28*6777b538SAndroid Build Coastguard Worker                             std::string* params);
29*6777b538SAndroid Build Coastguard Worker 
30*6777b538SAndroid Build Coastguard Worker typedef std::unordered_map<uint32_t, LogFunction> LogFunctionMap;
31*6777b538SAndroid Build Coastguard Worker 
32*6777b538SAndroid Build Coastguard Worker namespace IPC {
33*6777b538SAndroid Build Coastguard Worker 
34*6777b538SAndroid Build Coastguard Worker class Message;
35*6777b538SAndroid Build Coastguard Worker class Sender;
36*6777b538SAndroid Build Coastguard Worker 
37*6777b538SAndroid Build Coastguard Worker // One instance per process.  Needs to be created on the main thread (the UI
38*6777b538SAndroid Build Coastguard Worker // thread in the browser) but OnPreDispatchMessage/OnPostDispatchMessage
39*6777b538SAndroid Build Coastguard Worker // can be called on other threads.
COMPONENT_EXPORT(IPC)40*6777b538SAndroid Build Coastguard Worker class COMPONENT_EXPORT(IPC) Logging {
41*6777b538SAndroid Build Coastguard Worker  public:
42*6777b538SAndroid Build Coastguard Worker   // Implemented by consumers of log messages.
43*6777b538SAndroid Build Coastguard Worker   class Consumer {
44*6777b538SAndroid Build Coastguard Worker    public:
45*6777b538SAndroid Build Coastguard Worker     virtual void Log(const LogData& data) = 0;
46*6777b538SAndroid Build Coastguard Worker 
47*6777b538SAndroid Build Coastguard Worker    protected:
48*6777b538SAndroid Build Coastguard Worker     virtual ~Consumer() {}
49*6777b538SAndroid Build Coastguard Worker   };
50*6777b538SAndroid Build Coastguard Worker 
51*6777b538SAndroid Build Coastguard Worker   void SetConsumer(Consumer* consumer);
52*6777b538SAndroid Build Coastguard Worker 
53*6777b538SAndroid Build Coastguard Worker   ~Logging();
54*6777b538SAndroid Build Coastguard Worker   static Logging* GetInstance();
55*6777b538SAndroid Build Coastguard Worker 
56*6777b538SAndroid Build Coastguard Worker   // Enable and Disable are NOT cross-process; they only affect the
57*6777b538SAndroid Build Coastguard Worker   // current thread/process.  If you want to modify the value for all
58*6777b538SAndroid Build Coastguard Worker   // processes, perhaps your intent is to call
59*6777b538SAndroid Build Coastguard Worker   // g_browser_process->SetIPCLoggingEnabled().
60*6777b538SAndroid Build Coastguard Worker   void Enable();
61*6777b538SAndroid Build Coastguard Worker   void Disable();
62*6777b538SAndroid Build Coastguard Worker   bool Enabled() const { return enabled_; }
63*6777b538SAndroid Build Coastguard Worker 
64*6777b538SAndroid Build Coastguard Worker   // Called by child processes to give the logger object the channel to send
65*6777b538SAndroid Build Coastguard Worker   // logging data to the browser process.
66*6777b538SAndroid Build Coastguard Worker   void SetIPCSender(Sender* sender);
67*6777b538SAndroid Build Coastguard Worker 
68*6777b538SAndroid Build Coastguard Worker   // Called in the browser process when logging data from a child process is
69*6777b538SAndroid Build Coastguard Worker   // received.
70*6777b538SAndroid Build Coastguard Worker   void OnReceivedLoggingMessage(const Message& message);
71*6777b538SAndroid Build Coastguard Worker 
72*6777b538SAndroid Build Coastguard Worker   void OnSendMessage(Message* message);
73*6777b538SAndroid Build Coastguard Worker   void OnPreDispatchMessage(const Message& message);
74*6777b538SAndroid Build Coastguard Worker   void OnPostDispatchMessage(const Message& message);
75*6777b538SAndroid Build Coastguard Worker 
76*6777b538SAndroid Build Coastguard Worker   // Like the *MsgLog functions declared for each message class, except this
77*6777b538SAndroid Build Coastguard Worker   // calls the correct one based on the message type automatically.  Defined in
78*6777b538SAndroid Build Coastguard Worker   // ipc_logging.cc.
79*6777b538SAndroid Build Coastguard Worker   static void GetMessageText(uint32_t type, std::string* name,
80*6777b538SAndroid Build Coastguard Worker                              const Message* message, std::string* params);
81*6777b538SAndroid Build Coastguard Worker 
82*6777b538SAndroid Build Coastguard Worker   static void set_log_function_map(LogFunctionMap* functions) {
83*6777b538SAndroid Build Coastguard Worker     log_function_map_ = functions;
84*6777b538SAndroid Build Coastguard Worker   }
85*6777b538SAndroid Build Coastguard Worker 
86*6777b538SAndroid Build Coastguard Worker   static LogFunctionMap* log_function_map() {
87*6777b538SAndroid Build Coastguard Worker     return log_function_map_;
88*6777b538SAndroid Build Coastguard Worker   }
89*6777b538SAndroid Build Coastguard Worker 
90*6777b538SAndroid Build Coastguard Worker  private:
91*6777b538SAndroid Build Coastguard Worker   typedef enum {
92*6777b538SAndroid Build Coastguard Worker     ANSI_COLOR_RESET = -1,
93*6777b538SAndroid Build Coastguard Worker     ANSI_COLOR_BLACK,
94*6777b538SAndroid Build Coastguard Worker     ANSI_COLOR_RED,
95*6777b538SAndroid Build Coastguard Worker     ANSI_COLOR_GREEN,
96*6777b538SAndroid Build Coastguard Worker     ANSI_COLOR_YELLOW,
97*6777b538SAndroid Build Coastguard Worker     ANSI_COLOR_BLUE,
98*6777b538SAndroid Build Coastguard Worker     ANSI_COLOR_MAGENTA,
99*6777b538SAndroid Build Coastguard Worker     ANSI_COLOR_CYAN,
100*6777b538SAndroid Build Coastguard Worker     ANSI_COLOR_WHITE
101*6777b538SAndroid Build Coastguard Worker   } ANSIColor;
102*6777b538SAndroid Build Coastguard Worker   const char* ANSIEscape(ANSIColor color);
103*6777b538SAndroid Build Coastguard Worker   ANSIColor DelayColor(double delay);
104*6777b538SAndroid Build Coastguard Worker 
105*6777b538SAndroid Build Coastguard Worker   friend struct base::DefaultSingletonTraits<Logging>;
106*6777b538SAndroid Build Coastguard Worker   Logging();
107*6777b538SAndroid Build Coastguard Worker 
108*6777b538SAndroid Build Coastguard Worker   void OnSendLogs();
109*6777b538SAndroid Build Coastguard Worker   void Log(const LogData& data);
110*6777b538SAndroid Build Coastguard Worker 
111*6777b538SAndroid Build Coastguard Worker   bool enabled_;
112*6777b538SAndroid Build Coastguard Worker   bool enabled_on_stderr_;  // only used on POSIX for now
113*6777b538SAndroid Build Coastguard Worker   bool enabled_color_; // only used on POSIX for now
114*6777b538SAndroid Build Coastguard Worker 
115*6777b538SAndroid Build Coastguard Worker   std::vector<LogData> queued_logs_;
116*6777b538SAndroid Build Coastguard Worker   bool queue_invoke_later_pending_;
117*6777b538SAndroid Build Coastguard Worker 
118*6777b538SAndroid Build Coastguard Worker   raw_ptr<Sender> sender_;
119*6777b538SAndroid Build Coastguard Worker   scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
120*6777b538SAndroid Build Coastguard Worker 
121*6777b538SAndroid Build Coastguard Worker   raw_ptr<Consumer> consumer_;
122*6777b538SAndroid Build Coastguard Worker 
123*6777b538SAndroid Build Coastguard Worker   static LogFunctionMap* log_function_map_;
124*6777b538SAndroid Build Coastguard Worker };
125*6777b538SAndroid Build Coastguard Worker 
126*6777b538SAndroid Build Coastguard Worker }  // namespace IPC
127*6777b538SAndroid Build Coastguard Worker 
128*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IPC_MESSAGE_LOG_ENABLED)
129*6777b538SAndroid Build Coastguard Worker 
130*6777b538SAndroid Build Coastguard Worker #endif  // IPC_IPC_LOGGING_H_
131