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

Comparing cvsroot/Coro/Coro.pm (file contents):
Revision 1.129 by root, Wed Sep 19 22:33:08 2007 UTC vs.
Revision 1.132 by root, Thu Sep 20 22:53:23 2007 UTC

113reasons. If performance is not essential you are encouraged to use the 113reasons. If performance is not essential you are encouraged to use the
114C<Coro::current> function instead. 114C<Coro::current> function instead.
115 115
116=cut 116=cut
117 117
118$main->{desc} = "[main::]";
119
118# maybe some other module used Coro::Specific before... 120# maybe some other module used Coro::Specific before...
119$main->{specific} = $current->{specific} 121$main->{specific} = $current->{specific}
120 if $current; 122 if $current;
121 123
122_set_current $main; 124_set_current $main;
159# cannot destroy itself. 161# cannot destroy itself.
160my @destroy; 162my @destroy;
161my $manager; 163my $manager;
162 164
163$manager = new Coro sub { 165$manager = new Coro sub {
164 $current->desc ("[coro manager]");
165
166 while () { 166 while () {
167 (shift @destroy)->_cancel 167 (shift @destroy)->_cancel
168 while @destroy; 168 while @destroy;
169 169
170 &schedule; 170 &schedule;
171 } 171 }
172}; 172};
173 173$manager->desc ("[coro manager]");
174$manager->prio (PRIO_MAX); 174$manager->prio (PRIO_MAX);
175 175
176# static methods. not really. 176# static methods. not really.
177 177
178=back 178=back
230terminate }> once per second or so to slowly replenish the pool. 230terminate }> once per second or so to slowly replenish the pool.
231 231
232=cut 232=cut
233 233
234our $POOL_SIZE = 8; 234our $POOL_SIZE = 8;
235our $MAX_POOL_RSS = 64 * 1024;
235our @pool; 236our @pool;
236 237
237sub pool_handler { 238sub pool_handler {
238 while () { 239 while () {
239 $current->{desc} = "[async_pool]"; 240 $current->{desc} = "[async_pool]";
242 my ($cb, @arg) = @{ delete $current->{_invoke} or return }; 243 my ($cb, @arg) = @{ delete $current->{_invoke} or return };
243 $cb->(@arg); 244 $cb->(@arg);
244 }; 245 };
245 warn $@ if $@; 246 warn $@ if $@;
246 247
247 last if @pool >= $POOL_SIZE; 248 last if @pool >= $POOL_SIZE || $current->rss >= $MAX_POOL_RSS;
248 249
249 push @pool, $current; 250 push @pool, $current;
250 $current->{desc} = "[async_pool idle]"; 251 $current->{desc} = "[async_pool idle]";
251 $current->save (Coro::State::SAVE_DEF); 252 $current->save (Coro::State::SAVE_DEF);
252 $current->prio (0); 253 $current->prio (0);
530 531
531# we create a special coro because we want to cede, 532# we create a special coro because we want to cede,
532# to reduce pressure on the coro pool (because most callbacks 533# to reduce pressure on the coro pool (because most callbacks
533# return immediately and can be reused) and because we cannot cede 534# return immediately and can be reused) and because we cannot cede
534# inside an event callback. 535# inside an event callback.
535our $unblock_scheduler = async { 536our $unblock_scheduler = new Coro sub {
536 $current->desc ("[unblock_sub scheduler]");
537 while () { 537 while () {
538 while (my $cb = pop @unblock_queue) { 538 while (my $cb = pop @unblock_queue) {
539 # this is an inlined copy of async_pool 539 # this is an inlined copy of async_pool
540 my $coro = (pop @pool or new Coro \&pool_handler); 540 my $coro = (pop @pool or new Coro \&pool_handler);
541 541
544 cede; # for short-lived callbacks, this reduces pressure on the coro pool 544 cede; # for short-lived callbacks, this reduces pressure on the coro pool
545 } 545 }
546 schedule; # sleep well 546 schedule; # sleep well
547 } 547 }
548}; 548};
549$unblock_scheduler->desc ("[unblock_sub scheduler]");
549 550
550sub unblock_sub(&) { 551sub unblock_sub(&) {
551 my $cb = shift; 552 my $cb = shift;
552 553
553 sub { 554 sub {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines