aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicholas Nethercote <nnethercote@mozilla.com>2015-08-14 00:04:06 -0700
committerNicholas Nethercote <nnethercote@mozilla.com>2015-08-14 00:05:17 -0700
commit77fadb7054abd60e1caf873a13c5a29be7f353ca (patch)
tree139fe7f275f87b16af78f04eb418f1ca0c1a8d41
parenta35360aa31983aad45bdae634c80a24682cb8318 (diff)
downloadservo-77fadb7054abd60e1caf873a13c5a29be7f353ca.tar.gz
servo-77fadb7054abd60e1caf873a13c5a29be7f353ca.zip
Tweak how the "system-heap-allocated" memory report is gathered.
-rw-r--r--components/profile/mem.rs23
1 files changed, 15 insertions, 8 deletions
diff --git a/components/profile/mem.rs b/components/profile/mem.rs
index b04ced9905a..598acfb04e8 100644
--- a/components/profile/mem.rs
+++ b/components/profile/mem.rs
@@ -440,14 +440,21 @@ mod system_reporter {
#[cfg(target_os="linux")]
fn get_system_heap_allocated() -> Option<usize> {
- let info: struct_mallinfo = unsafe {
- mallinfo()
- };
- // The documentation in the glibc man page makes it sound like |uordblks|
- // would suffice, but that only gets the small allocations that are put in
- // the brk heap. We need |hblkhd| as well to get the larger allocations
- // that are mmapped.
- Some((info.hblkhd + info.uordblks) as usize)
+ let info: struct_mallinfo = unsafe { mallinfo() };
+
+ // The documentation in the glibc man page makes it sound like |uordblks| would suffice,
+ // but that only gets the small allocations that are put in the brk heap. We need |hblkhd|
+ // as well to get the larger allocations that are mmapped.
+ //
+ // These fields are unfortunately |int| and so can overflow (becoming negative) if memory
+ // usage gets high enough. So don't report anything in that case. In the non-overflow case
+ // we cast the two values to usize before adding them to make sure the sum also doesn't
+ // overflow.
+ if info.hblkhd < 0 || info.uordblks < 0 {
+ None
+ } else {
+ Some(info.hblkhd as usize + info.uordblks as usize)
+ }
}
#[cfg(not(target_os="linux"))]