aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_prof/src/memory_usage.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_prof/src/memory_usage.rs')
-rw-r--r--crates/ra_prof/src/memory_usage.rs37
1 files changed, 22 insertions, 15 deletions
diff --git a/crates/ra_prof/src/memory_usage.rs b/crates/ra_prof/src/memory_usage.rs
index 745345fac..c2ecbd33c 100644
--- a/crates/ra_prof/src/memory_usage.rs
+++ b/crates/ra_prof/src/memory_usage.rs
@@ -3,9 +3,22 @@ use std::fmt;
3 3
4use cfg_if::cfg_if; 4use cfg_if::cfg_if;
5 5
6#[derive(Copy, Clone)]
6pub struct MemoryUsage { 7pub struct MemoryUsage {
7 pub allocated: Bytes, 8 pub allocated: Bytes,
8 pub resident: Bytes, 9}
10
11impl fmt::Display for MemoryUsage {
12 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
13 write!(fmt, "{}", self.allocated)
14 }
15}
16
17impl std::ops::Sub for MemoryUsage {
18 type Output = MemoryUsage;
19 fn sub(self, rhs: MemoryUsage) -> MemoryUsage {
20 MemoryUsage { allocated: self.allocated - rhs.allocated }
21 }
9} 22}
10 23
11impl MemoryUsage { 24impl MemoryUsage {
@@ -13,26 +26,20 @@ impl MemoryUsage {
13 cfg_if! { 26 cfg_if! {
14 if #[cfg(target_os = "linux")] { 27 if #[cfg(target_os = "linux")] {
15 // Note: This is incredibly slow. 28 // Note: This is incredibly slow.
16 let alloc = unsafe { libc::mallinfo() }.uordblks as u32 as usize; 29 let alloc = unsafe { libc::mallinfo() }.uordblks as isize;
17 MemoryUsage { allocated: Bytes(alloc), resident: Bytes(0) } 30 MemoryUsage { allocated: Bytes(alloc) }
18 } else { 31 } else {
19 MemoryUsage { allocated: Bytes(0), resident: Bytes(0) } 32 MemoryUsage { allocated: Bytes(0) }
20 } 33 }
21 } 34 }
22 } 35 }
23} 36}
24 37
25impl fmt::Display for MemoryUsage {
26 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
27 write!(fmt, "{} allocated {} resident", self.allocated, self.resident,)
28 }
29}
30
31#[derive(Default, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)] 38#[derive(Default, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)]
32pub struct Bytes(usize); 39pub struct Bytes(isize);
33 40
34impl Bytes { 41impl Bytes {
35 pub fn megabytes(self) -> usize { 42 pub fn megabytes(self) -> isize {
36 self.0 / 1024 / 1024 43 self.0 / 1024 / 1024
37 } 44 }
38} 45}
@@ -42,10 +49,10 @@ impl fmt::Display for Bytes {
42 let bytes = self.0; 49 let bytes = self.0;
43 let mut value = bytes; 50 let mut value = bytes;
44 let mut suffix = "b"; 51 let mut suffix = "b";
45 if value > 4096 { 52 if value.abs() > 4096 {
46 value /= 1024; 53 value /= 1024;
47 suffix = "kb"; 54 suffix = "kb";
48 if value > 4096 { 55 if value.abs() > 4096 {
49 value /= 1024; 56 value /= 1024;
50 suffix = "mb"; 57 suffix = "mb";
51 } 58 }
@@ -56,7 +63,7 @@ impl fmt::Display for Bytes {
56 63
57impl std::ops::AddAssign<usize> for Bytes { 64impl std::ops::AddAssign<usize> for Bytes {
58 fn add_assign(&mut self, x: usize) { 65 fn add_assign(&mut self, x: usize) {
59 self.0 += x; 66 self.0 += x as isize;
60 } 67 }
61} 68}
62 69