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