From 3f9e522bb0e53ce262f68424870e2bbc9135b70a Mon Sep 17 00:00:00 2001 From: Ian Lynagh Date: Thu, 22 Feb 2007 14:43:06 +0000 Subject: [PATCH] Free thread local storage on shutdown --- includes/OSThreads.h | 1 + rts/Task.c | 3 +++ rts/posix/OSThreads.c | 9 +++++++++ rts/win32/OSThreads.c | 11 +++++++++++ 4 files changed, 24 insertions(+) diff --git a/includes/OSThreads.h b/includes/OSThreads.h index f9af6c4..fd50642 100644 --- a/includes/OSThreads.h +++ b/includes/OSThreads.h @@ -172,6 +172,7 @@ extern void closeMutex ( Mutex* pMut ); void newThreadLocalKey (ThreadLocalKey *key); void *getThreadLocalVar (ThreadLocalKey *key); void setThreadLocalVar (ThreadLocalKey *key, void *value); +void freeThreadLocalKey (ThreadLocalKey *key); #else diff --git a/rts/Task.c b/rts/Task.c index 4301ab4..038e861 100644 --- a/rts/Task.c +++ b/rts/Task.c @@ -99,6 +99,9 @@ freeTaskManager (void) } all_tasks = NULL; task_free_list = NULL; +#if defined(THREADED_RTS) + freeThreadLocalKey(¤tTaskKey); +#endif RELEASE_LOCK(&sched_mutex); } diff --git a/rts/posix/OSThreads.c b/rts/posix/OSThreads.c index 7aaa76a..6b6fa5c 100644 --- a/rts/posix/OSThreads.c +++ b/rts/posix/OSThreads.c @@ -148,6 +148,15 @@ setThreadLocalVar (ThreadLocalKey *key, void *value) } } +void +freeThreadLocalKey (ThreadLocalKey *key) +{ + int r; + if ((r = pthread_key_delete(key)) != 0) { + barf("freeThreadLocalKey: %s", strerror(r)); + } +} + static void * forkOS_createThreadWrapper ( void * entry ) { diff --git a/rts/win32/OSThreads.c b/rts/win32/OSThreads.c index 6f3629b..24fbabe 100644 --- a/rts/win32/OSThreads.c +++ b/rts/win32/OSThreads.c @@ -197,6 +197,17 @@ setThreadLocalVar (ThreadLocalKey *key, void *value) } } +void +freeThreadLocalKey (ThreadLocalKey *key) +{ + BOOL r; + r = TlsFree(*key); + if (r == 0) { + DWORD dw = GetLastError(); + barf("freeThreadLocalKey failed: %lu", dw); + } +} + static unsigned __stdcall forkOS_createThreadWrapper ( void * entry ) -- 1.7.10.4