Index: generic/nsf.c =================================================================== diff -u -N -r74b7a4066526ff5f5a8080ed907f71c9ed5c7700 -rd66258cafa0a21e1b10fa42951de7e71f63a1817 --- generic/nsf.c (.../nsf.c) (revision 74b7a4066526ff5f5a8080ed907f71c9ed5c7700) +++ generic/nsf.c (.../nsf.c) (revision d66258cafa0a21e1b10fa42951de7e71f63a1817) @@ -21412,9 +21412,29 @@ ParsedParamFree(cl->parsedParamPtr); cl->parsedParamPtr = NULL; } + + /* + * Omit storm of invalidations on shutdown. + */ + if (unlikely(RUNTIME_STATE(interp)->exitHandlerDestroyRound == NSF_EXITHANDLER_OFF)) { + NsfClasses *subClasses = TransitiveSubClasses(cl), *clPtr; + /* + * invalidate cached parameters in subclasses + */ + for (clPtr = subClasses; clPtr; clPtr = clPtr->nextPtr) { + NsfClass *subClass = clPtr->cl; + if (subClass->parsedParamPtr) { + ParsedParamFree(subClass->parsedParamPtr); + subClass->parsedParamPtr = NULL; + } + } + NsfClassListFree(subClasses); + } + return TCL_OK; } + /* cmd parameter:invalidate::objectcache NsfParameterInvalidateObjectCacheCmd { {-argName "object" -required 1 -type object} @@ -22344,6 +22364,7 @@ if (likely(class && class->parsedParamPtr)) { NsfParsedParam *clParsedParamPtr = class->parsedParamPtr; + parsedParamPtr->paramDefs = clParsedParamPtr->paramDefs; parsedParamPtr->possibleUnknowns = clParsedParamPtr->possibleUnknowns; result = TCL_OK; @@ -22391,6 +22412,7 @@ ppDefPtr->paramDefs = parsedParamPtr->paramDefs; ppDefPtr->possibleUnknowns = parsedParamPtr->possibleUnknowns; if (class) { + assert(class->parsedParamPtr == NULL); class->parsedParamPtr = ppDefPtr; #if defined(PER_OBJECT_PARAMETER_CACHING) } else { @@ -23781,11 +23803,11 @@ } /* -classMethod getCachedParameters NsfCGetCachendParameters { +classMethod getCachedParameters NsfCGetCachendParametersMethod { } */ static int -NsfCGetCachendParameters(Tcl_Interp *interp, NsfClass *class) { +NsfCGetCachendParametersMethod(Tcl_Interp *interp, NsfClass *class) { if (likely(class && class->parsedParamPtr && class->parsedParamPtr->paramDefs)) { Tcl_Obj *listObj;