summary refs log tree commit diff
path: root/pkgs/development/compilers/ghc/D2712.patch
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/development/compilers/ghc/D2712.patch')
-rw-r--r--pkgs/development/compilers/ghc/D2712.patch158
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
+