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