Add closeMutex and use it on clean up
authorEsa Ilari Vuokko <ei@vuokko.info>
Wed, 23 Aug 2006 19:46:04 +0000 (19:46 +0000)
committerEsa Ilari Vuokko <ei@vuokko.info>
Wed, 23 Aug 2006 19:46:04 +0000 (19:46 +0000)
includes/OSThreads.h
rts/Capability.c
rts/Schedule.c
rts/Stable.c
rts/Storage.c
rts/Task.c
rts/Typeable.c
rts/posix/OSThreads.c
rts/win32/OSThreads.c

index 9043144..32f147a 100644 (file)
@@ -161,6 +161,7 @@ extern rtsBool waitCondition      ( Condition* pCond,
 // Mutexes
 //
 extern void initMutex             ( Mutex* pMut );
+extern void closeMutex            ( Mutex* pMut );
 
 //
 // Thread-local storage
index 2384262..e384e1e 100644 (file)
@@ -671,6 +671,9 @@ shutdownCapability (Capability *cap, Task *task)
     }
     // we now have the Capability, its run queue and spare workers
     // list are both empty.
+
+    // We end up here only in THREADED_RTS
+    closeMutex(&cap->lock);
 }
 
 /* ----------------------------------------------------------------------------
index b9b4325..49e25be 100644 (file)
@@ -2584,6 +2584,7 @@ exitScheduler( void )
        boundTaskExiting(task);
        stopTaskManager();
     }
+    closeMutex(&sched_mutex);
 #endif
 }
 
index 2c4157b..813c6c8 100644 (file)
@@ -169,6 +169,9 @@ exitStablePtrTable(void)
     stgFree(stable_ptr_table);
   stable_ptr_table = NULL;
   SPT_size = 0;
+#ifdef THREADED_RTS
+  closeMutex(&stable_mutex);
+#endif
 }
 
 /*
index 3594f71..0c9c60e 100644 (file)
@@ -279,6 +279,10 @@ freeStorage (void)
       stgFree(generations[g].steps);
     stgFree(generations);
     freeAllMBlocks();
+#if defined(THREADED_RTS)
+    closeMutex(&sm_mutex);
+    closeMutex(&atomic_modify_mutvar_mutex);
+#endif
 }
 
 /* -----------------------------------------------------------------------------
index 3be5b28..a03ed87 100644 (file)
@@ -77,6 +77,10 @@ stopTaskManager (void)
     for (task = task_free_list; task != NULL; task = next) {
         next = task->next;
         stgFree(task);
+#if defined(THREADED_RTS)
+        closeCondition(&task->cond);
+        closeMutex(&task->lock);
+#endif
     }
     task_free_list = NULL;
     RELEASE_LOCK(&sched_mutex);
index e07c764..4c4d460 100644 (file)
@@ -20,7 +20,7 @@ void
 exitTypeableStore()\r
 {\r
 #ifdef THREADED_RTS\r
-    /* TODO: Free Mutex! */\r
+    closeMutex(&typeableStoreLock);\r
 #endif\r
     if(typeableStore!=0) {\r
         freeStablePtr((StgStablePtr)typeableStore);\r
index cff3782..b30d085 100644 (file)
@@ -106,6 +106,11 @@ initMutex(Mutex* pMut)
 #endif
     return;
 }
+void
+closeMutex(Mutex* pMut)
+{
+    pthread_mutex_destroy(pMut);
+}
 
 void
 newThreadLocalKey (ThreadLocalKey *key)
index c772be3..00effda 100644 (file)
@@ -116,6 +116,11 @@ initMutex (Mutex* pMut)
 {
     InitializeCriticalSectionAndSpinCount(pMut,4000);
 }
+void
+closeMutex (Mutex* pMut)
+{
+    DeleteCriticalSection(pMut);
+}
 #else
 void
 initMutex (Mutex* pMut)
@@ -127,6 +132,11 @@ initMutex (Mutex* pMut)
   *pMut = h;
   return;
 }
+void
+closeMutex (Mutex* pMut)
+{
+    CloseHandle(*pMut);
+}
 #endif
 
 void