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:
- lock.tcl [download] added by agentorange on 2001-04-21 21:54:59. [details]