Tcl Source Code

View Ticket
Login
Ticket UUID: 746722
Title: Tcl_AsyncMark not delivered in tight loops
Type: Bug Version: obsolete: 8.4.5
Submitter: kennykb Created on: 2003-05-31 20:12:17
Subsystem: 47. Bytecode Compiler Assigned To: hobbs
Priority: 5 Medium Severity:
Status: Closed Last Modified: 2003-11-18 06:53:20
Resolution: Fixed Closed By: hobbs
    Closed on: 2003-11-17 23:53:20
Description:
If a bytecoded code sequence contains a tight loop such as

while {1} {}

(in other words, the loop contains no TCL_INVOKE* bytecodes
when compiled), then async events requested in the current
interpreter are not delivered.

Attached patch contains two test cases, one that works, and
one that goes into an endless loop.
User Comments: hobbs added on 2003-11-18 06:53:20:
Logged In: YES 
user_id=72656

I wimped out and decided not to make these changes for 
8.4.5.  It spanned a few changes, which indicates it had it's 
little subtleties.  For reference, the changes when in from 
[1.114 to 1.117), in case we want to backport for 8.4.6.

msofer added on 2003-11-17 06:32:59:
Logged In: YES 
user_id=148712

Jeff: incorporate to 8.4 branch? This should really be a
safe patch, but it has not been stress tested. Also kinda
late ...

dkf added on 2003-11-17 03:27:14:
Logged In: YES 
user_id=79902

Reopening; still need assessment of whether this is a
candidate for 8.4

msofer added on 2003-11-16 18:48:15:

File Deleted - 67633:

msofer added on 2003-11-16 18:48:14:

File Added - 67664: async.patch

Logged In: YES 
user_id=148712

Two small errors fixed in head incorporated to the patch.

dkf added on 2003-11-16 07:52:54:

File Added - 67633: async.patch

dkf added on 2003-11-16 07:52:53:
Logged In: YES 
user_id=79902

Applied with a few extra tweaks.  Is the updated patch a
candidate for 8.4?

async-4.2 and 4.3 fail on Linux.  No idea why.

msofer added on 2003-11-16 05:43:44:

File Added - 67626: async.patch

Logged In: YES 
user_id=148712

Attached a patch that checks for pending asyncs every 16th
instruction; the patch includes the tests of asynctest.patch.
Note that the tests require a threaded build to run.
Please review.

dkf added on 2003-11-11 04:17:49:
Logged In: YES 
user_id=79902

Noting that this issue effectively has to be solved for
TIP#143 to be implementable.

msofer added on 2003-11-07 22:53:57:
Logged In: YES 
user_id=148712

Only in loops does not solve all issues; consider
   proc runLong args \
        [string repeat "set x [string repeat a 2000]\n" 9876543]
   runLong
No async will be delivered while runLong is running, even if
we fix the loops. This argues for option 1, I guess

msofer added on 2003-09-15 06:45:23:
Logged In: YES 
user_id=148712

Option (0): check for async tasks at the top of the TEBC
loop, after every instruction. Easiest, definitely overkill,
probably unacceptable performance loss

Option (1): special bytecode for "command start" or "command
end". Easiest, performance? Can skip it for INST_EVAL,
INST_INVOKE and INST_EXPR as they do the right thing already.

Option (2): special bytecode emitted in every loop (and also
after every, say, fifth command)

Option (3): special bytecode emitted in every tight loop.
Best, tougher to implement as the compiler has to study the
"tightness" of the loops. A suitable definition could be: a
loop is tight if it has none of the previously mentioned
instructions. Also requires a solution for long non-loop bcc
sequences

Option (1) is the cleanest/easiest in my opinion. Never got
around to code it and time it

dkf added on 2003-09-15 04:57:38:
Logged In: YES 
user_id=79902

Would a suitable fix be to add a new bytecode whose sole job
is to call the appropriate Tcl_Async* stuff?  Then we could
modify the compiler to insert this new opcode when
appropriate (either in every loop - most easily done IMO -
or if we detect that the loop body contains no opcodes that
trigger checking for async events - the minimal requirement.)

kennykb added on 2003-06-05 05:22:47:

File Deleted - 51826: 



File Added - 52213: asynctest.patch

Logged In: YES 
user_id=99768

Test cases revised to try to improve failure mode - was an infinite loop

msofer added on 2003-06-05 03:04:11:
Logged In: YES 
user_id=148712

The tests in the patch pass with the current HEAD - i.e.,
they do not expose the bug.

kennykb added on 2003-06-01 03:13:13:

File Added - 51826: async.patch

Attachments: