-
Notifications
You must be signed in to change notification settings - Fork 654
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
922: Add a sysinfo wrapper r=asomers a=jonas-schievink Closes #505 Returned values were also inspected manually to be correct. Co-authored-by: Jonas Schievink <jonasschievink@gmail.com>
- Loading branch information
Showing
5 changed files
with
98 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
use libc::{self, SI_LOAD_SHIFT}; | ||
use std::{cmp, mem}; | ||
use std::time::Duration; | ||
|
||
use Result; | ||
use errno::Errno; | ||
|
||
/// System info structure returned by `sysinfo`. | ||
#[derive(Copy, Clone)] | ||
#[allow(missing_debug_implementations)] // libc::sysinfo doesn't impl Debug | ||
pub struct SysInfo(libc::sysinfo); | ||
|
||
impl SysInfo { | ||
/// Returns the load average tuple. | ||
/// | ||
/// The returned values represent the load average over time intervals of | ||
/// 1, 5, and 15 minutes, respectively. | ||
pub fn load_average(&self) -> (f64, f64, f64) { | ||
( | ||
self.0.loads[0] as f64 / (1 << SI_LOAD_SHIFT) as f64, | ||
self.0.loads[1] as f64 / (1 << SI_LOAD_SHIFT) as f64, | ||
self.0.loads[2] as f64 / (1 << SI_LOAD_SHIFT) as f64, | ||
) | ||
} | ||
|
||
/// Returns the time since system boot. | ||
pub fn uptime(&self) -> Duration { | ||
// Truncate negative values to 0 | ||
Duration::from_secs(cmp::max(self.0.uptime, 0) as u64) | ||
} | ||
|
||
/// Current number of processes. | ||
pub fn process_count(&self) -> u16 { | ||
self.0.procs | ||
} | ||
|
||
/// Returns the amount of swap memory in Bytes. | ||
pub fn swap_total(&self) -> u64 { | ||
self.scale_mem(self.0.totalswap) | ||
} | ||
|
||
/// Returns the amount of unused swap memory in Bytes. | ||
pub fn swap_free(&self) -> u64 { | ||
self.scale_mem(self.0.freeswap) | ||
} | ||
|
||
/// Returns the total amount of installed RAM in Bytes. | ||
pub fn ram_total(&self) -> u64 { | ||
self.scale_mem(self.0.totalram) | ||
} | ||
|
||
/// Returns the amount of completely unused RAM in Bytes. | ||
/// | ||
/// "Unused" in this context means that the RAM in neither actively used by | ||
/// programs, nor by the operating system as disk cache or buffer. It is | ||
/// "wasted" RAM since it currently serves no purpose. | ||
pub fn ram_unused(&self) -> u64 { | ||
self.scale_mem(self.0.freeram) | ||
} | ||
|
||
fn scale_mem(&self, units: libc::c_ulong) -> u64 { | ||
units as u64 * self.0.mem_unit as u64 | ||
} | ||
} | ||
|
||
/// Returns system information. | ||
/// | ||
/// [See `sysinfo(2)`](http://man7.org/linux/man-pages/man2/sysinfo.2.html). | ||
pub fn sysinfo() -> Result<SysInfo> { | ||
let mut info: libc::sysinfo = unsafe { mem::uninitialized() }; | ||
let res = unsafe { libc::sysinfo(&mut info) }; | ||
Errno::result(res).map(|_| SysInfo(info)) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
use nix::sys::sysinfo::*; | ||
|
||
#[test] | ||
fn sysinfo_works() { | ||
let info = sysinfo().unwrap(); | ||
|
||
let (l1, l5, l15) = info.load_average(); | ||
assert!(l1 >= 0.0); | ||
assert!(l5 >= 0.0); | ||
assert!(l15 >= 0.0); | ||
|
||
info.uptime(); // just test Duration construction | ||
|
||
assert!(info.swap_free() <= info.swap_total(), | ||
"more swap available than installed (free: {}, total: {})", | ||
info.swap_free(), | ||
info.swap_total()); | ||
} |