in reply to Coro: running a specific coroutine

I don't really understand what you want to do. If you want a specific coroutine to run to completion, use $coro->join(). If you want to run any coroutine until no more work is to be done, use Coro::schedule. If you want to start "any coroutine other than me", use cede_notself. In any case, you need to ->join all coroutines that you have spawned at some time earlier in the program, because once the main coroutine ends, no other coroutines will be called anymore.

If you can describe more closely why and how you want to influence the call order, maybe we can find some way. The easiest solution would be if cede took an optional parameter giving the next coroutine to run, but I'm not sure there is a use case for that.

Update: I think the (undocumented) $coro->transfer( $target ) method is what you want to transfer control to another, specified coroutine.

Replies are listed 'Best First'.
Re^2: Coro: running a specific coroutine
by moritz (Cardinal) on Apr 03, 2008 at 14:49 UTC
    I want to call a specific coro (let's say the one in $ca, and when $ca calls cede, it should return to my original ($main) coro.

    And I want that to happen several times, so throwing an exception instead of calling cede in $ca is not an option.

    Update: we talked a lot on the CB, and it seems that Coro::Channel will help me a great deal. I'll have to experiment with it a bit before I can tell if it actually works.

Re^2: Coro: running a specific coroutine
by Anonymous Monk on Apr 06, 2008 at 20:10 UTC
    ->transfer is documented in Coro::State. And you can do what you want like this:
    my $empty = new Coro::State; my $other; $other = new Coro::State sub { print "hi\n"; $other->transfer ($empty); }; $empty->transfer ($other);
    see also the t/00* test script which does this.