Tcl Source Code

View Ticket
Login
Ticket UUID: 417839
Title: vwait bug
Type: Bug Version: None
Submitter: agentorange Created on: 2001-04-21 14:54:58
Subsystem: 02. Event Loops Assigned To: dkf
Priority: 5 Medium Severity:
Status: Closed Last Modified: 2001-04-30 22:23:00
Resolution: Invalid Closed By: agentorange
    Closed on: 2001-04-30 15:23:00
Description:
In the attached code, I try to do what the vwait
man page says should be possible.
I have a top-level vwait and its event loop
calls vwait on another variable.  I know the
value of this new variable changes, but vwait
never detects this change.  I think all
Tcl8.x have this problem.
User Comments: agentorange added on 2001-04-30 22:23:00:
Logged In: YES 
user_id=162215

I understand the problem now.  What is the correct way
to implement locks in TCL?

dkf added on 2001-04-23 16:38:24:
Logged In: YES 
user_id=79902

This is not a bug, but a consequence of the fact that
[vwait]s *nest*, and outer [vwait]s cannot terminate before
all event handlers (containing calls to [vwait] as it turns
out) finish.  In this case, you've got:

main
  proc f2
    vwait temp
      after handler
        proc f1
          getLock
            vwait lock

As you can see, the wait for temp won't finish while all
that clutter inside it is still going, but until that
happens, the assignment to lock won't happen and the inner
wait for lock won't terminate.  Hence DEADLOCK.

No change of this behaviour is possible without a complete
change of some pretty fundamental stuff (e.g. interpreters
have to have multiple threads executing within them, meaning
you need to introduce lots of semaphores and monitors, lots
of code needs to be updated to no longer assume that event
handlers run uninterruptably, etc.)

The easiest way of fixing your code is probably to get rid
of nested [vwait]s (and [update] and [tkwait] too) by never
calling the command in an event handler (there are a few
situations where it is useful, but this isn't one of them
IMO) and to take advantage of the fact that event handlers
will not be pre-empted by the interpreter.

agentorange added on 2001-04-21 21:54:59:

File Added - 5586: lock.tcl

Attachments: