xref: /aosp_15_r20/external/cronet/base/process/process_handle.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2013 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_PROCESS_HANDLE_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_PROCESS_PROCESS_HANDLE_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
9*6777b538SAndroid Build Coastguard Worker #include <sys/types.h>
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker #include <compare>
12*6777b538SAndroid Build Coastguard Worker #include <iosfwd>
13*6777b538SAndroid Build Coastguard Worker 
14*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h"
15*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
16*6777b538SAndroid Build Coastguard Worker 
17*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
18*6777b538SAndroid Build Coastguard Worker #include "base/win/windows_types.h"
19*6777b538SAndroid Build Coastguard Worker #endif
20*6777b538SAndroid Build Coastguard Worker 
21*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_FUCHSIA)
22*6777b538SAndroid Build Coastguard Worker #include <zircon/types.h>
23*6777b538SAndroid Build Coastguard Worker #endif
24*6777b538SAndroid Build Coastguard Worker 
25*6777b538SAndroid Build Coastguard Worker namespace base {
26*6777b538SAndroid Build Coastguard Worker 
27*6777b538SAndroid Build Coastguard Worker class FilePath;
28*6777b538SAndroid Build Coastguard Worker 
29*6777b538SAndroid Build Coastguard Worker // ProcessHandle is a platform specific type which represents the underlying OS
30*6777b538SAndroid Build Coastguard Worker // handle to a process.
31*6777b538SAndroid Build Coastguard Worker // ProcessId is a number which identifies the process in the OS.
32*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
33*6777b538SAndroid Build Coastguard Worker typedef HANDLE ProcessHandle;
34*6777b538SAndroid Build Coastguard Worker typedef DWORD ProcessId;
35*6777b538SAndroid Build Coastguard Worker typedef HANDLE UserTokenHandle;
36*6777b538SAndroid Build Coastguard Worker const ProcessHandle kNullProcessHandle = NULL;
37*6777b538SAndroid Build Coastguard Worker const ProcessId kNullProcessId = 0;
38*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_FUCHSIA)
39*6777b538SAndroid Build Coastguard Worker typedef zx_handle_t ProcessHandle;
40*6777b538SAndroid Build Coastguard Worker typedef zx_koid_t ProcessId;
41*6777b538SAndroid Build Coastguard Worker const ProcessHandle kNullProcessHandle = ZX_HANDLE_INVALID;
42*6777b538SAndroid Build Coastguard Worker const ProcessId kNullProcessId = ZX_KOID_INVALID;
43*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_POSIX)
44*6777b538SAndroid Build Coastguard Worker // On POSIX, our ProcessHandle will just be the PID.
45*6777b538SAndroid Build Coastguard Worker typedef pid_t ProcessHandle;
46*6777b538SAndroid Build Coastguard Worker typedef pid_t ProcessId;
47*6777b538SAndroid Build Coastguard Worker const ProcessHandle kNullProcessHandle = 0;
48*6777b538SAndroid Build Coastguard Worker const ProcessId kNullProcessId = 0;
49*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_WIN)
50*6777b538SAndroid Build Coastguard Worker 
51*6777b538SAndroid Build Coastguard Worker // To print ProcessIds portably use CrPRIdPid (based on PRIuS and friends from
52*6777b538SAndroid Build Coastguard Worker // C99 and format_macros.h) like this:
53*6777b538SAndroid Build Coastguard Worker // base::StringPrintf("PID is %" CrPRIdPid ".\n", pid);
54*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA)
55*6777b538SAndroid Build Coastguard Worker #define CrPRIdPid "ld"
56*6777b538SAndroid Build Coastguard Worker #else
57*6777b538SAndroid Build Coastguard Worker #define CrPRIdPid "d"
58*6777b538SAndroid Build Coastguard Worker #endif
59*6777b538SAndroid Build Coastguard Worker 
60*6777b538SAndroid Build Coastguard Worker class UniqueProcId {
61*6777b538SAndroid Build Coastguard Worker  public:
UniqueProcId(ProcessId value)62*6777b538SAndroid Build Coastguard Worker   explicit UniqueProcId(ProcessId value) : value_(value) {}
63*6777b538SAndroid Build Coastguard Worker   UniqueProcId(const UniqueProcId& other) = default;
64*6777b538SAndroid Build Coastguard Worker   UniqueProcId& operator=(const UniqueProcId& other) = default;
65*6777b538SAndroid Build Coastguard Worker 
66*6777b538SAndroid Build Coastguard Worker   // Returns the process PID. WARNING: On some platforms, the pid may not be
67*6777b538SAndroid Build Coastguard Worker   // valid within the current process sandbox.
GetUnsafeValue()68*6777b538SAndroid Build Coastguard Worker   ProcessId GetUnsafeValue() const { return value_; }
69*6777b538SAndroid Build Coastguard Worker 
70*6777b538SAndroid Build Coastguard Worker   friend bool operator==(const UniqueProcId&, const UniqueProcId&) = default;
71*6777b538SAndroid Build Coastguard Worker   friend auto operator<=>(const UniqueProcId&, const UniqueProcId&) = default;
72*6777b538SAndroid Build Coastguard Worker 
73*6777b538SAndroid Build Coastguard Worker  private:
74*6777b538SAndroid Build Coastguard Worker   ProcessId value_;
75*6777b538SAndroid Build Coastguard Worker };
76*6777b538SAndroid Build Coastguard Worker 
77*6777b538SAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& os, const UniqueProcId& obj);
78*6777b538SAndroid Build Coastguard Worker 
79*6777b538SAndroid Build Coastguard Worker // Returns the id of the current process.
80*6777b538SAndroid Build Coastguard Worker // Note that on some platforms, this is not guaranteed to be unique across
81*6777b538SAndroid Build Coastguard Worker // processes (use GetUniqueIdForProcess if uniqueness is required).
82*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ProcessId GetCurrentProcId();
83*6777b538SAndroid Build Coastguard Worker 
84*6777b538SAndroid Build Coastguard Worker // Returns a unique ID for the current process. The ID will be unique across all
85*6777b538SAndroid Build Coastguard Worker // currently running processes within the chrome session, but IDs of terminated
86*6777b538SAndroid Build Coastguard Worker // processes may be reused.
87*6777b538SAndroid Build Coastguard Worker BASE_EXPORT UniqueProcId GetUniqueIdForProcess();
88*6777b538SAndroid Build Coastguard Worker 
89*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
90*6777b538SAndroid Build Coastguard Worker // When a process is started in a different PID namespace from the browser
91*6777b538SAndroid Build Coastguard Worker // process, this function must be called with the process's PID in the browser's
92*6777b538SAndroid Build Coastguard Worker // PID namespace in order to initialize its unique ID. Not thread safe.
93*6777b538SAndroid Build Coastguard Worker // WARNING: To avoid inconsistent results from GetUniqueIdForProcess, this
94*6777b538SAndroid Build Coastguard Worker // should only be called very early after process startup - ideally as soon
95*6777b538SAndroid Build Coastguard Worker // after process creation as possible.
96*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void InitUniqueIdForProcessInPidNamespace(
97*6777b538SAndroid Build Coastguard Worker     ProcessId pid_outside_of_namespace);
98*6777b538SAndroid Build Coastguard Worker #endif
99*6777b538SAndroid Build Coastguard Worker 
100*6777b538SAndroid Build Coastguard Worker // Returns the ProcessHandle of the current process.
101*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ProcessHandle GetCurrentProcessHandle();
102*6777b538SAndroid Build Coastguard Worker 
103*6777b538SAndroid Build Coastguard Worker // Returns the process ID for the specified process. This is functionally the
104*6777b538SAndroid Build Coastguard Worker // same as Windows' GetProcessId(), but works on versions of Windows before Win
105*6777b538SAndroid Build Coastguard Worker // XP SP1 as well.
106*6777b538SAndroid Build Coastguard Worker // DEPRECATED. New code should be using Process::Pid() instead.
107*6777b538SAndroid Build Coastguard Worker // Note that on some platforms, this is not guaranteed to be unique across
108*6777b538SAndroid Build Coastguard Worker // processes.
109*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ProcessId GetProcId(ProcessHandle process);
110*6777b538SAndroid Build Coastguard Worker 
111*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_FUCHSIA)
112*6777b538SAndroid Build Coastguard Worker // Returns the ID for the parent of the given process. Not available on Fuchsia.
113*6777b538SAndroid Build Coastguard Worker // Returning a negative value indicates an error, such as if the |process| does
114*6777b538SAndroid Build Coastguard Worker // not exist. Returns 0 when |process| has no parent process.
115*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ProcessId GetParentProcessId(ProcessHandle process);
116*6777b538SAndroid Build Coastguard Worker #endif  // !BUILDFLAG(IS_FUCHSIA)
117*6777b538SAndroid Build Coastguard Worker 
118*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_POSIX)
119*6777b538SAndroid Build Coastguard Worker // Returns the path to the executable of the given process.
120*6777b538SAndroid Build Coastguard Worker BASE_EXPORT FilePath GetProcessExecutablePath(ProcessHandle process);
121*6777b538SAndroid Build Coastguard Worker #endif
122*6777b538SAndroid Build Coastguard Worker 
123*6777b538SAndroid Build Coastguard Worker }  // namespace base
124*6777b538SAndroid Build Coastguard Worker 
125*6777b538SAndroid Build Coastguard Worker #endif  // BASE_PROCESS_PROCESS_HANDLE_H_
126