Tcl Source Code

View Ticket
Login
Ticket UUID: 403432
Title: Fix for Bug 118203
Type: Patch Version: None
Submitter: dgp Created on: 2001-01-26 02:00:14
Subsystem: 25. Channel System Assigned To: dgp
Priority: 5 Medium Severity: Minor
Status: Closed Last Modified: 2016-08-22 12:30:20
Resolution: None Closed By: dkf
    Closed on: 2016-08-22 12:30:20
Description:
CopyData() has a bug in its management of the number
of bytes copied.  After reading and writing some bytes,
it should update the byte count.  However, before it
updates the byte count, it manages some fileevent
handlers in the case that the writing operation has
gone into the background.  In that circumstance, the
copy loop is exited without an update to the byte count,
leading to all the nastiness reported in Bug 118203.

The fix is simple:  Move the byte count update earlier
in the loop where it properly belongs.

The patch also fixes an error in the file event management,
where the wrong file event handler was being deleted.
User Comments: dgp added on 2001-01-31 00:32:28:

Patch Code - Modified - New Version

On my Solaris 2.7 system, a 'make test' on the
contents of the CVS HEAD branch reports 0 tests failed
both before and after this patch is applied.

Committing to CVS HEAD...

andreas_kupries added on 2001-01-30 16:14:35:
Thanks for the explanations Don. If this change with the filehandlers doesn't break any of the existing tests I would accept the patch as it is.

dgp added on 2001-01-27 00:50:56:
The change from outChan to inChan is a fix unrelated to
Bug 118203.  I'm happy to move it to a separate patch if it
delays acceptance of this patch.

In generic/tclIO.c (Revision 1.27), compare lines 7058-7065
to lines 7089-7096.  It looks to me like those sections are
intended to change which channel, inChan or outChan, the
copy operation is waiting on.  In lines 7058-7065, we know
that inChan is not ready, so if we're already waiting on
inChan (mask & TCL_READABLE), do nothing.  If we're not
waiting on inChan, then check if we're waiting on outChan
(mask & TCL_WRITABLE).  If so, cancel that wait, and start
waiting on inChan, so when we exit the loop we're waiting
only on inChan.

To perform the analogous operation in lines 7089-7096, the
change included in this patch is necessary.  Then the logic
is that when outChan is not ready and we're not already
waiting for it, cancel any wait for inChan, and start
waiting for outChan.

My assumption is that the copy operation wants to be waiting
on only one of the channels at a time.  The fix implements
that assumption.  As currently written, the copy operation
can be waiting on both channels at the same time, and
CopyData() may be called many times by an uncancelled
readable fileevent when it can't do anything useful because
outChan is still not ready.

dkf added on 2001-01-26 17:04:45:
Why the change from outChan to inChan in the centre of the patch?

dgp added on 2001-01-26 09:07:09:

Patch Code - Modified - New Version

D'oh!  Correcting patch number...

OK, now please review.

dgp added on 2001-01-26 09:03:02:

Patch Code - Modified - New Version

Added patch id number to ChangeLog message.

Please review.

Attachments: