summaryrefslogtreecommitdiff
path: root/src/system.c
diff options
context:
space:
mode:
authorAndreas Baumann <abaumann@yahoo.com>2014-11-14 10:07:12 +0100
committerAndreas Baumann <abaumann@yahoo.com>2014-11-14 10:07:12 +0100
commit97265e0f6a8165159a6e3cef5623db29632e3bc8 (patch)
treee9c51cb3d7e2b7728c946de13c4b6f9161ef4bf2 /src/system.c
parent7342b11a3c12f48b44597232723304150e868328 (diff)
downloadbiruda-97265e0f6a8165159a6e3cef5623db29632e3bc8.tar.gz
biruda-97265e0f6a8165159a6e3cef5623db29632e3bc8.tar.bz2
fixed for FreeBSD
Diffstat (limited to 'src/system.c')
-rw-r--r--src/system.c29
1 files changed, 26 insertions, 3 deletions
diff --git a/src/system.c b/src/system.c
index 7ce5f83..5a62242 100644
--- a/src/system.c
+++ b/src/system.c
@@ -6,9 +6,15 @@
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#else
+#ifdef __FreeBSD__
+#include <sys/param.h>
+#include <sys/sysctl.h>
+#include <sys/utsname.h>
+#else /* __FreeBSD__ */
#include <unistd.h>
#include <sys/utsname.h>
-#endif
+#endif /* __FreeBSD__ */
+#endif /* _WIN32 */
#include <stdio.h>
#include <string.h>
@@ -16,11 +22,27 @@
unsigned int system_available_cpus( void )
{
+ // operating specific cases
#ifdef _WIN32
SYSTEM_INFO info;
GetSystemInfo( &info );
return info.dwNumberOfProcessors;
#else
+#ifdef __FreeBSD__
+ int req[2];
+ req[0] = CTL_HW;
+ req[1] = HW_NCPU;
+ int nprocs;
+ size_t len = sizeof( nprocs );
+ if( sysctl( req, 2, &nprocs, &len, NULL, 0 ) < 0 ) {
+ // assuming one CPU in case of error
+ // (safe fallback)
+ return 1;
+ }
+ return nprocs;
+#else // __FreeBSD__
+
+ // generic POSIX case
#ifdef _SC_NPROCESSORS_ONLN
long nprocs = sysconf( _SC_NPROCESSORS_ONLN );
if( nprocs < -1 ) {
@@ -31,8 +53,9 @@ unsigned int system_available_cpus( void )
return nprocs;
#else
#error No _SC_NPROCESSORS_ONLN, must port first!
-#endif
-#endif
+#endif // _SC_NPROCESSORS_ONLN
+#endif // __FreeBSD__
+#endif // _WIN32
}
void system_os( char *name, size_t len )