Skip to main content

_diffctx/
peak_rss.rs

1#![allow(unsafe_code)]
2
3#[cfg(unix)]
4fn getrusage_max_rss_bytes() -> u64 {
5    let mut usage = std::mem::MaybeUninit::<libc::rusage>::zeroed();
6    let rc = unsafe { libc::getrusage(libc::RUSAGE_SELF, usage.as_mut_ptr()) };
7    if rc != 0 {
8        return 0;
9    }
10    let max_rss = unsafe { usage.assume_init() }.ru_maxrss.max(0) as u64;
11    // ru_maxrss unit differs by platform: bytes on macOS, kilobytes on Linux.
12    if cfg!(target_os = "macos") {
13        max_rss
14    } else {
15        max_rss * 1024
16    }
17}
18
19#[cfg(target_os = "macos")]
20pub fn peak_rss_bytes() -> u64 {
21    let mut info = std::mem::MaybeUninit::<libc::rusage_info_v4>::zeroed();
22    let rc = unsafe {
23        libc::proc_pid_rusage(
24            libc::getpid(),
25            libc::RUSAGE_INFO_V4,
26            info.as_mut_ptr().cast(),
27        )
28    };
29    if rc == 0 {
30        let footprint = unsafe { info.assume_init() }.ri_lifetime_max_phys_footprint;
31        if footprint > 0 {
32            return footprint;
33        }
34    }
35    getrusage_max_rss_bytes()
36}
37
38#[cfg(all(unix, not(target_os = "macos")))]
39pub fn peak_rss_bytes() -> u64 {
40    getrusage_max_rss_bytes()
41}
42
43#[cfg(not(unix))]
44pub fn peak_rss_bytes() -> u64 {
45    0
46}