summaryrefslogtreecommitdiff
path: root/rts/posix/OSThreads.c
diff options
context:
space:
mode:
authorGabor Pali <pgj@FreeBSD.org>2010-07-20 00:14:09 +0000
committerGabor Pali <pgj@FreeBSD.org>2010-07-20 00:14:09 +0000
commit13346da217137e4efb6cf14657960c75a23251ad (patch)
tree759e7a6f229140dc41a1551b31c418de5270fc8a /rts/posix/OSThreads.c
parent28c2bbb03ff6144f3a09e5286c8c3ca6ad3689e8 (diff)
downloadhaskell-13346da217137e4efb6cf14657960c75a23251ad.tar.gz
Add thread affinity support for FreeBSD
- Implement missing functions for setting thread affinity and getting real number of processors. - It is available starting from 7.1-RELEASE, which includes a native support for managing CPU sets. - Add __BSD_VISIBLE, since it is required for certain types to be visible in addition to POSIX & C99.
Diffstat (limited to 'rts/posix/OSThreads.c')
-rw-r--r--rts/posix/OSThreads.c33
1 files changed, 31 insertions, 2 deletions
diff --git a/rts/posix/OSThreads.c b/rts/posix/OSThreads.c
index a813eebf9e..343536e063 100644
--- a/rts/posix/OSThreads.c
+++ b/rts/posix/OSThreads.c
@@ -14,6 +14,13 @@
#endif
#include "PosixSource.h"
+
+#if defined(freebsd_HOST_OS)
+/* Inclusion of system headers usually requires __BSD_VISIBLE on FreeBSD,
+ * because of some specific types, like u_char, u_int, etc. */
+#define __BSD_VISIBLE 1
+#endif
+
#include "Rts.h"
#if defined(THREADED_RTS)
@@ -24,7 +31,7 @@
#include <string.h>
#endif
-#if defined(darwin_HOST_OS)
+#if defined(darwin_HOST_OS) || defined(freebsd_HOST_OS)
#include <sys/types.h>
#include <sys/sysctl.h>
#endif
@@ -37,6 +44,11 @@
#include <sched.h>
#endif
+#if defined(HAVE_SYS_CPUSET_H)
+#include <sys/param.h>
+#include <sys/cpuset.h>
+#endif
+
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
@@ -208,7 +220,7 @@ getNumberOfProcessors (void)
nproc = sysconf(_SC_NPROCESSORS_ONLN);
#elif defined(HAVE_SYSCONF) && defined(_SC_NPROCESSORS_CONF)
nproc = sysconf(_SC_NPROCESSORS_CONF);
-#elif defined(darwin_HOST_OS)
+#elif defined(darwin_HOST_OS) || defined(freebsd_HOST_OS)
size_t size = sizeof(nat);
if(0 != sysctlbyname("hw.ncpu",&nproc,&size,NULL,0))
nproc = 1;
@@ -253,6 +265,23 @@ setThreadAffinity (nat n, nat m GNUC3_ATTRIBUTE(__unused__))
THREAD_AFFINITY_POLICY_COUNT);
}
+#elif defined(HAVE_SYS_CPUSET_H) /* FreeBSD 7.1+ */
+void
+setThreadAffinity(nat n, nat m)
+{
+ nat nproc;
+ cpuset_t cs;
+ nat i;
+
+ nproc = getNumberOfProcessors();
+ CPU_ZERO(&cs);
+
+ for (i = n; i < nproc; i += m)
+ CPU_SET(i, &cs);
+
+ cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID, -1, sizeof(cpuset_t), &cs);
+}
+
#else
void
setThreadAffinity (nat n GNUC3_ATTRIBUTE(__unused__),