---
# System prepended metadata

title: 'base::Proces'
tags: [Chromium-General, elkurin-daily-note]

---

# Process validity in Chromium

[base::Process](https://source.chromium.org/chromium/chromium/src/+/main:base/process/process.h;l=65;drc=f3f294fcf7d9c921e328e4c346f53aeb11862a65) is a Chromium expression of a process.  
base::Process has [IsValid](https://source.chromium.org/chromium/chromium/src/+/main:base/process/process.h;l=106;drc=f3f294fcf7d9c921e328e4c346f53aeb11862a65) method which aims to check if the process is valid.  
So what does "valid" mean?

## IsValid
This class has implementations for each platform.  
Let's use [process_posix.cc](https://source.chromium.org/chromium/chromium/src/+/main:base/process/process_posix.cc) as an example implementation in this note.

[Process::IsValid](https://source.chromium.org/chromium/chromium/src/+/main:base/process/process_posix.cc;l=279;drc=740b81bcdf6eb036bbe94bdda3841979ae9b2d88) implementation on Posix is just checking whether `process_` is kNullProcessHandle or not.  
[`process_`](https://source.chromium.org/chromium/chromium/src/+/main:base/process/process.h;l=295;drc=d4a7d3fb6f5100019d6153d5cf00c60f06b1d0a2) is [ProcessHandle](https://source.chromium.org/chromium/chromium/src/+/main:base/process/process_handle.h) in ChromeOS platform.  
```cpp=
typedef pid_t ProcessHandle;
typedef pid_t ProcessId;
const ProcessHandle kNullProcessHandle = 0;
const ProcessId kNullProcessId = 0;
```
ProcessHandle in Posix is just a PID.  
And [kNullProcessHandle](https://source.chromium.org/chromium/chromium/src/+/main:base/process/process_handle.h;l=46;drc=e4622aaeccea84652488d1822c28c78b7115684f) is 0 which represents a invalid state of process.

`process_` is set to kNullProcessHandle on multiple locations.   
On construction, [base::Process](https://source.chromium.org/chromium/chromium/src/+/main:base/process/process.h;l=69;drc=f3f294fcf7d9c921e328e4c346f53aeb11862a65) gets ProcessHandle as an argument, and kNullProcessHandle is set by default.  
Therefore, `some_process_ = base::Process()` means `process_` is reset.
Also on [Release](https://source.chromium.org/chromium/chromium/src/+/main:base/process/process_posix.cc;l=300;drc=740b81bcdf6eb036bbe94bdda3841979ae9b2d88) and [Close](https://source.chromium.org/chromium/chromium/src/+/main:base/process/process_posix.cc;l=313;drc=740b81bcdf6eb036bbe94bdda3841979ae9b2d88).  

As you can see here, `process_` here is set to kNullProcessHandle on closing or releasing, [Process::IsValid](https://source.chromium.org/chromium/chromium/src/+/main:base/process/process_posix.cc;l=279;drc=740b81bcdf6eb036bbe94bdda3841979ae9b2d88) refers to `process_` value and returns true if `process_` is not equal to kNullProcessHandle.  

## Terminate
How about Terminate?

[Terminate](https://source.chromium.org/chromium/chromium/src/+/main:base/process/process_posix.cc;l=320;drc=740b81bcdf6eb036bbe94bdda3841979ae9b2d88) is a method to termionates the process with extreme prejudice.  
It sends [kill](https://source.chromium.org/chromium/chromium/src/+/main:base/process/process_posix.cc;l=340;drc=740b81bcdf6eb036bbe94bdda3841979ae9b2d88) signal to force termination.  
And then [WaitForExitWithTimeout](https://source.chromium.org/chromium/chromium/src/+/main:base/process/process_posix.cc;l=363;drc=d4a7d3fb6f5100019d6153d5cf00c60f06b1d0a2) until `timeout` length.

Looking through this path, it actually does not modify `process_` value.  
So Terminate does not reset `process_` to kNullProcessHandle.  
`process_.IsValid()` does not work as a flag to check if the process is running.

TL;DR; base::Process object is not tied to its lifetime. The process may be killed while this object still alive and claim it's valid.  
