mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-25 04:23:25 +00:00
Make MemoryUsage
work on Windows
This commit is contained in:
parent
85056423e3
commit
2c1ca98aba
3 changed files with 20 additions and 0 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -1170,6 +1170,7 @@ dependencies = [
|
|||
"once_cell",
|
||||
"perf-event",
|
||||
"tikv-jemalloc-ctl",
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
|
@ -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"]
|
||||
|
|
|
@ -35,6 +35,22 @@ impl 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) }
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue