diff options
author | dgp <dgp@users.sourceforge.net> | 2011-09-21 21:45:54 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2011-09-21 21:45:54 (GMT) |
commit | e82d81e2a36cc9b0e6a0d3024f072ff8c588cc7f (patch) | |
tree | f337fcc5d41e6fd203f45e59d6048799f80b8cac | |
parent | 55d006f52db784e77fdc99b6bcaceeae689da92c (diff) | |
download | tcl-e82d81e2a36cc9b0e6a0d3024f072ff8c588cc7f.zip tcl-e82d81e2a36cc9b0e6a0d3024f072ff8c588cc7f.tar.gz tcl-e82d81e2a36cc9b0e6a0d3024f072ff8c588cc7f.tar.bz2 |
Revise the thread exit handling of the [testthread] command so that it
properly maintains the per-process data structures even when the thread
exits for reasons other than the [testthread exit] command.
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | generic/tclThreadTest.c | 12 | ||||
-rw-r--r-- | tests/thread.test | 1 |
3 files changed, 16 insertions, 4 deletions
@@ -1,3 +1,10 @@ +2011-09-21 Don Porter <dgp@users.sourceforge.net> + + * generic/tclThreadTest.c: Revise the thread exit handling of the + [testthread] command so that it properly maintains the per-process + data structures even when the thread exits for reasons other than + the [testthread exit] command. + 2011-09-21 Alexandre Ferrieux <ferrieux@users.sourceforge.net> * unix/tclIO.c: [Bug 3412487]: Now short reads are allowed in diff --git a/generic/tclThreadTest.c b/generic/tclThreadTest.c index 71d5a66..3345081 100644 --- a/generic/tclThreadTest.c +++ b/generic/tclThreadTest.c @@ -46,7 +46,7 @@ static Tcl_ThreadDataKey dataKey; * protected by threadMutex. */ -static ThreadSpecificData *threadList; +static ThreadSpecificData *threadList = NULL; /* * The following bit-values are legal for the "flags" field of the @@ -623,9 +623,9 @@ NewTestThread( * Clean up. */ - ListRemove(tsdPtr); - Tcl_Release(tsdPtr->interp); Tcl_DeleteInterp(tsdPtr->interp); + Tcl_Release(tsdPtr->interp); + ListRemove(tsdPtr); Tcl_ExitThread(result); TCL_THREAD_CREATE_RETURN; @@ -744,6 +744,7 @@ ListRemove( tsdPtr->nextPtr->prevPtr = tsdPtr->prevPtr; } tsdPtr->nextPtr = tsdPtr->prevPtr = 0; + tsdPtr->interp = NULL; Tcl_MutexUnlock(&threadMutex); } @@ -1148,6 +1149,11 @@ ThreadExitProc( char *threadEvalScript = clientData; ThreadEventResult *resultPtr, *nextPtr; Tcl_ThreadId self = Tcl_GetCurrentThread(); + ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); + + if (tsdPtr->interp != NULL) { + ListRemove(tsdPtr); + } Tcl_MutexLock(&threadMutex); diff --git a/tests/thread.test b/tests/thread.test index e818388..732f5fd 100644 --- a/tests/thread.test +++ b/tests/thread.test @@ -70,7 +70,6 @@ test thread-1.5 {Tcl_ThreadObjCmd: thread create one shot} {thread} { set l } {1} test thread-1.6 {Tcl_ThreadObjCmd: thread exit} {thread} { - threadReap thread::create {{*}{}} update after 10 |