--- Coro/Coro.pm 2003/11/05 20:02:44 1.55 +++ Coro/Coro.pm 2004/05/13 16:12:14 1.60 @@ -40,7 +40,7 @@ use base Exporter; -$VERSION = 0.8; +$VERSION = 0.96; @EXPORT = qw(async cede schedule terminate current); %EXPORT_TAGS = ( @@ -122,7 +122,7 @@ my @destroy; my $manager; $manager = new Coro sub { - while() { + while () { # by overwriting the state object with the manager we destroy it # while still being able to schedule this coroutine (in case it has # been readied multiple times. this is harmless since the manager @@ -132,6 +132,11 @@ my $coro = pop @destroy; $coro->{status} ||= []; $_->ready for @{delete $coro->{join} || []}; + + # the next line destroys the _coro_state, but keeps the + # process itself intact (we basically make it a zombie + # process that always runs the manager thread, so it's possible + # to transfer() to this process). $coro->{_coro_state} = $manager->{_coro_state}; } &schedule; @@ -159,9 +164,6 @@ print "@_\n"; } 1,2,3,4; -The coderef you submit MUST NOT be a closure that refers to variables -in an outer scope. This does NOT work. Pass arguments into it instead. - =cut sub async(&@) { @@ -189,17 +191,12 @@ =item terminate [arg...] -Terminates the current process. - -Future versions of this function will allow result arguments. +Terminates the current process with the given status values (see L). =cut sub terminate { - $current->{status} = [@_]; - $current->cancel; - &schedule; - die; # NORETURN + $current->cancel (@_); } =back @@ -238,23 +235,26 @@ =cut -=item $process->cancel +=item $process->cancel (arg...) -Like C, but terminates the specified process instead. +Temrinates the given process and makes it return the given arguments as +status (default: the empty list). =cut sub cancel { - push @destroy, $_[0]; + my $self = shift; + $self->{status} = [@_]; + push @destroy, $self; $manager->ready; - &schedule if $current == $_[0]; + &schedule if $current == $self; } =item $process->join Wait until the coroutine terminates and return any values given to the -C function. C can be called multiple times from multiple -processes. +C or C functions. C can be called multiple times +from multiple processes. =cut