summaryrefslogtreecommitdiffstats
path: root/generic/tclIO.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/tclIO.c')
-rw-r--r--generic/tclIO.c34
1 files changed, 20 insertions, 14 deletions
diff --git a/generic/tclIO.c b/generic/tclIO.c
index b761e1d..e2c4f32 100644
--- a/generic/tclIO.c
+++ b/generic/tclIO.c
@@ -8399,6 +8399,21 @@ Tcl_NotifyChannel(
tsdPtr->nestedHandlerPtr = nh.nestedHandlerPtr;
}
+static inline Tcl_Event *
+CreateChannelScheduledEvent(
+ Channel *chanPtr)
+{
+#ifdef SYNTHETIC_EVENT_TIME
+ Tcl_Time blckTime;
+
+ blckTime.sec = SYNTHETIC_EVENT_TIME / 1000000;
+ blckTime.usec = SYNTHETIC_EVENT_TIME % 1000000;
+ Tcl_SetMaxBlockTime(&blckTime);
+#endif
+ return TclpQueueEventClientData(ChannelScheduledProc, chanPtr,
+ TCL_QUEUE_RETARDED);
+}
+
/*
*----------------------------------------------------------------------
*
@@ -8492,12 +8507,7 @@ UpdateInterest(
mask &= ~TCL_EXCEPTION;
if (!statePtr->schedEvent) {
- Tcl_Event *evPtr = (Tcl_Event *)ckalloc(
- sizeof(Tcl_Event) + sizeof(Channel*));
- *(Channel**)(evPtr+1) = chanPtr;
- evPtr->proc = ChannelScheduledProc;
- statePtr->schedEvent = evPtr;
- Tcl_QueueEvent(evPtr, TCL_QUEUE_TAIL);
+ statePtr->schedEvent = CreateChannelScheduledEvent(chanPtr);
}
}
}
@@ -8544,13 +8554,13 @@ ChannelScheduledProc(
* before UpdateInterest gets called by Tcl_NotifyChannel.
*/
- statePtr->schedEvent->proc = ChannelScheduledProc; /* reattach to tail */
-
+ statePtr->schedEvent = CreateChannelScheduledEvent(chanPtr);
+
Tcl_Preserve(statePtr);
Tcl_NotifyChannel((Tcl_Channel) chanPtr, TCL_READABLE);
Tcl_Release(statePtr);
- return 1;
+ return 1; /* next cycle */
}
statePtr->schedEvent = NULL; /* event done. */
@@ -9179,11 +9189,7 @@ TclCopyChannel(
*/
if ((nonBlocking == CHANNEL_NONBLOCKING) && (toRead == 0)) {
- Tcl_Event *evPtr = (Tcl_Event *)ckalloc(
- sizeof(Tcl_Event) + sizeof(ClientData*));
- *(ClientData*)(evPtr+1) = csPtr;
- evPtr->proc = ZeroTransferEventProc;
- Tcl_QueueEvent(evPtr, TCL_QUEUE_TAIL);
+ TclpQueueEventClientData(ZeroTransferEventProc, csPtr, TCL_QUEUE_TAIL);
return 0;
}