diff options
Diffstat (limited to 'generic/tclIO.c')
-rw-r--r-- | generic/tclIO.c | 34 |
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; } |