diff options
author | dgp <dgp@users.sourceforge.net> | 2016-12-01 20:13:10 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2016-12-01 20:13:10 (GMT) |
commit | 6caf77b9eeecd4f041db70af50a04337673ee602 (patch) | |
tree | a3ad3b6198cf39f4a3aba30bb87b91bc87d218c6 | |
parent | 0e33bed46567780c4d5e5f700e4a6b986801a0b0 (diff) | |
download | tcl-6caf77b9eeecd4f041db70af50a04337673ee602.zip tcl-6caf77b9eeecd4f041db70af50a04337673ee602.tar.gz tcl-6caf77b9eeecd4f041db70af50a04337673ee602.tar.bz2 |
Reports from NSF that command epoch bumping isn't properly timed.
http://paste.tclers.tk/4030
Since the epoch should bump to indicate when Tcl_FindCommand() would
produce a different result from the cached value, the bump ought to be
connected to the state change that would have that effect. This checkin
appears to be the more correct answer, and it makes the Delete path get
into agreement with the Rename path. Review would be good.
-rw-r--r-- | generic/tclBasic.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/generic/tclBasic.c b/generic/tclBasic.c index c1dd52d..686c292 100644 --- a/generic/tclBasic.c +++ b/generic/tclBasic.c @@ -3024,13 +3024,6 @@ Tcl_DeleteCommandFromToken( Tcl_Command importCmd; /* - * Bump the command epoch counter. This will invalidate all cached - * references that point to this command. - */ - - cmdPtr->cmdEpoch++; - - /* * The code here is tricky. We can't delete the hash table entry before * invoking the deletion callback because there are cases where the * deletion callback needs to invoke the command (e.g. object systems such @@ -3052,6 +3045,14 @@ Tcl_DeleteCommandFromToken( Tcl_DeleteHashEntry(cmdPtr->hPtr); cmdPtr->hPtr = NULL; } + + /* + * Bump the command epoch counter. This will invalidate all cached + * references that point to this command. + */ + + cmdPtr->cmdEpoch++; + return 0; } @@ -3154,6 +3155,14 @@ Tcl_DeleteCommandFromToken( if (cmdPtr->hPtr != NULL) { Tcl_DeleteHashEntry(cmdPtr->hPtr); cmdPtr->hPtr = NULL; + /* + * Bump the command epoch counter. This will invalidate all cached + * references that point to this command. + */ + + cmdPtr->cmdEpoch++; + + cmdPtr->cmdEpoch++; } /* |