Ticket UUID: | 5106fddd4400e5b9b063258b44f9685fb4750830 | |||
Title: | failure to yieldto is not the same thing as not calling yieldto in the first place | |||
Type: | Bug | Version: | ||
Submitter: | pooryorick | Created on: | 2021-06-20 08:31:14 | |
Subsystem: | 60. NRE and coroutines | Assigned To: | pooryorick | |
Priority: | 5 Medium | Severity: | Important | |
Status: | Closed | Last Modified: | 2021-06-23 18:53:20 | |
Resolution: | Duplicate | Closed By: | pooryorick | |
Closed on: | 2021-06-23 18:53:20 | |||
Description: |
(text/x-fossil-wiki)
In the following script control eventually returns to p1, which sets <code>$done</code> to <code>success</code>. The fact that <code>$done1</code> has a final value of <code>failure</code> shows that the attempt to yield back to p1 failed, so how did control end up in p1 again? <code><verbatim> variable done proc p0 {} { yield variable done0 after 0 [list [namespace which c1]] vwait [namespace current]::done0 } proc p1 {} { variable done0 yield yieldto try "yieldto [list [info coroutine]]" on error {} " ::set [list [namespace current]]::done1 failure ::set [list [namespace current]]::done0 failure " set done0 success } coroutine c0 p0 coroutine c1 p1 after 1 [list [namespace which c0]] vwait [namespace current]::done0 puts [list status $done0 $done1] </verbatim></code> <b>output:</b> <verbatim> status success failure </verbatim> If the script doesn't attempt the inner yieldto, and just sets the variables instead, the result is different: <code><verbatim> variable done proc p0 {} { yield variable done0 after 0 [list [namespace which c1]] vwait [namespace current]::done0 } proc p1 {} { variable done0 yield yieldto try " ::set [list [namespace current]]::done1 failure ::set [list [namespace current]]::done0 failure " set done0 success } coroutine c0 p0 coroutine c1 p1 after 1 [list [namespace which c0]] vwait [namespace current]::done0 puts [list status $done0 $done1] </verbatim></code> <b>output:</b> <verbatim> status failure failure </verbatim> So apparently in the first script the failure to yield back to c1 affects some internal state and changes the outcome. | |||
User Comments: |
pooryorick added on 2021-06-21 05:56:04:
(text/x-fossil-wiki)
Test case added in [5cfdd6ee7b7f2099]. pooryorick added on 2021-06-21 05:44:05: (text/x-fossil-wiki) Duplicate of [f9800d52bd61f240]. |