xref: /aosp_15_r20/external/cronet/base/process/current_process.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2022 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 BASE_PROCESS_CURRENT_PROCESS_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_PROCESS_CURRENT_PROCESS_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <atomic>
9*6777b538SAndroid Build Coastguard Worker #include <string>
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/no_destructor.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/process/process_handle.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/synchronization/lock.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/trace_event/base_tracing.h"
16*6777b538SAndroid Build Coastguard Worker #include "build/buildflag.h"
17*6777b538SAndroid Build Coastguard Worker 
18*6777b538SAndroid Build Coastguard Worker namespace tracing {
19*6777b538SAndroid Build Coastguard Worker class TraceEventDataSource;
20*6777b538SAndroid Build Coastguard Worker class CustomEventRecorder;
21*6777b538SAndroid Build Coastguard Worker void SetProcessTrackDescriptor(int64_t process_start_timestamp);
22*6777b538SAndroid Build Coastguard Worker }  // namespace tracing
23*6777b538SAndroid Build Coastguard Worker 
24*6777b538SAndroid Build Coastguard Worker namespace mojo::core {
25*6777b538SAndroid Build Coastguard Worker class Channel;
26*6777b538SAndroid Build Coastguard Worker }
27*6777b538SAndroid Build Coastguard Worker 
28*6777b538SAndroid Build Coastguard Worker namespace base {
29*6777b538SAndroid Build Coastguard Worker namespace test {
30*6777b538SAndroid Build Coastguard Worker class CurrentProcessForTest;
31*6777b538SAndroid Build Coastguard Worker }  // namespace test
32*6777b538SAndroid Build Coastguard Worker 
33*6777b538SAndroid Build Coastguard Worker using CurrentProcessType =
34*6777b538SAndroid Build Coastguard Worker     perfetto::protos::pbzero::ChromeProcessDescriptor::ProcessType;
35*6777b538SAndroid Build Coastguard Worker 
36*6777b538SAndroid Build Coastguard Worker // These values are persisted to logs. Entries should not be renumbered and
37*6777b538SAndroid Build Coastguard Worker // numeric values should never be reused.
38*6777b538SAndroid Build Coastguard Worker // Use coalesced service process for recording histograms.
39*6777b538SAndroid Build Coastguard Worker enum class ShortProcessType {
40*6777b538SAndroid Build Coastguard Worker   kUnspecified = 0,
41*6777b538SAndroid Build Coastguard Worker   kBrowser = 1,
42*6777b538SAndroid Build Coastguard Worker   kRenderer = 2,
43*6777b538SAndroid Build Coastguard Worker   kUtility = 3,
44*6777b538SAndroid Build Coastguard Worker   kZygote = 4,
45*6777b538SAndroid Build Coastguard Worker   kSandboxHelper = 5,
46*6777b538SAndroid Build Coastguard Worker   kGpu = 6,
47*6777b538SAndroid Build Coastguard Worker   kPpapiPlugin = 7,
48*6777b538SAndroid Build Coastguard Worker   kPpapiBroker = 8,
49*6777b538SAndroid Build Coastguard Worker   kServiceNetwork = 9,
50*6777b538SAndroid Build Coastguard Worker   kServiceStorage = 10,
51*6777b538SAndroid Build Coastguard Worker   kService = 11,
52*6777b538SAndroid Build Coastguard Worker   kRendererExtension = 12,
53*6777b538SAndroid Build Coastguard Worker   kMaxValue = kRendererExtension,
54*6777b538SAndroid Build Coastguard Worker };
55*6777b538SAndroid Build Coastguard Worker 
56*6777b538SAndroid Build Coastguard Worker // CurrentProcess class provides access to set of current process properties
57*6777b538SAndroid Build Coastguard Worker // which are accessible only from the process itself (e.g. ProcessType,
58*6777b538SAndroid Build Coastguard Worker // ProcessName).
59*6777b538SAndroid Build Coastguard Worker // See base::CurrentThread for access to properties of the running
60*6777b538SAndroid Build Coastguard Worker // thread and base::Process::Current for the properties which are known both
61*6777b538SAndroid Build Coastguard Worker // from within and without the process (e.g. pid).
62*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT CurrentProcess {
63*6777b538SAndroid Build Coastguard Worker  public:
64*6777b538SAndroid Build Coastguard Worker   static CurrentProcess& GetInstance();
65*6777b538SAndroid Build Coastguard Worker 
66*6777b538SAndroid Build Coastguard Worker   CurrentProcess(const CurrentProcess&) = delete;
67*6777b538SAndroid Build Coastguard Worker   CurrentProcess& operator=(const CurrentProcess&) = delete;
68*6777b538SAndroid Build Coastguard Worker   ~CurrentProcess();
69*6777b538SAndroid Build Coastguard Worker 
70*6777b538SAndroid Build Coastguard Worker   bool operator==(const CurrentProcess& other) const;
71*6777b538SAndroid Build Coastguard Worker 
72*6777b538SAndroid Build Coastguard Worker   class TypeKey {
73*6777b538SAndroid Build Coastguard Worker    private:
74*6777b538SAndroid Build Coastguard Worker     TypeKey() = default;
75*6777b538SAndroid Build Coastguard Worker     friend class ::base::test::CurrentProcessForTest;
76*6777b538SAndroid Build Coastguard Worker     friend class ::tracing::TraceEventDataSource;
77*6777b538SAndroid Build Coastguard Worker     friend class ::tracing::CustomEventRecorder;
78*6777b538SAndroid Build Coastguard Worker     friend void ::tracing::SetProcessTrackDescriptor(
79*6777b538SAndroid Build Coastguard Worker         int64_t process_start_timestamp);
80*6777b538SAndroid Build Coastguard Worker     friend class ::mojo::core::Channel;
81*6777b538SAndroid Build Coastguard Worker   };
82*6777b538SAndroid Build Coastguard Worker   // Returns an enum corresponding to the type of the current process (e.g.
83*6777b538SAndroid Build Coastguard Worker   // browser / renderer / utility / etc). It can be used in metrics or tracing
84*6777b538SAndroid Build Coastguard Worker   // code — for example, to split a number of low-level events with
85*6777b538SAndroid Build Coastguard Worker   // process-type-agnostic implementation (e.g. number of posted tasks) by
86*6777b538SAndroid Build Coastguard Worker   // process type for diagnostic purposes.
87*6777b538SAndroid Build Coastguard Worker   // To avoid layering violations (i.e. //base or other low-level code modifying
88*6777b538SAndroid Build Coastguard Worker   // its behaviour based on the //chrome or //content-level concepts like a
89*6777b538SAndroid Build Coastguard Worker   // "browser" or "renderer" process), the access to this function is controlled
90*6777b538SAndroid Build Coastguard Worker   // by an explicit list.
GetType(TypeKey key)91*6777b538SAndroid Build Coastguard Worker   CurrentProcessType GetType(TypeKey key) {
92*6777b538SAndroid Build Coastguard Worker     return static_cast<CurrentProcessType>(
93*6777b538SAndroid Build Coastguard Worker         process_type_.load(std::memory_order_relaxed));
94*6777b538SAndroid Build Coastguard Worker   }
95*6777b538SAndroid Build Coastguard Worker 
96*6777b538SAndroid Build Coastguard Worker   ShortProcessType GetShortType(TypeKey key);
97*6777b538SAndroid Build Coastguard Worker 
98*6777b538SAndroid Build Coastguard Worker   class NameKey {
99*6777b538SAndroid Build Coastguard Worker    private:
100*6777b538SAndroid Build Coastguard Worker     NameKey() = default;
101*6777b538SAndroid Build Coastguard Worker     friend class ::base::test::CurrentProcessForTest;
102*6777b538SAndroid Build Coastguard Worker     friend class ::tracing::TraceEventDataSource;
103*6777b538SAndroid Build Coastguard Worker     friend void ::tracing::SetProcessTrackDescriptor(
104*6777b538SAndroid Build Coastguard Worker         int64_t process_start_timestamp);
105*6777b538SAndroid Build Coastguard Worker   };
GetName(NameKey key)106*6777b538SAndroid Build Coastguard Worker   std::string GetName(NameKey key) {
107*6777b538SAndroid Build Coastguard Worker     AutoLock lock(lock_);
108*6777b538SAndroid Build Coastguard Worker     return process_name_;
109*6777b538SAndroid Build Coastguard Worker   }
110*6777b538SAndroid Build Coastguard Worker 
111*6777b538SAndroid Build Coastguard Worker   // Sets the name and type of the process for the metrics and tracing. This
112*6777b538SAndroid Build Coastguard Worker   // function should be called as early as possible in the process's lifetime
113*6777b538SAndroid Build Coastguard Worker   // before starting any threads, typically in *Main() function. Provide
114*6777b538SAndroid Build Coastguard Worker   // process_name as an argument if it can't be trivially derived from the
115*6777b538SAndroid Build Coastguard Worker   // process type.
116*6777b538SAndroid Build Coastguard Worker   void SetProcessType(CurrentProcessType process_type);
117*6777b538SAndroid Build Coastguard Worker   void SetProcessNameAndType(const std::string& process_name,
118*6777b538SAndroid Build Coastguard Worker                              CurrentProcessType process_type);
119*6777b538SAndroid Build Coastguard Worker 
IsProcessNameEmpty()120*6777b538SAndroid Build Coastguard Worker   bool IsProcessNameEmpty() const {
121*6777b538SAndroid Build Coastguard Worker     AutoLock lock(lock_);
122*6777b538SAndroid Build Coastguard Worker     return process_name_.empty();
123*6777b538SAndroid Build Coastguard Worker   }
124*6777b538SAndroid Build Coastguard Worker 
125*6777b538SAndroid Build Coastguard Worker  private:
126*6777b538SAndroid Build Coastguard Worker   friend class base::NoDestructor<CurrentProcess>;
127*6777b538SAndroid Build Coastguard Worker 
128*6777b538SAndroid Build Coastguard Worker   CurrentProcess() = default;
129*6777b538SAndroid Build Coastguard Worker 
130*6777b538SAndroid Build Coastguard Worker   mutable Lock lock_;
131*6777b538SAndroid Build Coastguard Worker   std::string process_name_;
132*6777b538SAndroid Build Coastguard Worker   // The process_type_ is set at the startup before processes start running.
133*6777b538SAndroid Build Coastguard Worker   // However, since it runs in multi-threaded environment and if has to be
134*6777b538SAndroid Build Coastguard Worker   // changed later, we would want well-defined behaviour even if one thread
135*6777b538SAndroid Build Coastguard Worker   // writes while another reads. There are some processes (e.g. Service process)
136*6777b538SAndroid Build Coastguard Worker   // where we don't have a guarantee that it will be called early enough in the
137*6777b538SAndroid Build Coastguard Worker   // process's lifetime, thus we use std::atomic here.
138*6777b538SAndroid Build Coastguard Worker   std::atomic<CurrentProcessType> process_type_;
139*6777b538SAndroid Build Coastguard Worker };
140*6777b538SAndroid Build Coastguard Worker 
141*6777b538SAndroid Build Coastguard Worker }  // namespace base
142*6777b538SAndroid Build Coastguard Worker 
143*6777b538SAndroid Build Coastguard Worker #endif  // BASE_PROCESS_CURRENT_PROCESS_H_
144