#![allow(non_snake_case)]
#![allow(non_upper_case_globals)] #![allow(dead_code)]
use core::any::Any;
use crate::ported::machine::Machine;
use crate::ported::object::Object;
use crate::ported::process::{
Process, ProcessState, Process_fillStarttimeBuffer, Process_setParent, Process_setPid,
Process_setThreadGroup, Process_updateCPUFieldWidths, Process_updateCmdline, Process_updateComm,
Process_updateExe, PROCESS_FLAG_CWD,
};
use crate::ported::processtable::{
ProcessTable, ProcessTable_cleanupEntries, ProcessTable_getProcess, ProcessTable_init,
ProcessTable_prepareEntries,
};
use crate::ported::table::{Table, TableClass};
use crate::ported::unsupported::unsupportedprocess::{UnsupportedProcess, UnsupportedProcess_new};
#[repr(C)]
pub struct UnsupportedProcessTable {
pub super_: ProcessTable,
}
impl UnsupportedProcessTable {
fn scan_prepare(super_: *mut Table) {
let this = super_ as *mut UnsupportedProcessTable;
ProcessTable_prepareEntries(unsafe { &mut (*this).super_ });
}
fn scan_iterate(super_: *mut Table) {
let this = super_ as *mut UnsupportedProcessTable;
ProcessTable_goThroughEntries(unsafe { &mut *this });
}
fn scan_cleanup(super_: *mut Table) {
let this = super_ as *mut UnsupportedProcessTable;
ProcessTable_cleanupEntries(unsafe { &mut (*this).super_ });
}
}
pub static UnsupportedProcessTable_class: TableClass = TableClass {
prepare: Some(UnsupportedProcessTable::scan_prepare),
iterate: Some(UnsupportedProcessTable::scan_iterate),
cleanup: Some(UnsupportedProcessTable::scan_cleanup),
};
pub fn ProcessTable_new(
host: *const Machine,
pidMatchList: Option<usize>,
) -> Box<UnsupportedProcessTable> {
let mut this = Box::new(UnsupportedProcessTable {
super_: ProcessTable::empty(),
});
ProcessTable_init(&mut this.super_, host, pidMatchList);
this.super_.super_.klass = &UnsupportedProcessTable_class as *const TableClass;
this
}
pub fn ProcessTable_delete() {
todo!("port of UnsupportedProcessTable.c:29 — pure free() teardown; Rust Drop handles it")
}
pub fn ProcessTable_goThroughEntries(this: &mut UnsupportedProcessTable) {
let host = this.super_.super_.host;
let flags: u32 = unsafe {
host.as_ref()
.and_then(|m| m.settings.as_ref())
.and_then(|s| s.screens.get(s.ssIndex as usize))
.map_or(0, |ss| ss.flags)
};
let (_pre_existing, idx) = ProcessTable_getProcess(&mut this.super_, 1, |h| {
UnsupportedProcess_new(h) as Box<dyn Object>
});
let up: *mut UnsupportedProcess = {
let obj: &mut dyn Object = this.super_.super_.rows[idx].as_mut().unwrap().as_mut();
let any: &mut dyn Any = obj;
any.downcast_mut::<UnsupportedProcess>().unwrap()
};
let proc: &mut Process = unsafe { &mut (*up).super_ };
proc.time += 10;
Process_setPid(proc, 1);
Process_setParent(proc, 1);
Process_setThreadGroup(proc, 0);
Process_updateComm(proc, Some("commof16char"));
Process_updateCmdline(proc, Some("<unsupported architecture>"), 0, 0);
Process_updateExe(proc, Some("/path/to/executable"));
if flags & PROCESS_FLAG_CWD != 0 {
proc.procCwd = Some("/current/working/directory".to_string());
}
proc.super_.updated = true;
proc.state = ProcessState::RUNNING;
proc.isKernelThread = false;
proc.isUserlandThread = false;
proc.super_.show = true;
proc.pgrp = 0;
proc.session = 0;
proc.tty_nr = 0;
proc.tty_name = None;
proc.tpgid = 0;
proc.processor = 0;
proc.percent_cpu = 2.5;
proc.percent_mem = 2.5;
Process_updateCPUFieldWidths(proc.percent_cpu);
proc.st_uid = 0;
proc.user = Some("nobody".to_string());
proc.priority = 0;
proc.nice = 0;
proc.nlwp = 1;
proc.starttime_ctime = 1433116800; Process_fillStarttimeBuffer(proc);
proc.m_virt = 100;
proc.m_resident = 100;
proc.minflt = 20;
proc.majflt = 20;
}