aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_prof
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2020-07-30 08:47:16 +0100
committerAleksey Kladov <[email protected]>2020-07-30 08:57:36 +0100
commitafab67e69c39027fb99878751309d4050324beef (patch)
treef21490b1f28db69d5d8132c245cf1df7ee1e48bb /crates/ra_prof
parentdae99b66611759ba48fd164646f077d3e8515dad (diff)
Allow negative bytes
Gotta be optimistic about those memory usage optimizations
Diffstat (limited to 'crates/ra_prof')
-rw-r--r--crates/ra_prof/src/memory_usage.rs32
1 files changed, 20 insertions, 12 deletions
diff --git a/crates/ra_prof/src/memory_usage.rs b/crates/ra_prof/src/memory_usage.rs
index 857b51321..22b61e4a2 100644
--- a/crates/ra_prof/src/memory_usage.rs
+++ b/crates/ra_prof/src/memory_usage.rs
@@ -3,16 +3,30 @@ 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} 9}
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 }
22}
23
10impl MemoryUsage { 24impl MemoryUsage {
11 pub fn current() -> MemoryUsage { 25 pub fn current() -> MemoryUsage {
12 cfg_if! { 26 cfg_if! {
13 if #[cfg(target_os = "linux")] { 27 if #[cfg(target_os = "linux")] {
14 // Note: This is incredibly slow. 28 // Note: This is incredibly slow.
15 let alloc = unsafe { libc::mallinfo() }.uordblks as u32 as usize; 29 let alloc = unsafe { libc::mallinfo() }.uordblks as u32 as isize;
16 MemoryUsage { allocated: Bytes(alloc) } 30 MemoryUsage { allocated: Bytes(alloc) }
17 } else { 31 } else {
18 MemoryUsage { allocated: Bytes(0) } 32 MemoryUsage { allocated: Bytes(0) }
@@ -21,17 +35,11 @@ impl MemoryUsage {
21 } 35 }
22} 36}
23 37
24impl fmt::Display for MemoryUsage {
25 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
26 write!(fmt, "{}", self.allocated)
27 }
28}
29
30#[derive(Default, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)] 38#[derive(Default, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)]
31pub struct Bytes(usize); 39pub struct Bytes(isize);
32 40
33impl Bytes { 41impl Bytes {
34 pub fn megabytes(self) -> usize { 42 pub fn megabytes(self) -> isize {
35 self.0 / 1024 / 1024 43 self.0 / 1024 / 1024
36 } 44 }
37} 45}
@@ -41,10 +49,10 @@ impl fmt::Display for Bytes {
41 let bytes = self.0; 49 let bytes = self.0;
42 let mut value = bytes; 50 let mut value = bytes;
43 let mut suffix = "b"; 51 let mut suffix = "b";
44 if value > 4096 { 52 if value.abs() > 4096 {
45 value /= 1024; 53 value /= 1024;
46 suffix = "kb"; 54 suffix = "kb";
47 if value > 4096 { 55 if value.abs() > 4096 {
48 value /= 1024; 56 value /= 1024;
49 suffix = "mb"; 57 suffix = "mb";
50 } 58 }
@@ -55,7 +63,7 @@ impl fmt::Display for Bytes {
55 63
56impl std::ops::AddAssign<usize> for Bytes { 64impl std::ops::AddAssign<usize> for Bytes {
57 fn add_assign(&mut self, x: usize) { 65 fn add_assign(&mut self, x: usize) {
58 self.0 += x; 66 self.0 += x as isize;
59 } 67 }
60} 68}
61 69