#![allow(non_snake_case)]
#![allow(dead_code)]
use std::sync::Mutex;
use crate::ported::crt::{CRT_colorSchemes, ColorElements, ColorScheme};
use crate::ported::linux::linuxmachine::{memory_t, LinuxMachine, HTOP_HUGEPAGE_COUNT, MEMORY_MAX};
use crate::ported::meter::{Meter, Meter_humanUnit};
use crate::ported::richstring::{RichString, RichString_appendAscii, RichString_writeAscii};
#[allow(non_upper_case_globals)] static HugePageMeter_active_labels: Mutex<[Option<&'static str>; 4]> =
Mutex::new([None, None, None, None]);
#[allow(non_upper_case_globals)] static HugePageMeter_labels: [&str; 24] = [
" 64K:", " 128K:", " 256K:", " 512K:", " 1M:", " 2M:", " 4M:", " 8M:", " 16M:", " 32M:",
" 64M:", " 128M:", " 256M:", " 512M:", " 1G:", " 2G:", " 4G:", " 8G:", " 16G:", " 32G:",
" 64G:", " 128G:", " 256G:", " 512G:",
];
pub fn HugePageMeter_updateValues(this: &mut Meter) {
let host = unsafe { &*(this.host as *const LinuxMachine) };
let mut usedTotal: memory_t = 0;
let mut nextUsed: usize = 0;
this.total = host.totalHugePageMem as f64;
this.values[0] = 0.0;
let mut labels = HugePageMeter_active_labels.lock().unwrap();
labels[0] = Some(" used:");
for i in 1..labels.len() {
this.values[i] = f64::NAN;
labels[i] = None;
}
for i in 0..HTOP_HUGEPAGE_COUNT {
let value = host.usedHugePageMem[i];
if value != MEMORY_MAX {
this.values[nextUsed] = value as f64;
usedTotal += value;
labels[nextUsed] = Some(HugePageMeter_labels[i]);
nextUsed += 1;
if nextUsed == labels.len() {
break;
}
}
}
drop(labels);
this.txtBuffer = format!(
"{}/{}",
Meter_humanUnit(usedTotal as f64),
Meter_humanUnit(this.total)
);
}
pub fn HugePageMeter_display(this: &Meter, out: &mut RichString) {
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 labels = HugePageMeter_active_labels.lock().unwrap();
for i in 0..labels.len() {
let label = match labels[i] {
Some(label) => label,
None => break,
};
RichString_appendAscii(
out,
ColorElements::METER_TEXT.packed(scheme),
label.as_bytes(),
);
let buffer = Meter_humanUnit(this.values[i]);
RichString_appendAscii(
out,
CRT_colorSchemes[scheme as usize][ColorElements::HUGEPAGE_1 as usize + i],
buffer.as_bytes(),
);
}
}
#[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_writes_total_then_active_labels() {
{
let mut labels = HugePageMeter_active_labels.lock().unwrap();
*labels = [Some(" used:"), Some(" 2M:"), None, None];
}
let m = Meter {
host: core::ptr::null(),
total: 2.0 * 1024.0 * 1024.0, values: vec![1024.0, 512.0, 0.0, 0.0],
..Meter::empty()
};
let mut out = RichString::new();
HugePageMeter_display(&m, &mut out);
assert_eq!(text(&out), ":2.00G used:1.00M 2M:512K");
*HugePageMeter_active_labels.lock().unwrap() = [None, None, None, None];
}
}