summaryrefslogtreecommitdiff
path: root/library/std/src/sys/unix/thread.rs
diff options
context:
space:
mode:
Diffstat (limited to 'library/std/src/sys/unix/thread.rs')
-rw-r--r--library/std/src/sys/unix/thread.rs19
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);