Skip to content

Commit

Permalink
Avoid mem::uninitialized in the demo cpu_time
Browse files Browse the repository at this point in the history
For both Unix `getrusage` and Windows `GetProcessTimes`, we can pass
`MaybeUninit` pointers to those FFI calls and `assume_init()` afterward.
  • Loading branch information
cuviper committed Nov 20, 2019
1 parent 5a46643 commit 9b4d979
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 23 deletions.
25 changes: 14 additions & 11 deletions rayon-demo/src/cpu_time/unix.rs
@@ -1,14 +1,17 @@
use libc::{getrusage, rusage, RUSAGE_SELF};
use std::mem;
use libc::{getrusage, RUSAGE_SELF};
use std::mem::MaybeUninit;

pub fn get_cpu_time() -> Option<u64> {
unsafe {
let mut usage: rusage = mem::uninitialized();
getrusage(RUSAGE_SELF, &mut usage);
let user = 1_000_000_000 * (usage.ru_utime.tv_sec as u64)
+ 1_000 * (usage.ru_utime.tv_usec as u64);
let system = 1_000_000_000 * (usage.ru_stime.tv_sec as u64)
+ 1_000 * (usage.ru_stime.tv_usec as u64);
Some(user + system)
}
let usage = unsafe {
let mut usage = MaybeUninit::uninit();
if getrusage(RUSAGE_SELF, usage.as_mut_ptr()) != 0 {
return None;
}
usage.assume_init()
};
let user =
1_000_000_000 * (usage.ru_utime.tv_sec as u64) + 1_000 * (usage.ru_utime.tv_usec as u64);
let system =
1_000_000_000 * (usage.ru_stime.tv_sec as u64) + 1_000 * (usage.ru_stime.tv_usec as u64);
Some(user + system)
}
33 changes: 21 additions & 12 deletions rayon-demo/src/cpu_time/win.rs
@@ -1,17 +1,26 @@
use std::mem;
use winapi::shared::minwindef::FILETIME;
use std::mem::MaybeUninit;
use winapi::um::processthreadsapi::{GetCurrentProcess, GetProcessTimes};

pub fn get_cpu_time() -> Option<u64> {
unsafe {
let (kernel, user) = unsafe {
let process = GetCurrentProcess();
let mut _creation: FILETIME = mem::uninitialized();
let mut _exit: FILETIME = mem::uninitialized();
let mut kernel: FILETIME = mem::uninitialized();
let mut user: FILETIME = mem::uninitialized();
GetProcessTimes(process, &mut _creation, &mut _exit, &mut kernel, &mut user);
let kernel = (kernel.dwHighDateTime as u64) << 32 | kernel.dwLowDateTime as u64;
let user = (user.dwHighDateTime as u64) << 32 | user.dwLowDateTime as u64;
Some(100 * (kernel + user))
}
let mut _creation = MaybeUninit::uninit();
let mut _exit = MaybeUninit::uninit();
let mut kernel = MaybeUninit::uninit();
let mut user = MaybeUninit::uninit();
if GetProcessTimes(
process,
_creation.as_mut_ptr(),
_exit.as_mut_ptr(),
kernel.as_mut_ptr(),
user.as_mut_ptr(),
) == 0
{
return None;
}
(kernel.assume_init(), user.assume_init())
};
let kernel = (kernel.dwHighDateTime as u64) << 32 | kernel.dwLowDateTime as u64;
let user = (user.dwHighDateTime as u64) << 32 | user.dwLowDateTime as u64;
Some(100 * (kernel + user))
}

0 comments on commit 9b4d979

Please sign in to comment.