summaryrefslogtreecommitdiffstats
path: root/generic/tclIO.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2024-04-30 11:51:20 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2024-04-30 11:51:20 (GMT)
commit14145609e7b52c939ce5bc328b87b8ab02c7a431 (patch)
treeedbea7aa65629bbfc38c65aa9acac11458681291 /generic/tclIO.c
parentca3723a86ec4a81bd8491fc7259a42dc3c212202 (diff)
parent6e9213a3c4a5d4f7e15204722f1a05f20614f941 (diff)
downloadtcl-14145609e7b52c939ce5bc328b87b8ab02c7a431.zip
tcl-14145609e7b52c939ce5bc328b87b8ab02c7a431.tar.gz
tcl-14145609e7b52c939ce5bc328b87b8ab02c7a431.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;
-}
/*
*----------------------------------------------------------------------