diff options
Diffstat (limited to 'pkgs/development/compilers/ghc/D2712.patch')
-rw-r--r-- | pkgs/development/compilers/ghc/D2712.patch | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/pkgs/development/compilers/ghc/D2712.patch b/pkgs/development/compilers/ghc/D2712.patch new file mode 100644 index 00000000000..d938d70bbcf --- /dev/null +++ b/pkgs/development/compilers/ghc/D2712.patch @@ -0,0 +1,158 @@ +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 + |