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

Comparing Coro/Coro.pm (file contents):
Revision 1.226 by root, Wed Nov 19 16:01:32 2008 UTC vs.
Revision 1.227 by root, Thu Nov 20 03:10:30 2008 UTC

247our $POOL_SIZE = 8; 247our $POOL_SIZE = 8;
248our $POOL_RSS = 16 * 1024; 248our $POOL_RSS = 16 * 1024;
249our @async_pool; 249our @async_pool;
250 250
251sub pool_handler { 251sub pool_handler {
252 my $cb;
253
254 while () { 252 while () {
255 eval { 253 eval {
256 while () { 254 &{&_pool_handler} while 1;
257 _pool_1 $cb;
258 &$cb;
259 _pool_2 $cb;
260 &schedule;
261 }
262 }; 255 };
263 256
264 if ($@) {
265 last if $@ eq "\3async_pool terminate\2\n";
266 warn $@; 257 warn $@ if $@;
267 }
268 } 258 }
269}
270
271sub async_pool(&@) {
272 # this is also inlined into the unblock_scheduler
273 my $coro = (pop @async_pool) || new Coro \&pool_handler;
274
275 $coro->{_invoke} = [@_];
276 $coro->ready;
277
278 $coro
279} 259}
280 260
281=back 261=back
282 262
283=head2 STATIC METHODS 263=head2 STATIC METHODS
610# return immediately and can be reused) and because we cannot cede 590# return immediately and can be reused) and because we cannot cede
611# inside an event callback. 591# inside an event callback.
612our $unblock_scheduler = new Coro sub { 592our $unblock_scheduler = new Coro sub {
613 while () { 593 while () {
614 while (my $cb = pop @unblock_queue) { 594 while (my $cb = pop @unblock_queue) {
615 # this is an inlined copy of async_pool 595 &async_pool (@$cb);
616 my $coro = (pop @async_pool) || new Coro \&pool_handler;
617 596
618 $coro->{_invoke} = $cb;
619 $coro->ready;
620 cede; # for short-lived callbacks, this reduces pressure on the coro pool 597 # for short-lived callbacks, this reduces pressure on the coro pool
598 # as the chance is very high that the async_poll coro will be back
599 # in the idle state when cede returns
600 cede;
621 } 601 }
622 schedule; # sleep well 602 schedule; # sleep well
623 } 603 }
624}; 604};
625$unblock_scheduler->{desc} = "[unblock_sub scheduler]"; 605$unblock_scheduler->{desc} = "[unblock_sub scheduler]";

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines