Skip to content

Commit 9b4d979

Browse files
committed
Avoid mem::uninitialized in the demo cpu_time
For both Unix `getrusage` and Windows `GetProcessTimes`, we can pass `MaybeUninit` pointers to those FFI calls and `assume_init()` afterward.
1 parent 5a46643 commit 9b4d979

File tree

2 files changed

+35
-23
lines changed

2 files changed

+35
-23
lines changed

rayon-demo/src/cpu_time/unix.rs

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
1-
use libc::{getrusage, rusage, RUSAGE_SELF};
2-
use std::mem;
1+
use libc::{getrusage, RUSAGE_SELF};
2+
use std::mem::MaybeUninit;
33

44
pub fn get_cpu_time() -> Option<u64> {
5-
unsafe {
6-
let mut usage: rusage = mem::uninitialized();
7-
getrusage(RUSAGE_SELF, &mut usage);
8-
let user = 1_000_000_000 * (usage.ru_utime.tv_sec as u64)
9-
+ 1_000 * (usage.ru_utime.tv_usec as u64);
10-
let system = 1_000_000_000 * (usage.ru_stime.tv_sec as u64)
11-
+ 1_000 * (usage.ru_stime.tv_usec as u64);
12-
Some(user + system)
13-
}
5+
let usage = unsafe {
6+
let mut usage = MaybeUninit::uninit();
7+
if getrusage(RUSAGE_SELF, usage.as_mut_ptr()) != 0 {
8+
return None;
9+
}
10+
usage.assume_init()
11+
};
12+
let user =
13+
1_000_000_000 * (usage.ru_utime.tv_sec as u64) + 1_000 * (usage.ru_utime.tv_usec as u64);
14+
let system =
15+
1_000_000_000 * (usage.ru_stime.tv_sec as u64) + 1_000 * (usage.ru_stime.tv_usec as u64);
16+
Some(user + system)
1417
}

rayon-demo/src/cpu_time/win.rs

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,26 @@
1-
use std::mem;
2-
use winapi::shared::minwindef::FILETIME;
1+
use std::mem::MaybeUninit;
32
use winapi::um::processthreadsapi::{GetCurrentProcess, GetProcessTimes};
43

54
pub fn get_cpu_time() -> Option<u64> {
6-
unsafe {
5+
let (kernel, user) = unsafe {
76
let process = GetCurrentProcess();
8-
let mut _creation: FILETIME = mem::uninitialized();
9-
let mut _exit: FILETIME = mem::uninitialized();
10-
let mut kernel: FILETIME = mem::uninitialized();
11-
let mut user: FILETIME = mem::uninitialized();
12-
GetProcessTimes(process, &mut _creation, &mut _exit, &mut kernel, &mut user);
13-
let kernel = (kernel.dwHighDateTime as u64) << 32 | kernel.dwLowDateTime as u64;
14-
let user = (user.dwHighDateTime as u64) << 32 | user.dwLowDateTime as u64;
15-
Some(100 * (kernel + user))
16-
}
7+
let mut _creation = MaybeUninit::uninit();
8+
let mut _exit = MaybeUninit::uninit();
9+
let mut kernel = MaybeUninit::uninit();
10+
let mut user = MaybeUninit::uninit();
11+
if GetProcessTimes(
12+
process,
13+
_creation.as_mut_ptr(),
14+
_exit.as_mut_ptr(),
15+
kernel.as_mut_ptr(),
16+
user.as_mut_ptr(),
17+
) == 0
18+
{
19+
return None;
20+
}
21+
(kernel.assume_init(), user.assume_init())
22+
};
23+
let kernel = (kernel.dwHighDateTime as u64) << 32 | kernel.dwLowDateTime as u64;
24+
let user = (user.dwHighDateTime as u64) << 32 | user.dwLowDateTime as u64;
25+
Some(100 * (kernel + user))
1726
}

0 commit comments

Comments
 (0)