Free thread local storage on shutdown
authorIan Lynagh <igloo@earth.li>
Thu, 22 Feb 2007 14:43:06 +0000 (14:43 +0000)
committerIan Lynagh <igloo@earth.li>
Thu, 22 Feb 2007 14:43:06 +0000 (14:43 +0000)
includes/OSThreads.h
rts/Task.c
rts/posix/OSThreads.c
rts/win32/OSThreads.c

index f9af6c4..fd50642 100644 (file)
@@ -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
 
index 4301ab4..038e861 100644 (file)
@@ -99,6 +99,9 @@ freeTaskManager (void)
     }
     all_tasks = NULL;
     task_free_list = NULL;
+#if defined(THREADED_RTS)
+    freeThreadLocalKey(&currentTaskKey);
+#endif
     RELEASE_LOCK(&sched_mutex);
 }
 
index 7aaa76a..6b6fa5c 100644 (file)
@@ -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 )
 {
index 6f3629b..24fbabe 100644 (file)
@@ -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 )