--- Coro/Coro.pm 2007/10/02 23:16:24 1.142 +++ Coro/Coro.pm 2007/12/05 11:32:58 1.161 @@ -8,15 +8,22 @@ async { # some asynchronous thread of execution + print "2\n"; + cede; # yield back to main + print "4\n"; }; - - # alternatively create an async coroutine like this: - - sub some_func : Coro { - # some more async code - } - - cede; + print "1\n"; + cede; # yield to coroutine + print "3\n"; + cede; # and again + + # use locking + my $lock = new Coro::Semaphore; + my $locked; + + $lock->down; + $locked = 1; + $lock->up; =head1 DESCRIPTION @@ -35,7 +42,7 @@ In this module, coroutines are defined as "callchain + lexical variables + @_ + $_ + $@ + $/ + C stack), that is, a coroutine has its own callchain, its own set of lexicals and its own set of perls most important global -variables. +variables (see L for more configuration). =cut @@ -52,7 +59,7 @@ our $main; # main coroutine our $current; # current coroutine -our $VERSION = '3.8'; +our $VERSION = '4.31'; our @EXPORT = qw(async async_pool cede schedule terminate current unblock_sub); our %EXPORT_TAGS = ( @@ -136,7 +143,7 @@ coroutine so the scheduler can run it. Please note that if your callback recursively invokes perl (e.g. for event -handlers), then it must be prepared to be called recursively. +handlers), then it must be prepared to be called recursively itself. =cut @@ -189,6 +196,9 @@ (usually unused). When the sub returns the new coroutine is automatically terminated. +See the C constructor for info about the coroutine +environment in which coroutines run. + Calling C in a coroutine will do the same as calling exit outside the coroutine. Likewise, when the coroutine dies, the program will exit, just as it would in the main program. @@ -218,8 +228,12 @@ will not work in the expected way, unless you call terminate or cancel, which somehow defeats the purpose of pooling. -The priority will be reset to C<0> after each job, otherwise the coroutine -will be re-used "as-is". +The priority will be reset to C<0> after each job, tracing will be +disabled, the description will be reset and the default output filehandle +gets restored, so you can change alkl these. Otherwise the coroutine will +be re-used "as-is": most notably if you change other per-coroutine global +stuff such as C<$/> you need to revert that change, which is most simply +done by using local as in C< local $/ >. The pool size is limited to 8 idle coroutines (this can be adjusted by changing $Coro::POOL_SIZE), and there can be as many non-idle coros as @@ -250,7 +264,7 @@ } }; - last if $@ eq "\3terminate\2\n"; + last if $@ eq "\3async_pool terminate\2\n"; warn $@ if $@; } } @@ -297,15 +311,11 @@ ready queue and calls C, which has the effect of giving up the current "timeslice" to other coroutines of the same or higher priority. -Returns true if at least one coroutine switch has happened. - =item Coro::cede_notself Works like cede, but is not exported by default and will cede to any coroutine, regardless of priority, once. -Returns true if at least one coroutine switch has happened. - =item terminate [arg...] Terminates the current coroutine with the given status values (see L). @@ -346,7 +356,8 @@ called. To make the coroutine run you must first put it into the ready queue by calling the ready method. -See C for additional discussion. +See C and C for additional info about the +coroutine environment. =cut @@ -394,8 +405,8 @@ =item $coroutine->join Wait until the coroutine terminates and return any values given to the -C or C functions. C can be called multiple times -from multiple coroutine. +C or C functions. C can be called concurrently +from multiple coroutines. =cut @@ -465,6 +476,22 @@ This method simply sets the C<< $coroutine->{desc} >> member to the given string. You can modify this member directly if you wish. +=item $coroutine->throw ([$scalar]) + +If C<$throw> is specified and defined, it will be thrown as an exception +inside the coroutine at the next convinient point in time (usually after +it gains control at the next schedule/transfer/cede). Otherwise clears the +exception object. + +The exception object will be thrown "as is" with the specified scalar in +C<$@>, i.e. if it is a string, no line number or newline will be appended +(unlike with C). + +This can be used as a softer means than C to ask a coroutine to +end itself, although there is no guarentee that the exception will lead to +termination, and if the exception isn't caught it might well end the whole +program. + =cut sub desc { @@ -591,13 +618,19 @@ =head1 SEE ALSO -Support/Utility: L, L, L, L. +Lower level Configuration, Coroutine Environment: L. + +Debugging: L. + +Support/Utility: L, L. Locking/IPC: L, L, L, L, L. -Event/IO: L, L, L, L, L. +Event/IO: L, L, L, L. + +Compatibility: L, L, L. -Embedding: L +Embedding: L. =head1 AUTHOR