… | |
… | |
113 | reasons. If performance is not essential you are encouraged to use the |
113 | reasons. If performance is not essential you are encouraged to use the |
114 | C<Coro::current> function instead. |
114 | C<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; |
… | |
… | |
230 | terminate }> once per second or so to slowly replenish the pool. |
232 | terminate }> once per second or so to slowly replenish the pool. |
231 | |
233 | |
232 | =cut |
234 | =cut |
233 | |
235 | |
234 | our $POOL_SIZE = 8; |
236 | our $POOL_SIZE = 8; |
|
|
237 | our $MAX_POOL_RSS = 64 * 1024; |
235 | our @pool; |
238 | our @pool; |
236 | |
239 | |
237 | sub pool_handler { |
240 | sub pool_handler { |
238 | while () { |
241 | while () { |
239 | $current->{desc} = "[async_pool]"; |
242 | $current->{desc} = "[async_pool]"; |
… | |
… | |
242 | my ($cb, @arg) = @{ delete $current->{_invoke} or return }; |
245 | my ($cb, @arg) = @{ delete $current->{_invoke} or return }; |
243 | $cb->(@arg); |
246 | $cb->(@arg); |
244 | }; |
247 | }; |
245 | warn $@ if $@; |
248 | warn $@ if $@; |
246 | |
249 | |
247 | last if @pool >= $POOL_SIZE; |
250 | last if @pool >= $POOL_SIZE || $current->rss >= $MAX_POOL_RSS; |
248 | |
251 | |
249 | push @pool, $current; |
252 | push @pool, $current; |
250 | $current->{desc} = "[async_pool idle]"; |
253 | $current->{desc} = "[async_pool idle]"; |
251 | $current->save (Coro::State::SAVE_DEF); |
254 | $current->save (Coro::State::SAVE_DEF); |
252 | $current->prio (0); |
255 | $current->prio (0); |