#![allow(non_snake_case)]
#![allow(non_upper_case_globals)] #![allow(dead_code)]
use crate::ported::crt::{ColorElements, ColorScheme};
#[cfg(target_os = "macos")]
use crate::ported::darwin::platform::Platform_getLoadAverage;
#[cfg(not(target_os = "macos"))]
use crate::ported::linux::platform::Platform_getLoadAverage;
use crate::ported::meter::{
Meter, MeterClass, Meter_class, METERMODE_DEFAULT_SUPPORTED, TEXT_METERMODE,
};
use crate::ported::object::ObjectClass;
use crate::ported::richstring::{RichString, RichString_appendnAscii};
static OK_ATTRIBUTES: [i32; 1] = [ColorElements::METER_VALUE_OK as i32];
static MEDIUM_ATTRIBUTES: [i32; 1] = [ColorElements::METER_VALUE_WARN as i32];
static HIGH_ATTRIBUTES: [i32; 1] = [ColorElements::METER_VALUE_ERROR as i32];
pub fn LoadAverageMeter_updateValues(this: &mut Meter) {
let (mut one, mut five, mut fifteen) = (0.0f64, 0.0f64, 0.0f64);
Platform_getLoadAverage(&mut one, &mut five, &mut fifteen);
this.values[0] = one;
this.values[1] = five;
this.values[2] = fifteen;
this.curItems = 1;
let active_cpus = unsafe { (*this.host).activeCPUs } as f64;
if this.total < active_cpus {
this.total = active_cpus;
}
if this.values[0] < 1.0 {
this.curAttributes = Some(&OK_ATTRIBUTES);
} else if this.values[0] < active_cpus {
this.curAttributes = Some(&MEDIUM_ATTRIBUTES);
} else {
this.curAttributes = Some(&HIGH_ATTRIBUTES);
}
this.txtBuffer = format!(
"{:.2}/{:.2}/{:.2}",
this.values[0], this.values[1], this.values[2]
);
}
pub fn LoadAverageMeter_display(this: &Meter, out: &mut RichString) {
let scheme = ColorScheme::active();
let buffer = format!("{:.2} ", this.values[0]);
RichString_appendnAscii(
out,
ColorElements::LOAD_AVERAGE_ONE.packed(scheme),
buffer.as_bytes(),
buffer.len(),
);
let buffer = format!("{:.2} ", this.values[1]);
RichString_appendnAscii(
out,
ColorElements::LOAD_AVERAGE_FIVE.packed(scheme),
buffer.as_bytes(),
buffer.len(),
);
let buffer = format!("{:.2} ", this.values[2]);
RichString_appendnAscii(
out,
ColorElements::LOAD_AVERAGE_FIFTEEN.packed(scheme),
buffer.as_bytes(),
buffer.len(),
);
}
pub fn LoadMeter_updateValues(this: &mut Meter) {
let (mut one, mut five, mut fifteen) = (0.0f64, 0.0f64, 0.0f64);
Platform_getLoadAverage(&mut one, &mut five, &mut fifteen);
this.values[0] = one;
let _ = (five, fifteen);
let active_cpus = unsafe { (*this.host).activeCPUs } as f64;
if this.total < active_cpus {
this.total = active_cpus;
}
if this.values[0] < 1.0 {
this.curAttributes = Some(&OK_ATTRIBUTES);
} else if this.values[0] < active_cpus {
this.curAttributes = Some(&MEDIUM_ATTRIBUTES);
} else {
this.curAttributes = Some(&HIGH_ATTRIBUTES);
}
this.txtBuffer = format!("{:.2}", this.values[0]);
}
pub fn LoadMeter_display(this: &Meter, out: &mut RichString) {
let scheme = ColorScheme::active();
let buffer = format!("{:.2} ", this.values[0]);
RichString_appendnAscii(
out,
ColorElements::LOAD.packed(scheme),
buffer.as_bytes(),
buffer.len(),
);
}
static LoadAverageMeter_attributes: [i32; 3] = [
ColorElements::LOAD_AVERAGE_ONE as i32,
ColorElements::LOAD_AVERAGE_FIVE as i32,
ColorElements::LOAD_AVERAGE_FIFTEEN as i32,
];
static LoadMeter_attributes: [i32; 1] = [ColorElements::LOAD as i32];
pub static LoadAverageMeter_class: MeterClass = MeterClass {
super_: ObjectClass {
extends: Some(&Meter_class.super_),
},
display: Some(LoadAverageMeter_display),
init: None,
done: None,
updateMode: None,
updateValues: Some(LoadAverageMeter_updateValues),
draw: None,
getCaption: None,
getUiName: None,
defaultMode: TEXT_METERMODE,
supportedModes: METERMODE_DEFAULT_SUPPORTED,
total: 1.0,
attributes: &LoadAverageMeter_attributes,
name: "LoadAverage",
uiName: "Load average",
caption: "Load average: ",
description: Some("Load averages: 1 minute, 5 minutes, 15 minutes"),
maxItems: 3,
isMultiColumn: false,
isPercentChart: false,
};
pub static LoadMeter_class: MeterClass = MeterClass {
super_: ObjectClass {
extends: Some(&Meter_class.super_),
},
display: Some(LoadMeter_display),
init: None,
done: None,
updateMode: None,
updateValues: Some(LoadMeter_updateValues),
draw: None,
getCaption: None,
getUiName: None,
defaultMode: TEXT_METERMODE,
supportedModes: METERMODE_DEFAULT_SUPPORTED,
total: 1.0,
attributes: &LoadMeter_attributes,
name: "Load",
uiName: "Load",
caption: "Load: ",
description: Some("Load: average of ready processes in the last minute"),
maxItems: 1,
isMultiColumn: false,
isPercentChart: false,
};
#[cfg(test)]
mod tests {
use super::*;
use crate::ported::meter::BAR_METERMODE;
fn text(r: &RichString) -> String {
(0..r.chlen as usize).map(|i| r.chptr[i].chars).collect()
}
fn meter(values: Vec<f64>) -> Meter {
Meter {
host: core::ptr::null(),
values,
mode: BAR_METERMODE,
..Meter::empty()
}
}
#[test]
fn load_average_display_three_figures() {
let m = meter(vec![1.23, 4.50, 15.00]);
let mut out = RichString::new();
LoadAverageMeter_display(&m, &mut out);
assert_eq!(text(&out), "1.23 4.50 15.00 ");
}
#[test]
fn load_average_display_rounds_to_two_places() {
let m = meter(vec![0.005, 0.999, 0.0]);
let mut out = RichString::new();
LoadAverageMeter_display(&m, &mut out);
assert_eq!(text(&out), "0.01 1.00 0.00 ");
}
#[test]
fn load_meter_display_one_figure() {
let m = meter(vec![0.42, 99.0, 99.0]);
let mut out = RichString::new();
LoadMeter_display(&m, &mut out);
assert_eq!(text(&out), "0.42 ");
}
use crate::ported::linux::linuxmachine::LinuxMachine;
use crate::ported::machine::Machine;
fn hosted_meter(active_cpus: u32) -> Meter {
let host = Box::leak(Box::new(LinuxMachine {
super_: Machine {
activeCPUs: active_cpus,
..Default::default()
},
..Default::default()
}));
Meter {
values: vec![0.0; 3],
total: 0.0,
host: &host.super_ as *const crate::ported::machine::Machine,
..Meter::empty()
}
}
#[test]
fn load_average_update_values_sets_invariants() {
let mut m = hosted_meter(4);
LoadAverageMeter_updateValues(&mut m);
assert_eq!(m.curItems, 1);
assert!(m.total >= 4.0, "total clamped up to activeCPUs");
assert!(m.curAttributes.is_some(), "a bar color is selected");
assert_eq!(
m.txtBuffer.matches('/').count(),
2,
"three '/'-joined figures"
);
}
#[test]
fn load_meter_update_values_selects_ok_below_one() {
let mut m = hosted_meter(64);
LoadMeter_updateValues(&mut m);
assert!(m.total >= 64.0);
assert_eq!(m.txtBuffer.matches('/').count(), 0);
if m.values[0] < 1.0 {
assert_eq!(m.curAttributes, Some(&OK_ATTRIBUTES[..]));
}
}
}