Beispiel #1
0
/*
 * 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);
    }
}
Beispiel #3
0
/*++

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
}