summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2005-07-26 17:05:28 (GMT)
committerdgp <dgp@users.sourceforge.net>2005-07-26 17:05:28 (GMT)
commit9d5713e7c5fda9f025636e41099395211bc6612d (patch)
tree20e01256fc5ac4392f657594605b438ce66e68d8
parentb4aa907f7b232da983bc1a84cf6ed978f0145be2 (diff)
downloadtcl-9d5713e7c5fda9f025636e41099395211bc6612d.zip
tcl-9d5713e7c5fda9f025636e41099395211bc6612d.tar.gz
tcl-9d5713e7c5fda9f025636e41099395211bc6612d.tar.bz2
* generic/tclBasic.c (Tcl_CallWhenDeleted): Converted to use
per-thread counter, rather than a process global one that required mutex protection. [RFE 1077194]
-rw-r--r--ChangeLog4
-rw-r--r--generic/tclBasic.c15
2 files changed, 10 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index 2905807..24ab4e8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
2005-07-26 Don Porter <dgp@users.sourceforge.net>
+ * generic/tclBasic.c (Tcl_CallWhenDeleted): Converted to use
+ per-thread counter, rather than a process global one that required
+ mutex protection. [RFE 1077194]
+
* generic/tclNamesp.c (TclTeardownNamespace): Re-ordering so that
* tests/trace.test (trace-34.4): command delete traces fire
while the command still exists. [Bug 1047286]
diff --git a/generic/tclBasic.c b/generic/tclBasic.c
index f1423cf..00673d5 100644
--- a/generic/tclBasic.c
+++ b/generic/tclBasic.c
@@ -13,7 +13,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclBasic.c,v 1.75.2.16 2005/06/21 17:19:40 dgp Exp $
+ * RCS: @(#) $Id: tclBasic.c,v 1.75.2.17 2005/07/26 17:05:43 dgp Exp $
*/
#include "tclInt.h"
@@ -648,19 +648,16 @@ Tcl_CallWhenDeleted(interp, proc, clientData)
ClientData clientData; /* One-word value to pass to proc. */
{
Interp *iPtr = (Interp *) interp;
- static int assocDataCounter = 0;
-#ifdef TCL_THREADS
- static Tcl_Mutex assocMutex;
-#endif
+ static Tcl_ThreadDataKey assocDataCounterKey;
+ int *assocDataCounterPtr =
+ Tcl_GetThreadData(&assocDataCounterKey, (int)sizeof(int));
int new;
char buffer[32 + TCL_INTEGER_SPACE];
AssocData *dPtr = (AssocData *) ckalloc(sizeof(AssocData));
Tcl_HashEntry *hPtr;
- Tcl_MutexLock(&assocMutex);
- sprintf(buffer, "Assoc Data Key #%d", assocDataCounter);
- assocDataCounter++;
- Tcl_MutexUnlock(&assocMutex);
+ sprintf(buffer, "Assoc Data Key #%d", *assocDataCounterPtr);
+ (*assocDataCounterPtr)++;
if (iPtr->assocData == (Tcl_HashTable *) NULL) {
iPtr->assocData = (Tcl_HashTable *) ckalloc(sizeof(Tcl_HashTable));