Make MemoryUsage work on Windows

This commit is contained in:
Jonas Schievink 2021-06-09 22:55:50 +02:00
parent 85056423e3
commit 2c1ca98aba
3 changed files with 20 additions and 0 deletions

1
Cargo.lock generated
View file

@ -1170,6 +1170,7 @@ dependencies = [
"once_cell",
"perf-event",
"tikv-jemalloc-ctl",
"winapi",
]
[[package]]

View file

@ -20,6 +20,9 @@ jemalloc-ctl = { version = "0.4.1", package = "tikv-jemalloc-ctl", optional = tr
[target.'cfg(target_os = "linux")'.dependencies]
perf-event = "0.4"
[target.'cfg(windows)'.dependencies]
winapi = { version = "0.3.8", features = ["psapi"] }
[features]
cpu_profiler = []
jemalloc = ["jemalloc-ctl"]

View file

@ -35,6 +35,22 @@ pub fn now() -> MemoryUsage {
// Note: This is incredibly slow.
let alloc = unsafe { libc::mallinfo() }.uordblks as isize;
MemoryUsage { allocated: Bytes(alloc) }
} else if #[cfg(windows)] {
// There doesn't seem to be an API for determining heap usage, so we try to
// approximate that by using the Commit Charge value.
use winapi::um::processthreadsapi::*;
use winapi::um::psapi::*;
use std::mem::{MaybeUninit, size_of};
let proc = unsafe { GetCurrentProcess() };
let mut mem_counters = MaybeUninit::uninit();
let cb = size_of::<PROCESS_MEMORY_COUNTERS>();
let ret = unsafe { GetProcessMemoryInfo(proc, mem_counters.as_mut_ptr(), cb as u32) };
assert!(ret != 0);
let usage = unsafe { mem_counters.assume_init().PagefileUsage };
MemoryUsage { allocated: Bytes(usage as isize) }
} else {
MemoryUsage { allocated: Bytes(0) }
}