#![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_setSwapValues;
#[cfg(not(target_os = "macos"))]
use crate::ported::linux::platform::Platform_setSwapValues;
use crate::ported::meter::{
Meter, MeterClass, Meter_class, Meter_humanUnit, BAR_METERMODE, METERMODE_DEFAULT_SUPPORTED,
};
use crate::ported::object::ObjectClass;
use crate::ported::richstring::{RichString, RichString_appendAscii, RichString_writeAscii};
pub fn SwapMeter_updateValues(this: &mut Meter) {
const SWAP_METER_USED: usize = 0;
const SWAP_METER_CACHE: usize = 1;
const SWAP_METER_FRONTSWAP: usize = 2;
this.values[SWAP_METER_CACHE] = f64::NAN; this.values[SWAP_METER_FRONTSWAP] = f64::NAN; Platform_setSwapValues(this);
this.txtBuffer = format!(
"{}/{}",
Meter_humanUnit(this.values[SWAP_METER_USED]),
Meter_humanUnit(this.total)
);
}
pub fn SwapMeter_display(this: &Meter, out: &mut RichString) {
const SWAP_METER_USED: usize = 0;
const SWAP_METER_CACHE: usize = 1;
const SWAP_METER_FRONTSWAP: usize = 2;
let scheme = ColorScheme::active();
RichString_writeAscii(out, ColorElements::METER_TEXT.packed(scheme), b":");
let buffer = Meter_humanUnit(this.total);
RichString_appendAscii(
out,
ColorElements::METER_VALUE.packed(scheme),
buffer.as_bytes(),
);
let buffer = Meter_humanUnit(this.values[SWAP_METER_USED]);
RichString_appendAscii(out, ColorElements::METER_TEXT.packed(scheme), b" used:");
RichString_appendAscii(
out,
ColorElements::METER_VALUE.packed(scheme),
buffer.as_bytes(),
);
if this.values[SWAP_METER_CACHE] >= 0.0 {
let buffer = Meter_humanUnit(this.values[SWAP_METER_CACHE]);
RichString_appendAscii(out, ColorElements::METER_TEXT.packed(scheme), b" cache:");
RichString_appendAscii(
out,
ColorElements::SWAP_CACHE.packed(scheme),
buffer.as_bytes(),
);
}
if this.values[SWAP_METER_FRONTSWAP] >= 0.0 {
let buffer = Meter_humanUnit(this.values[SWAP_METER_FRONTSWAP]);
RichString_appendAscii(
out,
ColorElements::METER_TEXT.packed(scheme),
b" frontswap:",
);
RichString_appendAscii(
out,
ColorElements::SWAP_FRONTSWAP.packed(scheme),
buffer.as_bytes(),
);
}
}
static SwapMeter_attributes: [i32; 3] = [
ColorElements::SWAP as i32,
ColorElements::SWAP_CACHE as i32,
ColorElements::SWAP_FRONTSWAP as i32,
];
pub static SwapMeter_class: MeterClass = MeterClass {
super_: ObjectClass {
extends: Some(&Meter_class.super_),
},
display: Some(SwapMeter_display),
init: None,
done: None,
updateMode: None,
updateValues: Some(SwapMeter_updateValues),
draw: None,
getCaption: None,
getUiName: None,
defaultMode: BAR_METERMODE,
supportedModes: METERMODE_DEFAULT_SUPPORTED,
total: 100.0,
attributes: &SwapMeter_attributes,
name: "Swap",
uiName: "Swap",
caption: "Swp",
description: None,
maxItems: 3, isMultiColumn: false,
isPercentChart: true,
};
#[cfg(test)]
mod tests {
use super::*;
fn text(r: &RichString) -> String {
(0..r.chlen as usize).map(|i| r.chptr[i].chars).collect()
}
#[test]
fn display_with_cache_and_frontswap() {
let m = Meter {
host: core::ptr::null(),
total: 1024.0, values: vec![512.0, 256.0, 128.0],
..Meter::empty()
};
let mut out = RichString::new();
SwapMeter_display(&m, &mut out);
assert_eq!(text(&out), ":1.00M used:512K cache:256K frontswap:128K");
}
#[test]
fn display_omits_nan_optionals() {
let m = Meter {
host: core::ptr::null(),
total: 1024.0,
values: vec![512.0, f64::NAN, f64::NAN],
..Meter::empty()
};
let mut out = RichString::new();
SwapMeter_display(&m, &mut out);
assert_eq!(text(&out), ":1.00M used:512K");
}
#[cfg(not(target_os = "macos"))]
use crate::ported::linux::linuxmachine::{LinuxMachine, ZswapStats};
#[cfg(not(target_os = "macos"))]
use crate::ported::machine::Machine;
#[cfg(target_os = "macos")]
#[test]
fn update_values_reads_live_system_swap() {
let mut m = Meter {
values: vec![0.0; 3],
host: core::ptr::null(),
..Meter::empty()
};
SwapMeter_updateValues(&mut m);
assert!(m.total >= 0.0);
assert!(m.values[0] >= 0.0 && m.values[0] <= m.total); assert!(m.values[1].is_nan()); assert!(m.values[2].is_nan()); }
#[cfg(not(target_os = "macos"))]
#[test]
fn update_values_no_zswap() {
let host = Box::leak(Box::new(LinuxMachine {
super_: Machine {
totalSwap: 2048,
usedSwap: 512,
cachedSwap: 256,
..Default::default()
},
..Default::default()
}));
let mut m = Meter {
values: vec![0.0; 3],
host: &host.super_ as *const crate::ported::machine::Machine,
..Meter::empty()
};
SwapMeter_updateValues(&mut m);
assert_eq!(m.total, 2048.0);
assert_eq!(m.values[0], 512.0); assert_eq!(m.values[1], 256.0); assert_eq!(m.values[2], 0.0); assert_eq!(m.txtBuffer, "512K/2.00M");
}
#[cfg(not(target_os = "macos"))]
#[test]
fn update_values_zswap_moves_used_to_frontswap() {
let host = Box::leak(Box::new(LinuxMachine {
super_: Machine {
totalSwap: 2048,
usedSwap: 512,
cachedSwap: 256,
..Default::default()
},
zswap: ZswapStats {
usedZswapOrig: 100,
usedZswapComp: 40,
},
..Default::default()
}));
let mut m = Meter {
values: vec![0.0; 3],
host: &host.super_ as *const crate::ported::machine::Machine,
..Meter::empty()
};
SwapMeter_updateValues(&mut m);
assert_eq!(m.values[0], 412.0); assert_eq!(m.values[2], 100.0); }
}