summaryrefslogtreecommitdiffstats
path: root/mac/tclMacSock.c
diff options
context:
space:
mode:
authorandreas_kupries <akupries@shaw.ca>2003-04-22 23:20:39 (GMT)
committerandreas_kupries <akupries@shaw.ca>2003-04-22 23:20:39 (GMT)
commite39ac41979189210210c4ad46c3d86e7e72069fb (patch)
treeda7afb848b9cd285191c219ffb2b279fe3ee2429 /mac/tclMacSock.c
parentb44d851b88a7e6f142dfcb38b06b587780415794 (diff)
downloadtcl-e39ac41979189210210c4ad46c3d86e7e72069fb.zip
tcl-e39ac41979189210210c4ad46c3d86e7e72069fb.tar.gz
tcl-e39ac41979189210210c4ad46c3d86e7e72069fb.tar.bz2
* The changes below fix SF bugs [593810], and [718045].
* generic/tclIO.c (Tcl_CutChannel, Tcl_SpliceChannel): Invoke TclpCutSockChannel and TclpSpliceSockChannel. * generic/tclInt.h: Declare TclpCutSockChannel and TclpSpliceSockChannel. * unix/tclUnixSock.c (TclpCutSockChannel, TclpSpliceSockChannel): Dummy functions, on unix the sockets are _not_ handled specially. * mac/tclMacSock.c (TclpCutSockChannel, TclpSpliceSockChannel): * win/tclWinSock.c (TclpCutSockChannel, TclpSpliceSockChannel): New functions to handle socket specific cut/splice operations: auto-initi of socket system for thread on splice, management of the module internal per-thread list of sockets, management of association of sockets with HWNDs for event notification. * win/tclWinSock.c (NewSocketInfo): Extended initialization assignments to cover all items of the structure. During debugging of the new code mentioned above I found that two fileds could contain bogus data. * win/tclWinFile.c: Added #undef HAVE_NO_FINDEX_ENUMS before definition because when compiling in debug mode the compiler complains about a redefinition, and this warning is also treated as an error.
Diffstat (limited to 'mac/tclMacSock.c')
-rw-r--r--mac/tclMacSock.c91
1 files changed, 90 insertions, 1 deletions
diff --git a/mac/tclMacSock.c b/mac/tclMacSock.c
index f272f87..32df000 100644
--- a/mac/tclMacSock.c
+++ b/mac/tclMacSock.c
@@ -8,7 +8,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclMacSock.c,v 1.14 2002/04/08 09:03:17 das Exp $
+ * RCS: @(#) $Id: tclMacSock.c,v 1.15 2003/04/22 23:20:43 andreas_kupries Exp $
*/
#include "tclInt.h"
@@ -2790,3 +2790,92 @@ pascal void NotifyRoutine (
localIcmpMsg = *icmpMsg;
}
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * TclpCutSockChannel --
+ *
+ * Remove any thread local refs to this channel. See
+ * Tcl_CutChannel for more info.
+ *
+ * Results:
+ * None.
+ *
+ * Side effects:
+ * Changes thread local list of valid channels.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TclpCutSockChannel(chan)
+ Tcl_Channel chan;
+{
+ ThreadSpecificData *tsdPtr;
+ TcpState *infoPtr;
+ TcpState **nextPtrPtr;
+ int removed = 0;
+
+ if (Tcl_GetChannelType(chan) != &tcpChannelType)
+ return;
+
+ tsdPtr = TCL_TSD_INIT(&dataKey);
+ infoPtr = (TcpState *) Tcl_GetChannelInstanceData (chan);
+
+ for (nextPtrPtr = &(tsdPtr->socketList); (*nextPtrPtr) != NULL;
+ nextPtrPtr = &((*nextPtrPtr)->nextPtr)) {
+ if ((*nextPtrPtr) == infoPtr) {
+ (*nextPtrPtr) = infoPtr->nextPtr;
+ removed = 1;
+ break;
+ }
+ }
+
+ /*
+ * This could happen if the channel was created in one thread
+ * and then moved to another without updating the thread
+ * local data in each thread.
+ */
+
+ if (!removed)
+ panic("file info ptr not on thread channel list");
+ return;
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * TclpSpliceSockChannel --
+ *
+ * Insert thread local ref for this channel.
+ * Tcl_SpliceChannel for more info.
+ *
+ * Results:
+ * None.
+ *
+ * Side effects:
+ * Changes thread local list of valid channels.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TclpSpliceSockChannel(chan)
+ Tcl_Channel chan;
+{
+ ThreadSpecificData *tsdPtr;
+ TcpState *infoPtr;
+
+ if (Tcl_GetChannelType(chan) != &tcpChannelType)
+ return;
+
+ InitSockets ();
+
+ tsdPtr = TCL_TSD_INIT(&dataKey);
+ infoPtr = (TcpState *) Tcl_GetChannelInstanceData (chan);
+
+ infoPtr->nextPtr = tsdPtr->socketList;
+ tsdPtr->socketList = infoPtr;
+}
+