… | |
… | |
155 | # call all destruction callbacks |
155 | # call all destruction callbacks |
156 | $_->(@{$self->{status}}) |
156 | $_->(@{$self->{status}}) |
157 | for @{(delete $self->{destroy_cb}) || []}; |
157 | for @{(delete $self->{destroy_cb}) || []}; |
158 | } |
158 | } |
159 | |
159 | |
|
|
160 | sub _do_trace { |
|
|
161 | $current->{_trace_cb}->(); |
|
|
162 | } |
|
|
163 | |
160 | # this coroutine is necessary because a coroutine |
164 | # this coroutine is necessary because a coroutine |
161 | # cannot destroy itself. |
165 | # cannot destroy itself. |
162 | my @destroy; |
166 | my @destroy; |
163 | my $manager; |
167 | my $manager; |
164 | |
168 | |
… | |
… | |
241 | my $cb; |
245 | my $cb; |
242 | |
246 | |
243 | while () { |
247 | while () { |
244 | eval { |
248 | eval { |
245 | while () { |
249 | while () { |
246 | $cb = &_pool_1 |
250 | _pool_1 $cb; |
247 | or return; |
|
|
248 | |
|
|
249 | &$cb; |
251 | &$cb; |
250 | |
252 | _pool_2 $cb; |
251 | return if &_pool_2; |
|
|
252 | |
|
|
253 | undef $cb; |
|
|
254 | schedule; |
253 | &schedule; |
255 | } |
254 | } |
256 | }; |
255 | }; |
257 | |
256 | |
|
|
257 | last if $@ eq "\3terminate\2\n"; |
258 | warn $@ if $@; |
258 | warn $@ if $@; |
259 | } |
259 | } |
260 | } |
260 | } |
261 | |
261 | |
262 | sub async_pool(&@) { |
262 | sub async_pool(&@) { |
263 | # this is also inlined into the unlock_scheduler |
263 | # this is also inlined into the unlock_scheduler |
264 | my $coro = (pop @async_pool) || new Coro \&pool_handler;; |
264 | my $coro = (pop @async_pool) || new Coro \&pool_handler; |
265 | |
265 | |
266 | $coro->{_invoke} = [@_]; |
266 | $coro->{_invoke} = [@_]; |
267 | $coro->ready; |
267 | $coro->ready; |
268 | |
268 | |
269 | $coro |
269 | $coro |