#![allow(non_snake_case)]
#![allow(non_upper_case_globals)]
#![allow(dead_code)]
use core::any::Any;
use core::ffi::c_void;
use std::sync::atomic::Ordering;
use crate::ported::crt::{ColorElements as CE, ColorScheme};
use crate::ported::machine::Machine;
use crate::ported::object::{Object, ObjectClass};
use crate::ported::process::{
Process, ProcessClass, ProcessField, Process_class, Process_compare,
Process_compareByKey_Base, Process_compareByParent, Process_init, Process_rowGetSortKey,
Process_rowIsHighlighted, Process_rowIsVisible, Process_rowMatchesFilter, Process_writeField,
};
use crate::ported::richstring::{RichString, RichString_appendWide};
use crate::ported::row::{
spaceship_number, Row, RowClass, Row_display, Row_pidDigits, Row_printLeftAlignedField,
};
use crate::ported::settings::RowField;
const ZONENAME_MAX: u32 = 256;
const ZONEID: RowField = 100;
const ZONE: RowField = 101;
const PROJID: RowField = 102;
const TASKID: RowField = 103;
const POOLID: RowField = 104;
const CONTID: RowField = 105;
const LWPID: RowField = 106;
#[repr(C)]
pub struct SolarisProcess {
pub super_: Process,
pub zoneid: i32,
pub zname: Option<String>,
pub taskid: i32,
pub projid: i32,
pub poolid: i32,
pub contid: i32,
pub realpid: i32,
pub realppid: i32,
pub realtgid: i32,
pub lwpid: i32,
}
pub static SolarisProcess_class: ProcessClass = ProcessClass {
super_: RowClass {
super_: ObjectClass {
extends: Some(&Process_class.super_.super_),
},
isHighlighted: Some(Process_rowIsHighlighted),
isVisible: Some(Process_rowIsVisible),
writeField: Some(SolarisProcess_rowWriteField),
matchesFilter: Some(Process_rowMatchesFilter),
sortKeyString: Some(Process_rowGetSortKey),
compareByParent: Some(Process_compareByParent),
},
compareByKey: Some(SolarisProcess_compareByKey),
};
impl Object for SolarisProcess {
fn klass(&self) -> &'static ObjectClass {
&SolarisProcess_class.super_.super_
}
fn row_class(&self) -> Option<&'static RowClass> {
Some(&SolarisProcess_class.super_)
}
fn process_class(&self) -> Option<&'static ProcessClass> {
Some(&SolarisProcess_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_)
}
fn display(&self, out: &mut RichString) {
Row_display(self, out)
}
fn compare(&self, other: &dyn Object) -> i32 {
Process_compare(self, other)
}
}
pub fn SolarisProcess_new(host: *const Machine) -> Box<SolarisProcess> {
let mut this = Box::new(SolarisProcess {
super_: Process::default(),
zoneid: 0,
zname: None,
taskid: 0,
projid: 0,
poolid: 0,
contid: 0,
realpid: 0,
realppid: 0,
realtgid: 0,
lwpid: 0,
});
Process_init(&mut this.super_, host as *const c_void);
this
}
pub fn Process_delete() {
todo!("port of SolarisProcess.c:70 — pure free() teardown; Rust Drop handles it")
}
pub fn SolarisProcess_rowWriteField(super_: &dyn Object, str: &mut RichString, field: RowField) {
use ProcessField as PF;
let sp = (super_ as &dyn Any)
.downcast_ref::<SolarisProcess>()
.expect("SolarisProcess_rowWriteField: row is not a SolarisProcess");
let scheme = ColorScheme::active();
let attr = CE::DEFAULT_COLOR.packed(scheme);
let w = Row_pidDigits.load(Ordering::Relaxed) as usize;
let buffer: String;
match field {
ZONEID => buffer = format!("{:>width$} ", sp.zoneid, width = w),
PROJID => buffer = format!("{:>width$} ", sp.projid, width = w),
TASKID => buffer = format!("{:>width$} ", sp.taskid, width = w),
POOLID => buffer = format!("{:>width$} ", sp.poolid, width = w),
CONTID => buffer = format!("{:>width$} ", sp.contid, width = w),
ZONE => {
let z = sp.zname.as_deref().unwrap_or("global");
Row_printLeftAlignedField(str, attr, z.as_bytes(), ZONENAME_MAX / 4);
return;
}
f if f == PF::PID as RowField => buffer = format!("{:>width$} ", sp.realpid, width = w),
f if f == PF::PPID as RowField => buffer = format!("{:>width$} ", sp.realppid, width = w),
f if f == PF::TGID as RowField => buffer = format!("{:>width$} ", sp.realtgid, width = w),
LWPID => buffer = format!("{:>width$} ", sp.lwpid, width = w),
_ => {
Process_writeField(&sp.super_, str, field);
return;
}
}
RichString_appendWide(str, attr, buffer.as_bytes());
}
pub fn SolarisProcess_compareByKey(v1: &dyn Object, v2: &dyn Object, key: RowField) -> i32 {
use ProcessField as PF;
let p1 = (v1 as &dyn Any)
.downcast_ref::<SolarisProcess>()
.expect("SolarisProcess_compareByKey: v1 is not a SolarisProcess");
let p2 = (v2 as &dyn Any)
.downcast_ref::<SolarisProcess>()
.expect("SolarisProcess_compareByKey: v2 is not a SolarisProcess");
match key {
ZONEID => spaceship_number!(p1.zoneid, p2.zoneid),
PROJID => spaceship_number!(p1.projid, p2.projid),
TASKID => spaceship_number!(p1.taskid, p2.taskid),
POOLID => spaceship_number!(p1.poolid, p2.poolid),
CONTID => spaceship_number!(p1.contid, p2.contid),
ZONE => {
let z1 = p1.zname.as_deref().unwrap_or("global");
let z2 = p2.zname.as_deref().unwrap_or("global");
z1.cmp(z2) as i32
}
f if f == PF::PID as RowField => spaceship_number!(p1.realpid, p2.realpid),
f if f == PF::PPID as RowField => spaceship_number!(p1.realppid, p2.realppid),
LWPID => spaceship_number!(p1.lwpid, p2.lwpid),
_ => Process_compareByKey_Base(&p1.super_, &p2.super_, key),
}
}