mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-25 12:33:33 +00:00
Merge #5479
5479: Allow gathering memory stats on non-jemalloc Linux r=matklad a=jonas-schievink I could also parse `/proc/$PID/statm` to get the resident set size, but decided against that for now as it isn't terribly useful. Note that `mallinfo()` is incredibly slow for some reason, and unfortunately this will be exposed to users via the "Memory Usage" command (even worse, the opened document will show the outdated values while the server is processing). So, not very ideal, but it keeps me from recompiling r-a with different feature sets all the time. Co-authored-by: Jonas Schievink <jonas.schievink@ferrous-systems.com>
This commit is contained in:
commit
2e73ba1b49
3 changed files with 19 additions and 10 deletions
2
Cargo.lock
generated
2
Cargo.lock
generated
|
@ -1198,8 +1198,10 @@ name = "ra_prof"
|
|||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"backtrace",
|
||||
"cfg-if",
|
||||
"jemalloc-ctl",
|
||||
"jemallocator",
|
||||
"libc",
|
||||
"mimalloc",
|
||||
"once_cell",
|
||||
"ra_arena",
|
||||
|
|
|
@ -14,6 +14,8 @@ ra_arena = { path = "../ra_arena" }
|
|||
once_cell = "1.3.1"
|
||||
backtrace = { version = "0.3.44", optional = true }
|
||||
mimalloc = { version = "0.1.19", default-features = false, optional = true }
|
||||
cfg-if = "0.1.10"
|
||||
libc = "0.2.73"
|
||||
|
||||
[target.'cfg(not(target_env = "msvc"))'.dependencies]
|
||||
jemallocator = { version = "0.3.2", optional = true }
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
//! FIXME: write short doc here
|
||||
|
||||
use cfg_if::cfg_if;
|
||||
use std::fmt;
|
||||
|
||||
pub struct MemoryUsage {
|
||||
|
@ -8,19 +9,23 @@ pub struct MemoryUsage {
|
|||
}
|
||||
|
||||
impl MemoryUsage {
|
||||
#[cfg(all(feature = "jemalloc", not(target_env = "msvc")))]
|
||||
pub fn current() -> MemoryUsage {
|
||||
jemalloc_ctl::epoch::advance().unwrap();
|
||||
MemoryUsage {
|
||||
allocated: Bytes(jemalloc_ctl::stats::allocated::read().unwrap()),
|
||||
resident: Bytes(jemalloc_ctl::stats::resident::read().unwrap()),
|
||||
cfg_if! {
|
||||
if #[cfg(all(feature = "jemalloc", not(target_env = "msvc")))] {
|
||||
jemalloc_ctl::epoch::advance().unwrap();
|
||||
MemoryUsage {
|
||||
allocated: Bytes(jemalloc_ctl::stats::allocated::read().unwrap()),
|
||||
resident: Bytes(jemalloc_ctl::stats::resident::read().unwrap()),
|
||||
}
|
||||
} else if #[cfg(target_os = "linux")] {
|
||||
// Note: This is incredibly slow.
|
||||
let alloc = unsafe { libc::mallinfo() }.uordblks as u32 as usize;
|
||||
MemoryUsage { allocated: Bytes(alloc), resident: Bytes(0) }
|
||||
} else {
|
||||
MemoryUsage { allocated: Bytes(0), resident: Bytes(0) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(any(not(feature = "jemalloc"), target_env = "msvc"))]
|
||||
pub fn current() -> MemoryUsage {
|
||||
MemoryUsage { allocated: Bytes(0), resident: Bytes(0) }
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Display for MemoryUsage {
|
||||
|
|
Loading…
Reference in a new issue