Tcl Source Code

View Ticket
Login
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].