about summary refs log tree commit diff
path: root/library/std/src
diff options
context:
space:
mode:
authorThomas Hurst <tom@hur.st>2023-04-25 20:59:50 +0000
committerThomas Hurst <tom@hur.st>2023-04-25 20:59:50 +0000
commite5e640cacef51e401286f93388002f41e8ef3328 (patch)
tree8b3fc326b3d39a457db244dabb01a1325ecabf71 /library/std/src
parent20d90b14ffe8c667757a70c08e2d9736ee89f493 (diff)
downloadrust-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.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);