mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-17 12:47:16 +00:00
58 lines
1.5 KiB
Rust
58 lines
1.5 KiB
Rust
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
//! The process status.
|
|
|
|
use core::sync::atomic::{AtomicBool, AtomicU32, Ordering};
|
|
|
|
use super::ExitCode;
|
|
|
|
/// The status of a process.
|
|
///
|
|
/// This maintains:
|
|
/// 1. Whether the process is a zombie (i.e., all its threads have exited);
|
|
/// 2. The exit code of the process.
|
|
#[derive(Debug)]
|
|
pub struct ProcessStatus {
|
|
is_zombie: AtomicBool,
|
|
exit_code: AtomicU32,
|
|
}
|
|
|
|
impl Default for ProcessStatus {
|
|
fn default() -> Self {
|
|
Self {
|
|
is_zombie: AtomicBool::new(false),
|
|
exit_code: AtomicU32::new(0),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl ProcessStatus {
|
|
/// Returns whether the process is a zombie process.
|
|
pub fn is_zombie(&self) -> bool {
|
|
// Use the `Acquire` memory order to make the exit code visible.
|
|
self.is_zombie.load(Ordering::Acquire)
|
|
}
|
|
|
|
/// Sets the process to be a zombie process.
|
|
///
|
|
/// This method should be called when the process completes its exit. The current thread must
|
|
/// be the last thread in the process, so that no threads belonging to the process can run
|
|
/// after it.
|
|
pub(super) fn set_zombie(&self) {
|
|
// Use the `Release` memory order to make the exit code visible.
|
|
self.is_zombie.store(true, Ordering::Release);
|
|
}
|
|
}
|
|
|
|
impl ProcessStatus {
|
|
/// Returns the exit code.
|
|
pub fn exit_code(&self) -> ExitCode {
|
|
self.exit_code.load(Ordering::Relaxed)
|
|
}
|
|
|
|
/// Sets the exit code.
|
|
pub(super) fn set_exit_code(&self, exit_code: ExitCode) {
|
|
self.exit_code.store(exit_code, Ordering::Relaxed);
|
|
}
|
|
}
|