22 * system_info.c — CPU core count and RAM detection.
33 *
44 * macOS: sysctlbyname for core counts, hw.memsize for RAM.
5+ * BSD: sysconf + sysctl(HW_PHYSMEM64 / HW_PHYSMEM).
56 * Linux: sysconf + sysinfo().
67 * Windows: GetSystemInfo + GlobalMemoryStatusEx.
78 *
@@ -21,7 +22,11 @@ enum { DEFAULT_CORES = 1, MIN_WORKERS = 1 };
2122#include <windows.h>
2223#elif defined(__APPLE__ )
2324#include <sys/sysctl.h>
24- #elif !defined(_WIN32 ) /* Linux */
25+ #elif defined(__NetBSD__ ) || defined(__FreeBSD__ ) || defined(__OpenBSD__ )
26+ #include <unistd.h>
27+ #include <sys/types.h>
28+ #include <sys/sysctl.h>
29+ #else /* Linux */
2530#include <unistd.h>
2631#include <sys/sysinfo.h>
2732
@@ -72,7 +77,31 @@ static cbm_system_info_t detect_system_macos(void) {
7277 return info ;
7378}
7479
75- #elif !defined(_WIN32 ) /* Linux */
80+ #elif defined(__NetBSD__ ) || defined(__FreeBSD__ ) || defined(__OpenBSD__ )
81+
82+ static cbm_system_info_t detect_system_bsd (void ) {
83+ cbm_system_info_t info ;
84+ memset (& info , 0 , sizeof (info ));
85+
86+ long nprocs = sysconf (_SC_NPROCESSORS_ONLN );
87+ info .total_cores = nprocs > 0 ? (int )nprocs : 1 ;
88+ info .perf_cores = info .total_cores ;
89+
90+ #if defined(__OpenBSD__ )
91+ int mib [2 ] = { CTL_HW , HW_PHYSMEM };
92+ #else
93+ int mib [2 ] = { CTL_HW , HW_PHYSMEM64 };
94+ #endif
95+ uint64_t physmem = 0 ;
96+ size_t len = sizeof (physmem );
97+ if (sysctl (mib , 2 , & physmem , & len , NULL , 0 ) == 0 && physmem > 0 ) {
98+ info .total_ram = (size_t )physmem ;
99+ }
100+
101+ return info ;
102+ }
103+
104+ #else /* Linux */
76105
77106static cbm_system_info_t detect_system_linux (void ) {
78107 cbm_system_info_t info ;
@@ -90,7 +119,7 @@ static cbm_system_info_t detect_system_linux(void) {
90119 return info ;
91120}
92121
93- #endif /* __APPLE__ / Linux */
122+ #endif /* __APPLE__ / BSD / Linux */
94123
95124/* ── Windows detection ───────────────────────────────────────────── */
96125
@@ -128,6 +157,8 @@ cbm_system_info_t cbm_system_info(void) {
128157 cached_info = detect_system_windows ();
129158#elif defined(__APPLE__ )
130159 cached_info = detect_system_macos ();
160+ #elif defined(__NetBSD__ ) || defined(__FreeBSD__ ) || defined(__OpenBSD__ )
161+ cached_info = detect_system_bsd ();
131162#else
132163 cached_info = detect_system_linux ();
133164#endif
0 commit comments