diff options
author | davygrvy <davygrvy@pobox.com> | 2001-08-30 07:50:18 (GMT) |
---|---|---|
committer | davygrvy <davygrvy@pobox.com> | 2001-08-30 07:50:18 (GMT) |
commit | 0d312be6885f036ff0654f64c2889ba806bcf07e (patch) | |
tree | 7d838c15cd14b38785a1fab0ded168b19b1f0e95 | |
parent | fce8b6f68f556617c82dd0079a82f02e751e17db (diff) | |
download | tcl-0d312be6885f036ff0654f64c2889ba806bcf07e.zip tcl-0d312be6885f036ff0654f64c2889ba806bcf07e.tar.gz tcl-0d312be6885f036ff0654f64c2889ba806bcf07e.tar.bz2 |
* generic/tclAsync.c:
* generic/tclEvent.c:
* generic/tclInt.h: Improper cleanup of asyncMutex in tclAsync.c
repaired. TclFinalizeSynchronization() was trying to remove a
registered mutex that was dumped earlier when the TSD it was stored
in was cleared. This was only surfacing on *nix. Windows was being
masked by mutexes not actually being returned to the system! That
was repaired in a previous patch. Needed to add a private
TclFinalizeAsync() to tclAsync.c and called from Tcl_FinalizeThread().
Pheww.. Is this done yet?
[Bug: 414419] requested by Rob Ratcliff <rrr6399@futuretek.com>
-rw-r--r-- | generic/tclAsync.c | 31 | ||||
-rw-r--r-- | generic/tclEvent.c | 3 | ||||
-rw-r--r-- | generic/tclInt.h | 3 |
3 files changed, 32 insertions, 5 deletions
diff --git a/generic/tclAsync.c b/generic/tclAsync.c index 8d6757f..76e3e28 100644 --- a/generic/tclAsync.c +++ b/generic/tclAsync.c @@ -12,7 +12,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclAsync.c,v 1.5 2000/07/26 01:28:35 davidg Exp $ + * RCS: @(#) $Id: tclAsync.c,v 1.6 2001/08/30 07:50:18 davygrvy Exp $ */ #include "tclInt.h" @@ -72,9 +72,7 @@ typedef struct ThreadSpecificData { int asyncActive; -#ifdef TCL_THREADS Tcl_Mutex asyncMutex; /* Thread-specific AsyncHandler linked-list lock */ -#endif } ThreadSpecificData; static Tcl_ThreadDataKey dataKey; @@ -83,6 +81,33 @@ static Tcl_ThreadDataKey dataKey; /* *---------------------------------------------------------------------- * + * TclFinalizeAsync -- + * + * Finalizes the mutex in the thread local data structure for the + * async subsystem. + * + * Results: + * None. + * + * Side effects: + * Forgets knowledge of the mutex should it have been created. + * + *---------------------------------------------------------------------- + */ + +void +TclFinalizeAsync() +{ + ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); + + if (tsdPtr->asyncMutex != NULL) { + Tcl_MutexFinalize(&tsdPtr->asyncMutex); + } +} + +/* + *---------------------------------------------------------------------- + * * Tcl_AsyncCreate -- * * This procedure creates the data structures for an asynchronous diff --git a/generic/tclEvent.c b/generic/tclEvent.c index 4aae424..4d2337e 100644 --- a/generic/tclEvent.c +++ b/generic/tclEvent.c @@ -11,7 +11,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclEvent.c,v 1.11 2001/03/31 07:57:31 hobbs Exp $ + * RCS: @(#) $Id: tclEvent.c,v 1.12 2001/08/30 07:50:18 davygrvy Exp $ */ #include "tclInt.h" @@ -907,6 +907,7 @@ Tcl_FinalizeThread() } TclFinalizeIOSubsystem(); TclFinalizeNotifier(); + TclFinalizeAsync(); /* * Blow away all thread local storage blocks. diff --git a/generic/tclInt.h b/generic/tclInt.h index 984f795..daa8a7d 100644 --- a/generic/tclInt.h +++ b/generic/tclInt.h @@ -11,7 +11,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclInt.h,v 1.59 2001/08/23 17:37:08 vincentdarley Exp $ + * RCS: @(#) $Id: tclInt.h,v 1.60 2001/08/30 07:50:18 davygrvy Exp $ */ #ifndef _TCLINT @@ -1668,6 +1668,7 @@ EXTERN void TclFinalizeIOSubsystem _ANSI_ARGS_((void)); EXTERN void TclFinalizeLoad _ANSI_ARGS_((void)); EXTERN void TclFinalizeMemorySubsystem _ANSI_ARGS_((void)); EXTERN void TclFinalizeNotifier _ANSI_ARGS_((void)); +EXTERN void TclFinalizeAsync _ANSI_ARGS_((void)); EXTERN void TclFinalizeSynchronization _ANSI_ARGS_((void)); EXTERN void TclFinalizeThreadData _ANSI_ARGS_((void)); EXTERN void TclFindEncodings _ANSI_ARGS_((CONST char *argv0)); |