diff options
author | Nicholas Nethercote <nnethercote@mozilla.com> | 2014-07-08 10:50:25 +1000 |
---|---|---|
committer | Nicholas Nethercote <nnethercote@mozilla.com> | 2014-07-08 10:58:07 +1000 |
commit | 24d3979ce871dba7f20168dd0aebe5abd69644e7 (patch) | |
tree | 457dc7fb0589a2c1467be33c162fd1d7bc08b151 /src/platform/macos/rust-task_info/task_basic_info.rs | |
parent | f8fbf557f12a99128c9b86b06afe6ce9a916d434 (diff) | |
download | servo-24d3979ce871dba7f20168dd0aebe5abd69644e7.tar.gz servo-24d3979ce871dba7f20168dd0aebe5abd69644e7.zip |
Add a `task_info` crate and a `task_basic_info` module within it.
The crate provides an interface to the Mac-specific `task_info()`
function in general, and the module provides an interface to the
TASK_BASIC_INFO flavor. Currently only the `virtual_size` and
`resident_size` values of the `task_basic_info` struct are exposed, but
there's obvious room for expansion.
This is used to implement the -m measurements on Mac.
Diffstat (limited to 'src/platform/macos/rust-task_info/task_basic_info.rs')
-rw-r--r-- | src/platform/macos/rust-task_info/task_basic_info.rs | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/platform/macos/rust-task_info/task_basic_info.rs b/src/platform/macos/rust-task_info/task_basic_info.rs new file mode 100644 index 00000000000..9d87ac7bc20 --- /dev/null +++ b/src/platform/macos/rust-task_info/task_basic_info.rs @@ -0,0 +1,55 @@ +// Copyright 2014 The Servo Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +//! Interface to the measurements in the task_basic_info struct, gathered by +//! invoking `task_info()` with the `TASK_BASIC_INFO` flavor. + +use libc::{c_int,uint64_t}; + +/// Obtains task_basic_info::virtual_size. +pub fn virtual_size() -> Option<u64> { + let mut virtual_size: u64 = 0; + let mut rv; + unsafe { + rv = TaskBasicInfoVirtualSize(&mut virtual_size); + } + if rv == 0 { Some(virtual_size) } else { None } +} + +/// Obtains task_basic_info::resident_size. +pub fn resident_size() -> Option<u64> { + let mut resident_size: u64 = 0; + let mut rv; + unsafe { + rv = TaskBasicInfoResidentSize(&mut resident_size); + } + if rv == 0 { Some(resident_size) } else { None } +} + +#[link(name = "task_info")] +extern { + fn TaskBasicInfoVirtualSize(virtual_size: *mut uint64_t) -> c_int; + fn TaskBasicInfoResidentSize(resident_size: *mut uint64_t) -> c_int; +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_stuff() { + // In theory these can fail to return a value, but in practice they + // don't unless something really bizarre has happened with the OS. So + // assume they succeed. The returned values are non-deterministic, but + // check they're non-zero as a basic sanity test. + assert!(virtual_size().unwrap() > 0); + assert!(resident_size().unwrap() > 0); + } +} + |