diff options
-rw-r--r-- | rts/Task.c | 9 | ||||
-rw-r--r-- | rts/Task.h | 6 | ||||
-rw-r--r-- | rts/sm/GCTDecl.h | 2 | ||||
-rw-r--r-- | rts/sm/GCThread.h | 4 | ||||
-rw-r--r-- | rts/sm/Storage.c | 7 |
5 files changed, 12 insertions, 16 deletions
diff --git a/rts/Task.c b/rts/Task.c index 78725dd41c..e6781a17ff 100644 --- a/rts/Task.c +++ b/rts/Task.c @@ -54,9 +54,6 @@ __thread Task *my_task; # else ThreadLocalKey currentTaskKey; # endif -#ifdef llvm_CC_FLAVOR -ThreadLocalKey gctKey; -#endif #else Task *my_task; #endif @@ -78,9 +75,6 @@ initTaskManager (void) #if !defined(MYTASK_USE_TLV) newThreadLocalKey(¤tTaskKey); #endif -#if defined(llvm_CC_FLAVOR) - newThreadLocalKey(&gctKey); -#endif initMutex(&all_tasks_mutex); #endif } @@ -115,9 +109,6 @@ freeTaskManager (void) #if !defined(MYTASK_USE_TLV) freeThreadLocalKey(¤tTaskKey); #endif -#if defined(llvm_CC_FLAVOR) - freeThreadLocalKey(&gctKey); -#endif #endif tasksInitialized = 0; diff --git a/rts/Task.h b/rts/Task.h index e5b729527d..f18f154117 100644 --- a/rts/Task.h +++ b/rts/Task.h @@ -238,12 +238,6 @@ extern __thread Task *my_task; #else extern ThreadLocalKey currentTaskKey; #endif -// LLVM-based compilers do not upport the __thread attribute, so we need -// to store the gct variable as a pthread local storage. We declare the -// key here to keep thread local storage initialization in the same place. -#if defined(llvm_CC_FLAVOR) -extern ThreadLocalKey gctKey; -#endif #else extern Task *my_task; #endif diff --git a/rts/sm/GCTDecl.h b/rts/sm/GCTDecl.h index f9c8fcb137..6eb6cc2e8b 100644 --- a/rts/sm/GCTDecl.h +++ b/rts/sm/GCTDecl.h @@ -52,7 +52,7 @@ extern __thread gc_thread* gct; // with a C compiler that uses an LLVM back end (clang or llvm-gcc) then we // use pthread_getspecific() to handle the thread local storage for gct. #define gct ((gc_thread *)(pthread_getspecific(gctKey))) -#define DECLARE_GCT /* nothing */ +#define DECLARE_GCT ThreadLocalKey gctKey; #elif defined(sparc_HOST_ARCH) // On SPARC we can't pin gct to a register. Names like %l1 are just offsets diff --git a/rts/sm/GCThread.h b/rts/sm/GCThread.h index 7d163cb48a..59327bc20b 100644 --- a/rts/sm/GCThread.h +++ b/rts/sm/GCThread.h @@ -204,6 +204,10 @@ extern nat n_gc_threads; extern gc_thread **gc_threads; +#if defined(THREADED_RTS) && defined(llvm_CC_FLAVOR) +extern ThreadLocalKey gctKey; +#endif + #include "EndPrivate.h" #endif // SM_GCTHREAD_H diff --git a/rts/sm/Storage.c b/rts/sm/Storage.c index ff4f172ac5..518ae0d0c8 100644 --- a/rts/sm/Storage.c +++ b/rts/sm/Storage.c @@ -229,6 +229,10 @@ void storageAddCapabilities (nat from, nat to) } } +#if defined(THREADED_RTS) && defined(llvm_CC_FLAVOR) + newThreadLocalKey(&gctKey); +#endif + initGcThreads(from, to); } @@ -249,6 +253,9 @@ freeStorage (rtsBool free_heap) closeMutex(&sm_mutex); #endif stgFree(nurseries); +#if defined(THREADED_RTS) && defined(llvm_CC_FLAVOR) + freeThreadLocalKey(&gctKey); +#endif freeGcThreads(); } |