ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/Coro.pm
(Generate patch)

Comparing Coro/Coro.pm (file contents):
Revision 1.107 by root, Fri Jan 5 18:25:51 2007 UTC vs.
Revision 1.114 by root, Wed Jan 24 16:22:08 2007 UTC

50 50
51our $idle; # idle handler 51our $idle; # idle handler
52our $main; # main coroutine 52our $main; # main coroutine
53our $current; # current coroutine 53our $current; # current coroutine
54 54
55our $VERSION = '3.3'; 55our $VERSION = '3.5';
56 56
57our @EXPORT = qw(async async_pool cede schedule terminate current unblock_sub); 57our @EXPORT = qw(async async_pool cede schedule terminate current unblock_sub);
58our %EXPORT_TAGS = ( 58our %EXPORT_TAGS = (
59 prio => [qw(PRIO_MAX PRIO_HIGH PRIO_NORMAL PRIO_LOW PRIO_IDLE PRIO_MIN)], 59 prio => [qw(PRIO_MAX PRIO_HIGH PRIO_NORMAL PRIO_LOW PRIO_IDLE PRIO_MIN)],
60); 60);
210Similar to C<async>, but uses a coroutine pool, so you should not call 210Similar to C<async>, but uses a coroutine pool, so you should not call
211terminate or join (although you are allowed to), and you get a coroutine 211terminate or join (although you are allowed to), and you get a coroutine
212that might have executed other code already (which can be good or bad :). 212that might have executed other code already (which can be good or bad :).
213 213
214Also, the block is executed in an C<eval> context and a warning will be 214Also, the block is executed in an C<eval> context and a warning will be
215issued in case of an exception instead of terminating the program, as C<async> does. 215issued in case of an exception instead of terminating the program, as
216C<async> does. As the coroutine is being reused, stuff like C<on_destroy>
217will not work in the expected way, unless you call terminate or cancel,
218which somehow defeats the purpose of pooling.
216 219
217The priority will be reset to C<0> after each job, otherwise the coroutine 220The priority will be reset to C<0> after each job, otherwise the coroutine
218will be re-used "as-is". 221will be re-used "as-is".
219 222
220The pool size is limited to 8 idle coroutines (this can be adjusted by 223The pool size is limited to 8 idle coroutines (this can be adjusted by
230our $POOL_SIZE = 8; 233our $POOL_SIZE = 8;
231our @pool; 234our @pool;
232 235
233sub pool_handler { 236sub pool_handler {
234 while () { 237 while () {
235 my ($cb, @arg) = @{ delete $current->{_invoke} };
236
237 eval { 238 eval {
239 my ($cb, @arg) = @{ delete $current->{_invoke} or return };
238 $cb->(@arg); 240 $cb->(@arg);
239 }; 241 };
240 warn $@ if $@; 242 warn $@ if $@;
241 243
242 last if @pool >= $POOL_SIZE; 244 last if @pool >= $POOL_SIZE;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines