Index: generic/nsfPointer.c =================================================================== diff -u -N -r7c4f1e31560a0f40749b954c2e9af64ae9110cdc -rcccc5946bad0d090e11893fee5761bf0c87428d9 --- generic/nsfPointer.c (.../nsfPointer.c) (revision 7c4f1e31560a0f40749b954c2e9af64ae9110cdc) +++ generic/nsfPointer.c (.../nsfPointer.c) (revision cccc5946bad0d090e11893fee5761bf0c87428d9) @@ -28,6 +28,7 @@ #include "nsfInt.h" static Tcl_HashTable pointerHashTable, *pointerHashTablePtr = &pointerHashTable; +static int pointerTableRefCount = 0; static NsfMutex pointerMutex = 0; /* @@ -243,7 +244,9 @@ int isNew; NsfMutexLock(&pointerMutex); + hPtr = Tcl_CreateHashEntry(pointerHashTablePtr, typeName, &isNew); + NsfMutexUnlock(&pointerMutex); if (isNew) { @@ -303,7 +306,12 @@ Nsf_PointerInit(Tcl_Interp *interp) { NsfMutexLock(&pointerMutex); - Tcl_InitHashTable(pointerHashTablePtr, TCL_STRING_KEYS); + + if (pointerTableRefCount == 0) { + Tcl_InitHashTable(pointerHashTablePtr, TCL_STRING_KEYS); + } + pointerTableRefCount++; + NsfMutexUnlock(&pointerMutex); } @@ -329,20 +337,26 @@ Tcl_HashSearch hSrch; NsfMutexLock(&pointerMutex); - for (hPtr = Tcl_FirstHashEntry(pointerHashTablePtr, &hSrch); hPtr; - hPtr = Tcl_NextHashEntry(&hSrch)) { - char *key = Tcl_GetHashKey(pointerHashTablePtr, hPtr); - void *valuePtr = Tcl_GetHashValue(hPtr); + if (--pointerTableRefCount == 0) { - /* - * We can't use NsfLog here any more, since the Tcl procs are - * already deleted. - */ if (RUNTIME_STATE(interp)->debugLevel >= 2) { - fprintf(stderr, "Nsf_PointerExit: we have still an entry %s with value %p\n", key, valuePtr); + for (hPtr = Tcl_FirstHashEntry(pointerHashTablePtr, &hSrch); hPtr; + hPtr = Tcl_NextHashEntry(&hSrch)) { + char *key = Tcl_GetHashKey(pointerHashTablePtr, hPtr); + void *valuePtr = Tcl_GetHashValue(hPtr); + + /* + * We can't use NsfLog here any more, since the Tcl procs are + * already deleted. + */ + + fprintf(stderr, "Nsf_PointerExit: we have still an entry %s with value %p\n", key, valuePtr); + } } + + Tcl_DeleteHashTable(pointerHashTablePtr); } - Tcl_DeleteHashTable(pointerHashTablePtr); + NsfMutexUnlock(&pointerMutex); }