diff options
author | dgp <dgp@users.sourceforge.net> | 2013-02-25 18:15:36 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2013-02-25 18:15:36 (GMT) |
commit | 665eff0bf84eefb902865adc4f6ce46862cc5710 (patch) | |
tree | 9f828e28ad786df4789c04b0667899c12cc249a2 /generic | |
parent | 03459bb0e1db5fd78e217ee768fe0ee1869ce9a7 (diff) | |
parent | 3113125de488bc505861db30785af63bae2e531c (diff) | |
download | tcl-665eff0bf84eefb902865adc4f6ce46862cc5710.zip tcl-665eff0bf84eefb902865adc4f6ce46862cc5710.tar.gz tcl-665eff0bf84eefb902865adc4f6ce46862cc5710.tar.bz2 |
Repair linked list management in Tcl_DeleteCloseHandler().
CloseCallback struct used only locally. Remove from tclIO.h.
Diffstat (limited to 'generic')
-rw-r--r-- | generic/tclIO.c | 14 | ||||
-rw-r--r-- | generic/tclIO.h | 17 |
2 files changed, 18 insertions, 13 deletions
diff --git a/generic/tclIO.c b/generic/tclIO.c index de7f228..40998cc 100644 --- a/generic/tclIO.c +++ b/generic/tclIO.c @@ -44,6 +44,18 @@ typedef struct ThreadSpecificData { static Tcl_ThreadDataKey dataKey; /* + * Structure to record a close callback. One such record exists for + * each close callback registered for a channel. + */ + +typedef struct CloseCallback { + Tcl_CloseProc *proc; /* The procedure to call. */ + ClientData clientData; /* Arbitrary one-word data to pass + * to the callback. */ + struct CloseCallback *nextPtr; /* For chaining close callbacks. */ +} CloseCallback; + +/* * Static functions in this file: */ @@ -563,6 +575,8 @@ Tcl_DeleteCloseHandler( if ((cbPtr->proc == proc) && (cbPtr->clientData == clientData)) { if (cbPrevPtr == NULL) { statePtr->closeCbPtr = cbPtr->nextPtr; + } else { + cbPrevPtr->nextPtr = cbPtr->nextPtr; } ckfree((char *) cbPtr); break; diff --git a/generic/tclIO.h b/generic/tclIO.h index 8746a09..adefa89 100644 --- a/generic/tclIO.h +++ b/generic/tclIO.h @@ -85,18 +85,8 @@ typedef struct ChannelBuffer { #define CHANNELBUFFER_DEFAULT_SIZE (1024 * 4) -/* - * Structure to record a close callback. One such record exists for each close - * callback registered for a channel. - */ - -typedef struct CloseCallback { - Tcl_CloseProc *proc; /* The procedure to call. */ - ClientData clientData; /* Arbitrary one-word data to pass to the - * callback. */ - struct CloseCallback *nextPtr; - /* For chaining close callbacks. */ -} CloseCallback; +/* Foward declaration */ +struct CloseCallback; /* * The following structure describes the information saved from a call to @@ -195,7 +185,8 @@ typedef struct ChannelState { * value is the POSIX error code. */ int refCount; /* How many interpreters hold references to * this IO channel? */ - CloseCallback *closeCbPtr; /* Callbacks registered to be called when the + struct CloseCallback *closeCbPtr; + /* Callbacks registered to be called when the * channel is closed. */ char *outputStage; /* Temporary staging buffer used when * translating EOL before converting from |