Add support for auto thread selection on BSD
diff --git a/src/cpu.c b/src/cpu.c
index 0aa9024..c003011 100644
--- a/src/cpu.c
+++ b/src/cpu.c
@@ -33,12 +33,19 @@
 
 #ifdef _WIN32
 #include <windows.h>
-#elif defined(__linux__)
-#include <sched.h>
-#include <unistd.h>
 #elif defined(__APPLE__)
 #include <sys/sysctl.h>
 #include <sys/types.h>
+#else
+#include <pthread.h>
+#include <unistd.h>
+#endif
+
+#if defined(__DragonFly__) || defined(__FreeBSD__)
+#include <pthread_np.h>
+#endif
+#if defined(__FreeBSD__)
+#define cpu_set_t cpuset_t
 #endif
 
 static unsigned flags = 0;
@@ -88,19 +95,17 @@
     GetNativeSystemInfo(&system_info);
     return system_info.dwNumberOfProcessors;
 #endif
-#elif defined(__linux__)
-#ifdef CPU_COUNT
+#elif (defined(__linux__) || defined(__DragonFly__) || defined(__FreeBSD__)) && defined(CPU_COUNT)
     cpu_set_t affinity;
-    if (!sched_getaffinity(0, sizeof(affinity), &affinity))
+    if (!pthread_getaffinity_np(pthread_self(), sizeof(affinity), &affinity))
         return CPU_COUNT(&affinity);
-#else
-    return (int)sysconf(_SC_NPROCESSORS_ONLN);
-#endif
 #elif defined(__APPLE__)
     int num_processors;
     size_t length = sizeof(num_processors);
     if (!sysctlbyname("hw.logicalcpu", &num_processors, &length, NULL, 0))
         return num_processors;
+#elif defined(_SC_NPROCESSORS_ONLN)
+    return (int)sysconf(_SC_NPROCESSORS_ONLN);
 #endif
     dav1d_log(c, "Unable to detect thread count, defaulting to single-threaded mode\n");
     return 1;