/* * ExitHandler * * Cleans up library on exit, frees all state structures. * * Arguments: * dummy - Not used. * * Returns: * None. */ static void ExitHandler( ClientData dummy ) { /* Init clean-up. */ Tcl_MutexLock(&initMutex); if (kernelModule != NULL) { FreeLibrary(kernelModule); kernelModule = NULL; } getDiskFreeSpaceExPtr = NULL; initialised = FALSE; Tcl_MutexUnlock(&initMutex); Tcl_MutexFinalize(&initMutex); /* Key clean-up. */ Tcl_MutexLock(&keyMutex); if (keyTable != NULL) { KeyClearTable(); Tcl_DeleteHashTable(keyTable); ckfree((char *)keyTable); keyTable = NULL; } Tcl_MutexUnlock(&keyMutex); Tcl_MutexFinalize(&keyMutex); #ifdef TCL_MEM_DEBUG Tcl_DumpActiveMemory("MemDump.txt"); #endif }
void TclFinalizeAsync(void) { ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); if (tsdPtr->asyncMutex != NULL) { Tcl_MutexFinalize(&tsdPtr->asyncMutex); } }
/*++ Finalise Finalises the library; freeing all held resources. Arguments: removeCmds - Remove extension commands from all interpreters. Return Value: None. --*/ static void Finalise( int removeCmds ) { DebugPrint("Finalise: removeCmds=%d\n", removeCmds); #ifdef _WINDOWS Tcl_MutexLock(&initMutex); if (winProcs.module != NULL) { FreeLibrary(winProcs.module); } ZeroMemory(&winProcs, sizeof(WinProcs)); Tcl_MutexUnlock(&initMutex); #endif Tcl_MutexFinalize(&initMutex); initialised = 0; Tcl_MutexLock(&stateListMutex); if (stateHead != NULL) { ExtState *state; ExtState *stateNext; // Free all states structures. for (state = stateHead; state != NULL; state = stateNext) { stateNext = state->next; FreeState(state, removeCmds, 1); } stateHead = NULL; } Tcl_MutexUnlock(&stateListMutex); Tcl_MutexFinalize(&stateListMutex); #ifdef TCL_MEM_DEBUG Tcl_DumpActiveMemory("MemDump.txt"); #endif }