#![allow(non_snake_case)]
#![allow(dead_code)]
use core::any::Any;
use std::os::raw::c_void;
use crate::ported::machine::Machine;
use crate::ported::object::{Object, ObjectClass};
use crate::ported::process::{
Process, ProcessClass, ProcessField, ProcessFieldData, Process_compareByKey_Base, Process_init,
Process_writeField,
};
use crate::ported::richstring::RichString;
use crate::ported::row::{Row, RowClass};
use crate::ported::settings::RowField;
pub const LAST_PROCESSFIELD: usize = 127;
#[allow(clippy::too_many_arguments)]
const fn pfd(
name: &'static str,
title: &'static str,
description: &'static str,
flags: u32,
pidColumn: bool,
defaultSortDesc: bool,
autoWidth: bool,
autoTitleRightAlign: bool,
) -> ProcessFieldData {
ProcessFieldData {
name,
title: Some(title),
description: Some(description),
flags,
pidColumn,
defaultSortDesc,
autoWidth,
autoTitleRightAlign,
}
}
const EMPTY_FIELD: ProcessFieldData = ProcessFieldData {
name: "",
title: None,
description: None,
flags: 0,
pidColumn: false,
defaultSortDesc: false,
autoWidth: false,
autoTitleRightAlign: false,
};
#[allow(non_upper_case_globals)] pub static Process_fields: [ProcessFieldData; LAST_PROCESSFIELD] = build_process_fields();
const fn build_process_fields() -> [ProcessFieldData; LAST_PROCESSFIELD] {
use ProcessField as PF;
let mut t = [EMPTY_FIELD; LAST_PROCESSFIELD];
t[PF::PID as usize] = pfd(
"PID",
"PID",
"Process/thread ID",
0,
true,
false,
false,
false,
);
t[PF::COMM as usize] = pfd(
"Command",
"Command ",
"Command line (insert as last column only)",
0,
false,
false,
false,
false,
);
t[PF::STATE as usize] = pfd(
"STATE",
"S ",
"Process state (S sleeping, R running, D disk, Z zombie, T traced, W paging)",
0,
false,
false,
false,
false,
);
t[PF::PPID as usize] = pfd(
"PPID",
"PPID",
"Parent process ID",
0,
true,
false,
false,
false,
);
t[PF::PGRP as usize] = pfd(
"PGRP",
"PGRP",
"Process group ID",
0,
true,
false,
false,
false,
);
t[PF::SESSION as usize] = pfd(
"SESSION",
"SID",
"Process's session ID",
0,
true,
false,
false,
false,
);
t[PF::TTY as usize] = pfd(
"TTY",
"TTY ",
"Controlling terminal",
0,
false,
false,
false,
false,
);
t[PF::TPGID as usize] = pfd(
"TPGID",
"TPGID",
"Process ID of the fg process group of the controlling terminal",
0,
true,
false,
false,
false,
);
t[PF::MINFLT as usize] = pfd(
"MINFLT",
" MINFLT ",
"Number of minor faults which have not required loading a memory page from disk",
0,
false,
true,
false,
false,
);
t[PF::MAJFLT as usize] = pfd(
"MAJFLT",
" MAJFLT ",
"Number of major faults which have required loading a memory page from disk",
0,
false,
true,
false,
false,
);
t[PF::PRIORITY as usize] = pfd(
"PRIORITY",
"PRI ",
"Kernel's internal priority for the process",
0,
false,
false,
false,
false,
);
t[PF::NICE as usize] = pfd(
"NICE",
" NI ",
"Nice value (the higher the value, the more it lets other processes take priority)",
0,
false,
false,
false,
false,
);
t[PF::STARTTIME as usize] = pfd(
"STARTTIME",
"START ",
"Time the process was started",
0,
false,
false,
false,
false,
);
t[PF::ELAPSED as usize] = pfd(
"ELAPSED",
"ELAPSED ",
"Time since the process was started",
0,
false,
false,
false,
false,
);
t[PF::PROCESSOR as usize] = pfd(
"PROCESSOR",
"CPU ",
"Id of the CPU the process last executed on",
0,
false,
false,
false,
false,
);
t[PF::M_VIRT as usize] = pfd(
"M_VIRT",
" VIRT ",
"Total program size in virtual memory",
0,
false,
true,
false,
false,
);
t[PF::M_RESIDENT as usize] = pfd(
"M_RESIDENT",
" RES ",
"Resident set size, size of the text and data sections, plus stack usage",
0,
false,
true,
false,
false,
);
t[PF::ST_UID as usize] = pfd(
"ST_UID",
"UID",
"User ID of the process owner",
0,
false,
false,
false,
false,
);
t[PF::PERCENT_CPU as usize] = pfd(
"PERCENT_CPU",
" CPU%",
"Percentage of the CPU time the process used in the last sampling",
0,
false,
true,
true,
true,
);
t[PF::PERCENT_NORM_CPU as usize] = pfd(
"PERCENT_NORM_CPU",
"NCPU%",
"Normalized percentage of the CPU time the process used in the last sampling (normalized by cpu count)",
0, false, true, true, false,
);
t[PF::PERCENT_MEM as usize] = pfd(
"PERCENT_MEM",
"MEM% ",
"Percentage of the memory the process is using, based on resident memory size",
0,
false,
true,
false,
false,
);
t[PF::USER as usize] = pfd(
"USER",
"USER ",
"Username of the process owner (or user ID if name cannot be determined)",
0,
false,
false,
false,
false,
);
t[PF::TIME as usize] = pfd(
"TIME",
" TIME+ ",
"Total time the process has spent in user and system time",
0,
false,
true,
false,
false,
);
t[PF::NLWP as usize] = pfd(
"NLWP",
"NLWP ",
"Number of threads in the process",
0,
false,
false,
false,
false,
);
t[PF::TGID as usize] = pfd(
"TGID",
"TGID",
"Thread group ID (i.e. process ID)",
0,
true,
false,
false,
false,
);
t
}
#[repr(C)]
pub struct UnsupportedProcess {
pub super_: Process,
}
impl Object for UnsupportedProcess {
fn klass(&self) -> &'static ObjectClass {
self.super_.klass()
}
fn display(&self, out: &mut RichString) {
self.super_.display(out)
}
fn compare(&self, other: &dyn Object) -> i32 {
self.super_.compare(other)
}
fn row_class(&self) -> Option<&'static RowClass> {
self.super_.row_class()
}
fn process_class(&self) -> Option<&'static ProcessClass> {
self.super_.process_class()
}
fn as_row(&self) -> Option<&Row> {
Some(&self.super_.super_)
}
fn as_row_mut(&mut self) -> Option<&mut Row> {
Some(&mut self.super_.super_)
}
fn as_process(&self) -> Option<&Process> {
Some(&self.super_)
}
fn as_process_mut(&mut self) -> Option<&mut Process> {
Some(&mut self.super_)
}
}
pub fn UnsupportedProcess_new(host: *const Machine) -> Box<UnsupportedProcess> {
let mut this = Box::new(UnsupportedProcess {
super_: Process::default(),
});
Process_init(&mut this.super_, host as *const c_void);
this
}
pub fn Process_delete() {
todo!("port of UnsupportedProcess.c:54 — pure free() teardown; Rust Drop handles it")
}
pub fn UnsupportedProcess_rowWriteField(
super_: &dyn Object,
str: &mut RichString,
field: RowField,
) {
let up = (super_ as &dyn Any)
.downcast_ref::<UnsupportedProcess>()
.expect("UnsupportedProcess_rowWriteField: row is not an UnsupportedProcess");
{
Process_writeField(&up.super_, str, field);
}
}
pub fn UnsupportedProcess_compareByKey(v1: &dyn Object, v2: &dyn Object, key: RowField) -> i32 {
let p1 = (v1 as &dyn Any)
.downcast_ref::<UnsupportedProcess>()
.expect("UnsupportedProcess_compareByKey: v1 is not an UnsupportedProcess");
let p2 = (v2 as &dyn Any)
.downcast_ref::<UnsupportedProcess>()
.expect("UnsupportedProcess_compareByKey: v2 is not an UnsupportedProcess");
Process_compareByKey_Base(&p1.super_, &p2.super_, key)
}