mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-25 20:43:21 +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",
|
"once_cell",
|
||||||
"perf-event",
|
"perf-event",
|
||||||
"tikv-jemalloc-ctl",
|
"tikv-jemalloc-ctl",
|
||||||
|
"winapi",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
|
@ -20,6 +20,9 @@ jemalloc-ctl = { version = "0.4.1", package = "tikv-jemalloc-ctl", optional = tr
|
||||||
[target.'cfg(target_os = "linux")'.dependencies]
|
[target.'cfg(target_os = "linux")'.dependencies]
|
||||||
perf-event = "0.4"
|
perf-event = "0.4"
|
||||||
|
|
||||||
|
[target.'cfg(windows)'.dependencies]
|
||||||
|
winapi = { version = "0.3.8", features = ["psapi"] }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
cpu_profiler = []
|
cpu_profiler = []
|
||||||
jemalloc = ["jemalloc-ctl"]
|
jemalloc = ["jemalloc-ctl"]
|
||||||
|
|
|
@ -35,6 +35,22 @@ impl MemoryUsage {
|
||||||
// Note: This is incredibly slow.
|
// Note: This is incredibly slow.
|
||||||
let alloc = unsafe { libc::mallinfo() }.uordblks as isize;
|
let alloc = unsafe { libc::mallinfo() }.uordblks as isize;
|
||||||
MemoryUsage { allocated: Bytes(alloc) }
|
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 {
|
} else {
|
||||||
MemoryUsage { allocated: Bytes(0) }
|
MemoryUsage { allocated: Bytes(0) }
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue