summaryrefslogtreecommitdiffstats
path: root/generic/tclIO.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2024-04-19 13:32:50 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2024-04-19 13:32:50 (GMT)
commita622ebef721360970d01e50a2ee98cbe65d66796 (patch)
tree8a57a85303f9003b58bb6a6cb6b44435b1a5ec6b /generic/tclIO.c
parent777918b862147c2047cc64e15487834b2e090d65 (diff)
parent4514ce153cf2128ebd6d66d86b0d93d1bd977874 (diff)
downloadtcl-a622ebef721360970d01e50a2ee98cbe65d66796.zip
tcl-a622ebef721360970d01e50a2ee98cbe65d66796.tar.gz
tcl-a622ebef721360970d01e50a2ee98cbe65d66796.tar.bz2
Rebase to 9.0
Diffstat (limited to 'generic/tclIO.c')
-rw-r--r--generic/tclIO.c82
1 files changed, 17 insertions, 65 deletions
diff --git a/generic/tclIO.c b/generic/tclIO.c
index 78cda5c..518adef 100644
--- a/generic/tclIO.c
+++ b/generic/tclIO.c
@@ -167,7 +167,6 @@ static int CheckForDeadChannel(Tcl_Interp *interp,
static void CheckForStdChannelsBeingClosed(Tcl_Channel chan);
static void CleanupChannelHandlers(Tcl_Interp *interp,
Channel *chanPtr);
-static void CleanupTimerHandler(ChannelState *statePtr);
static int CloseChannel(Tcl_Interp *interp, Channel *chanPtr,
int errorCode);
static int CloseChannelPart(Tcl_Interp *interp, Channel *chanPtr,
@@ -3504,11 +3503,6 @@ TclClose(
Tcl_ClearChannelHandlers(chan);
/*
- * Cancel any outstanding timer.
- */
- DeleteTimerHandler(statePtr);
-
- /*
* Invoke the registered close callbacks and delete their records.
*/
@@ -8628,7 +8622,6 @@ UpdateInterest(
{
ChannelState *statePtr = chanPtr->state;
/* State info for channel */
- ChannelBuffer *bufPtr = statePtr->outQueueHead;
int mask = statePtr->interestMask;
if (chanPtr->typePtr == NULL) {
@@ -8706,20 +8699,6 @@ UpdateInterest(
}
}
}
-
- if (!statePtr->timer
- && (mask & TCL_WRITABLE)
- && GotFlag(statePtr, CHANNEL_NONBLOCKING)
- && bufPtr
- && !IsBufferEmpty(bufPtr)
- && !IsBufferFull(bufPtr)
- ) {
- TclChannelPreserve((Tcl_Channel)chanPtr);
- statePtr->timerChanPtr = chanPtr;
- statePtr->timer = Tcl_CreateTimerHandler(SYNTHETIC_EVENT_TIME,
- ChannelTimerProc,chanPtr);
- }
-
ChanWatch(chanPtr, mask);
}
@@ -8748,51 +8727,30 @@ ChannelTimerProc(
/* State info for channel */
ChannelState *statePtr = chanPtr->state;
- /* TclChannelPreserve() must be called before the current function was
- * scheduled, is already in effect. In this function it guards against
- * deallocation in Tcl_NotifyChannel and also keps the channel preserved
- * until ChannelTimerProc is later called again.
- */
-
if (chanPtr->typePtr == NULL) {
- CleanupTimerHandler(statePtr);
- } else {
- Tcl_Preserve(statePtr);
statePtr->timer = NULL;
- if (statePtr->interestMask & TCL_WRITABLE
- && GotFlag(statePtr, CHANNEL_NONBLOCKING)
- && !GotFlag(statePtr, BG_FLUSH_SCHEDULED)) {
+ TclChannelRelease((Tcl_Channel)statePtr->timerChanPtr);
+ statePtr->timerChanPtr = NULL;
+ } else {
+ if (!GotFlag(statePtr, CHANNEL_NEED_MORE_DATA)
+ && (statePtr->interestMask & TCL_READABLE)
+ && (statePtr->inQueueHead != NULL)
+ && IsBufferReady(statePtr->inQueueHead)) {
/*
* Restart the timer in case a channel handler reenters the event loop
* before UpdateInterest gets called by Tcl_NotifyChannel.
*/
statePtr->timer = Tcl_CreateTimerHandler(SYNTHETIC_EVENT_TIME,
ChannelTimerProc,chanPtr);
- Tcl_NotifyChannel((Tcl_Channel) chanPtr, TCL_WRITABLE);
+ Tcl_Preserve(statePtr);
+ Tcl_NotifyChannel((Tcl_Channel) chanPtr, TCL_READABLE);
+ Tcl_Release(statePtr);
} else {
- /* The channel may have just been closed from within Tcl_NotifyChannel */
- if (!GotFlag(statePtr, CHANNEL_INCLOSE)) {
- if (!GotFlag(statePtr, CHANNEL_NEED_MORE_DATA)
- && (statePtr->interestMask & TCL_READABLE)
- && (statePtr->inQueueHead != NULL)
- && IsBufferReady(statePtr->inQueueHead)) {
- /*
- * Restart the timer in case a channel handler reenters the event loop
- * before UpdateInterest gets called by Tcl_NotifyChannel.
- */
-
- statePtr->timer = Tcl_CreateTimerHandler(SYNTHETIC_EVENT_TIME,
- ChannelTimerProc,chanPtr);
- Tcl_NotifyChannel((Tcl_Channel) chanPtr, TCL_READABLE);
- } else {
- CleanupTimerHandler(statePtr);
- UpdateInterest(chanPtr);
- }
- } else {
- CleanupTimerHandler(statePtr);
- }
+ statePtr->timer = NULL;
+ UpdateInterest(chanPtr);
+ TclChannelRelease((Tcl_Channel)statePtr->timerChanPtr);
+ statePtr->timerChanPtr = NULL;
}
- Tcl_Release(statePtr);
}
}
@@ -8803,17 +8761,11 @@ DeleteTimerHandler(
{
if (statePtr->timer != NULL) {
Tcl_DeleteTimerHandler(statePtr->timer);
- CleanupTimerHandler(statePtr);
+ statePtr->timer = NULL;
+ TclChannelRelease((Tcl_Channel)statePtr->timerChanPtr);
+ statePtr->timerChanPtr = NULL;
}
}
-static void
-CleanupTimerHandler(
- ChannelState *statePtr
-){
- TclChannelRelease((Tcl_Channel)statePtr->timerChanPtr);
- statePtr->timer = NULL;
- statePtr->timerChanPtr = NULL;
-}
/*
*----------------------------------------------------------------------