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