#1710: [BUG]  exit of a Coroutine affects all of its sister clones
----------------------+-----------------------------------------------------
 Reporter:  pmichaud  |       Owner:       
     Type:  bug       |      Status:  new  
 Priority:  normal    |   Milestone:       
Component:  none      |     Version:  2.5.0
 Severity:  medium    |    Keywords:       
     Lang:            |       Patch:       
 Platform:            |  
----------------------+-----------------------------------------------------
 If any clone of a Coroutine dies, then it exits all of the clones.  The
 best way to illustrate is with code:

 {{{
 $ cat coro.pir
 .sub 'main' :main
     .const 'Sub' $P99 = 'coro'

     .local pmc three, four, five
     three = clone $P99
     four  = clone $P99
     five  = clone $P99

     three(3)
     four(4)
     five(5)

     three()
     four()
     five()

     three()
 .end

 .sub '' :anon :subid('coro')
     .param int x
     print x
     say '.0'
     .yield (x)

     print x
     say '.1'
     .yield (x)

     print x
     say '.done'
 .end
 $ ./parrot coro.pir
 3.0
 4.0
 5.0
 3.1
 4.1
 5.1
 3.done
 4.done
 5.done
 Cannot resume dead coroutine.
 current instr.: 'main' pc 37 (coro.pir:11)
 $
 }}}

 Note that calling the 'three' clone the final time is sufficient to make
 the 'four' and 'five' clones to also resume + exit (without being
 explicitly invoked), and leads to the "Cannot resume dead coroutine"
 exception.

 This is very likely to be strongly related to TT #1702.

 One possible workaround is to make sure that a coroutine never exits;
 e.g., by entering an infinite "yield" loop at the end of the Coroutine.
 This is what PGE has apparently done for quite some time.

 Pm

-- 
Ticket URL: <https://trac.parrot.org/parrot/ticket/1710>
Parrot <https://trac.parrot.org/parrot/>
Parrot Development
_______________________________________________
parrot-tickets mailing list
[email protected]
http://lists.parrot.org/mailman/listinfo/parrot-tickets

Reply via email to