summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2013-02-25 18:15:36 (GMT)
committerdgp <dgp@users.sourceforge.net>2013-02-25 18:15:36 (GMT)
commit665eff0bf84eefb902865adc4f6ce46862cc5710 (patch)
tree9f828e28ad786df4789c04b0667899c12cc249a2 /generic
parent03459bb0e1db5fd78e217ee768fe0ee1869ce9a7 (diff)
parent3113125de488bc505861db30785af63bae2e531c (diff)
downloadtcl-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.c14
-rw-r--r--generic/tclIO.h17
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