Skip to content

Commit

Permalink
std::thread::available_parallelism merging linux/android/freebsd version
Browse files Browse the repository at this point in the history
FreeBSD 13.1 had introduced a sched cpu affinity compatibility layer
with Linux. 13.0 and even 13.1 being EOL, we can simplify here.
  • Loading branch information
devnexen committed Feb 2, 2024
1 parent bf3c6c5 commit 8e12778
Showing 1 changed file with 16 additions and 30 deletions.
46 changes: 16 additions & 30 deletions library/std/src/sys/pal/unix/thread.rs
Original file line number Diff line number Diff line change
Expand Up @@ -320,19 +320,22 @@ pub fn available_parallelism() -> io::Result<NonZeroUsize> {
target_os = "solaris",
target_os = "illumos",
target_os = "aix",
target_os = "freebsd",
))] {
#[allow(unused_assignments)]
#[allow(unused_mut)]
let mut quota = usize::MAX;

#[cfg(any(target_os = "android", target_os = "linux"))]
#[cfg(any(target_os = "android", target_os = "linux", target_os = "freebsd"))]
{
quota = cgroups::quota().max(1);
let mut set: libc::cpu_set_t = unsafe { mem::zeroed() };
#[cfg(not(target_os = "freebsd"))]
type cpuset = libc::cpu_set_t;
#[cfg(target_os = "freebsd")]
type cpuset = libc::cpuset_t;
let mut set: cpuset = unsafe { mem::zeroed() };
unsafe {
if libc::sched_getaffinity(0, mem::size_of::<libc::cpu_set_t>(), &mut set) == 0 {
if libc::sched_getaffinity(0, mem::size_of::<cpuset>(), &mut set) == 0 {
let count = libc::CPU_COUNT(&set) as usize;
let count = count.min(quota);
#[cfg(not(target_os = "freebsd"))]
let count = count.min(cgroups::quota().max(1));
#[cfg(target_os = "freebsd")]
let count = count.min(usize::MAX);

// According to sched_getaffinity's API it should always be non-zero, but
// some old MIPS kernels were buggy and zero-initialized the mask if
Expand All @@ -350,37 +353,20 @@ pub fn available_parallelism() -> io::Result<NonZeroUsize> {
cpus => {
let count = cpus as usize;
// Cover the unusual situation where we were able to get the quota but not the affinity mask
let count = count.min(quota);
#[cfg(any(target_os = "linux", target_os = "android"))]
let count = count.min(cgroups::quota().max(1));
#[cfg(not(any(target_os = "linux", target_os = "android")))]
let count = count.min(usize::MAX);
Ok(unsafe { NonZeroUsize::new_unchecked(count) })
}
}
} else if #[cfg(any(
target_os = "freebsd",
target_os = "dragonfly",
target_os = "openbsd",
target_os = "netbsd",
))] {
use crate::ptr;

#[cfg(target_os = "freebsd")]
{
let mut set: libc::cpuset_t = unsafe { mem::zeroed() };
unsafe {
if libc::cpuset_getaffinity(
libc::CPU_LEVEL_WHICH,
libc::CPU_WHICH_PID,
-1,
mem::size_of::<libc::cpuset_t>(),
&mut set,
) == 0 {
let count = libc::CPU_COUNT(&set) as usize;
if count > 0 {
return Ok(NonZeroUsize::new_unchecked(count));
}
}
}
}

#[cfg(target_os = "netbsd")]
{
unsafe {
Expand Down

0 comments on commit 8e12778

Please sign in to comment.