base/sys/linux/
priority.rs

1// Copyright 2018 The ChromiumOS Authors
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use std::mem::MaybeUninit;
6
7use super::errno_result;
8use super::Result;
9
10/// Enables real time thread priorities in the current thread up to `limit`.
11pub fn set_rt_prio_limit(limit: u64) -> Result<()> {
12    let rt_limit_arg = libc::rlimit64 {
13        rlim_cur: limit,
14        rlim_max: limit,
15    };
16    // SAFETY:
17    // Safe because the kernel doesn't modify memory that is accessible to the process here.
18    let res = unsafe { libc::setrlimit64(libc::RLIMIT_RTPRIO, &rt_limit_arg) };
19
20    if res != 0 {
21        errno_result()
22    } else {
23        Ok(())
24    }
25}
26
27/// Sets the current thread to be scheduled using the round robin real time class with `priority`.
28pub fn set_rt_round_robin(priority: i32) -> Result<()> {
29    // SAFETY:
30    // Safe because sched_param only contains primitive types for which zero
31    // initialization is valid.
32    let mut sched_param: libc::sched_param = unsafe { MaybeUninit::zeroed().assume_init() };
33    sched_param.sched_priority = priority;
34
35    let res =
36        // SAFETY:
37        // Safe because the kernel doesn't modify memory that is accessible to the process here.
38        unsafe { libc::pthread_setschedparam(libc::pthread_self(), libc::SCHED_RR, &sched_param) };
39
40    if res != 0 {
41        errno_result()
42    } else {
43        Ok(())
44    }
45}