158 lines
3.9 KiB
Diff
158 lines
3.9 KiB
Diff
diff --git a/includes/rts/OSThreads.h b/includes/rts/OSThreads.h
|
|
--- a/includes/rts/OSThreads.h
|
|
+++ b/includes/rts/OSThreads.h
|
|
@@ -15,7 +15,12 @@
|
|
#ifndef RTS_OSTHREADS_H
|
|
#define RTS_OSTHREADS_H
|
|
|
|
-#if defined(THREADED_RTS) /* to near the end */
|
|
+#if defined(HAVE_PTHREAD_H) && !defined(mingw32_HOST_OS)
|
|
+#define BUILD_OSTHREAD_POSIX
|
|
+#endif
|
|
+
|
|
+
|
|
+#if defined(THREADED_RTS) || defined(BUILD_OSTHREAD_POSIX) /* to near end */
|
|
|
|
#if defined(HAVE_PTHREAD_H) && !defined(mingw32_HOST_OS)
|
|
|
|
@@ -205,13 +210,25 @@
|
|
void releaseThreadNode (void);
|
|
#endif // !CMINUSMINUS
|
|
|
|
-#else
|
|
+#endif /* defined(THREADED_RTS) || defined(BUILD_OSTHREAD_POSIX) */
|
|
+
|
|
+#ifndef THREADED_RTS
|
|
+
|
|
+#ifdef ACQUIRE_LOCK
|
|
+// If we have pthreads, we pull in the threading primitives even when the RTS
|
|
+// isn't threaded, but we expect these macros to be noops on non-threaded RTS.
|
|
+
|
|
+#undef ACQUIRE_LOCK
|
|
+#undef RELEASE_LOCK
|
|
+#undef ASSERT_LOCK_HELD
|
|
+
|
|
+#endif
|
|
|
|
#define ACQUIRE_LOCK(l)
|
|
#define RELEASE_LOCK(l)
|
|
#define ASSERT_LOCK_HELD(l)
|
|
|
|
-#endif /* defined(THREADED_RTS) */
|
|
+#endif
|
|
|
|
#ifndef CMINUSMINUS
|
|
//
|
|
diff --git a/rts/posix/OSThreads.c b/rts/posix/OSThreads.c
|
|
--- a/rts/posix/OSThreads.c
|
|
+++ b/rts/posix/OSThreads.c
|
|
@@ -35,7 +35,7 @@
|
|
#endif
|
|
#endif
|
|
|
|
-#if defined(THREADED_RTS)
|
|
+#if defined(THREADED_RTS) || defined(BUILD_OSTHREAD_POSIX)
|
|
#include "RtsUtils.h"
|
|
#include "Task.h"
|
|
|
|
@@ -225,47 +225,6 @@
|
|
return NULL;
|
|
}
|
|
|
|
-int
|
|
-forkOS_createThread ( HsStablePtr entry )
|
|
-{
|
|
- pthread_t tid;
|
|
- int result = pthread_create(&tid, NULL,
|
|
- forkOS_createThreadWrapper, (void*)entry);
|
|
- if(!result)
|
|
- pthread_detach(tid);
|
|
- return result;
|
|
-}
|
|
-
|
|
-void freeThreadingResources (void) { /* nothing */ }
|
|
-
|
|
-uint32_t
|
|
-getNumberOfProcessors (void)
|
|
-{
|
|
- static uint32_t nproc = 0;
|
|
-
|
|
- if (nproc == 0) {
|
|
-#if defined(HAVE_SYSCONF) && defined(_SC_NPROCESSORS_ONLN)
|
|
- nproc = sysconf(_SC_NPROCESSORS_ONLN);
|
|
-#elif defined(HAVE_SYSCONF) && defined(_SC_NPROCESSORS_CONF)
|
|
- nproc = sysconf(_SC_NPROCESSORS_CONF);
|
|
-#elif defined(darwin_HOST_OS)
|
|
- size_t size = sizeof(uint32_t);
|
|
- if(sysctlbyname("hw.logicalcpu",&nproc,&size,NULL,0) != 0) {
|
|
- if(sysctlbyname("hw.ncpu",&nproc,&size,NULL,0) != 0)
|
|
- nproc = 1;
|
|
- }
|
|
-#elif defined(freebsd_HOST_OS)
|
|
- size_t size = sizeof(uint32_t);
|
|
- if(sysctlbyname("hw.ncpu",&nproc,&size,NULL,0) != 0)
|
|
- nproc = 1;
|
|
-#else
|
|
- nproc = 1;
|
|
-#endif
|
|
- }
|
|
-
|
|
- return nproc;
|
|
-}
|
|
-
|
|
#if defined(HAVE_SCHED_H) && defined(HAVE_SCHED_SETAFFINITY)
|
|
// Schedules the thread to run on CPU n of m. m may be less than the
|
|
// number of physical CPUs, in which case, the thread will be allowed
|
|
@@ -353,6 +312,51 @@
|
|
pthread_kill(id, SIGPIPE);
|
|
}
|
|
|
|
+#endif /* defined(THREADED_RTS) || defined(BUILD_OSTHREAD_POSIX) */
|
|
+
|
|
+#if defined(THREADED_RTS)
|
|
+
|
|
+int
|
|
+forkOS_createThread ( HsStablePtr entry )
|
|
+{
|
|
+ pthread_t tid;
|
|
+ int result = pthread_create(&tid, NULL,
|
|
+ forkOS_createThreadWrapper, (void*)entry);
|
|
+ if(!result)
|
|
+ pthread_detach(tid);
|
|
+ return result;
|
|
+}
|
|
+
|
|
+void freeThreadingResources (void) { /* nothing */ }
|
|
+
|
|
+uint32_t
|
|
+getNumberOfProcessors (void)
|
|
+{
|
|
+ static uint32_t nproc = 0;
|
|
+
|
|
+ if (nproc == 0) {
|
|
+#if defined(HAVE_SYSCONF) && defined(_SC_NPROCESSORS_ONLN)
|
|
+ nproc = sysconf(_SC_NPROCESSORS_ONLN);
|
|
+#elif defined(HAVE_SYSCONF) && defined(_SC_NPROCESSORS_CONF)
|
|
+ nproc = sysconf(_SC_NPROCESSORS_CONF);
|
|
+#elif defined(darwin_HOST_OS)
|
|
+ size_t size = sizeof(uint32_t);
|
|
+ if(sysctlbyname("hw.logicalcpu",&nproc,&size,NULL,0) != 0) {
|
|
+ if(sysctlbyname("hw.ncpu",&nproc,&size,NULL,0) != 0)
|
|
+ nproc = 1;
|
|
+ }
|
|
+#elif defined(freebsd_HOST_OS)
|
|
+ size_t size = sizeof(uint32_t);
|
|
+ if(sysctlbyname("hw.ncpu",&nproc,&size,NULL,0) != 0)
|
|
+ nproc = 1;
|
|
+#else
|
|
+ nproc = 1;
|
|
+#endif
|
|
+ }
|
|
+
|
|
+ return nproc;
|
|
+}
|
|
+
|
|
#else /* !defined(THREADED_RTS) */
|
|
|
|
int
|
|
|