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 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}