diff options
| author | Thomas Hurst <tom@hur.st> | 2023-04-25 20:59:50 +0000 |
|---|---|---|
| committer | Thomas Hurst <tom@hur.st> | 2023-04-25 20:59:50 +0000 |
| commit | e5e640cacef51e401286f93388002f41e8ef3328 (patch) | |
| tree | 8b3fc326b3d39a457db244dabb01a1325ecabf71 /library/std/src | |
| parent | 20d90b14ffe8c667757a70c08e2d9736ee89f493 (diff) | |
| download | rust-e5e640cacef51e401286f93388002f41e8ef3328.tar.gz rust-e5e640cacef51e401286f93388002f41e8ef3328.zip | |
Add FreeBSD cpuset support to std::thread::available_concurrency
Use libc::cpuset_getaffinity to determine the CPUs available to the current process. The existing sysconf and sysctl paths are left as fallback.
Diffstat (limited to 'library/std/src')
| -rw-r--r-- | library/std/src/sys/unix/thread.rs | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/library/std/src/sys/unix/thread.rs b/library/std/src/sys/unix/thread.rs index 15070b1f6a7..7307d9b2c86 100644 --- a/library/std/src/sys/unix/thread.rs +++ b/library/std/src/sys/unix/thread.rs @@ -326,6 +326,25 @@ pub fn available_parallelism() -> io::Result<NonZeroUsize> { } else if #[cfg(any(target_os = "freebsd", target_os = "dragonfly", 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)); + } + } + } + } + let mut cpus: libc::c_uint = 0; let mut cpus_size = crate::mem::size_of_val(&cpus); |
