… | |
… | |
267 | # delay every so often to avoid recursion, also used to delay after spawn |
267 | # delay every so often to avoid recursion, also used to delay after spawn |
268 | our $DELAY = -50; |
268 | our $DELAY = -50; |
269 | our @DELAY; |
269 | our @DELAY; |
270 | our $DELAY_W; |
270 | our $DELAY_W; |
271 | |
271 | |
272 | sub _send_delayed { |
272 | our $send_delayed = sub { |
273 | $AnyEvent::MP::Kernel::SRCNODE = $AnyEvent::MP::Kernel::NODE; |
273 | $AnyEvent::MP::Kernel::SRCNODE = $AnyEvent::MP::Kernel::NODE; |
274 | (shift @DELAY)->() |
274 | (shift @DELAY)->() |
275 | while @DELAY; |
275 | while @DELAY; |
276 | undef $DELAY_W; |
276 | undef $DELAY_W; |
277 | $DELAY = -50; |
277 | $DELAY = -50; |
278 | } |
278 | }; |
279 | |
279 | |
280 | sub transport_reset { |
280 | sub transport_reset { |
281 | my ($self) = @_; |
281 | my ($self) = @_; |
282 | |
282 | |
283 | Scalar::Util::weaken $self; |
283 | Scalar::Util::weaken $self; |
284 | |
284 | |
285 | $self->{send} = sub { |
285 | $self->{send} = sub { |
286 | if ($DELAY++ >= 0) { |
286 | if (++$DELAY > 0) { |
287 | my $msg = $_[0]; |
287 | my $msg = $_[0]; |
288 | push @DELAY, sub { AnyEvent::MP::Kernel::_inject (@$msg) }; |
288 | push @DELAY, sub { AnyEvent::MP::Kernel::_inject (@$msg) }; |
289 | $DELAY_W ||= AE::timer 0, 0, \&_send_delayed; |
289 | $DELAY_W ||= AE::timer 0, 0, $send_delayed; |
290 | return; |
290 | return; |
291 | } |
291 | } |
292 | |
292 | |
293 | local $AnyEvent::MP::Kernel::SRCNODE = $AnyEvent::MP::Kernel::NODE; |
293 | local $AnyEvent::MP::Kernel::SRCNODE = $AnyEvent::MP::Kernel::NODE; |
294 | AnyEvent::MP::Kernel::_inject (@{ $_[0] }); |
294 | AnyEvent::MP::Kernel::_inject (@{ $_[0] }); |
… | |
… | |
306 | |
306 | |
307 | # we _always_ delay kil's, to avoid calling mon callbacks |
307 | # we _always_ delay kil's, to avoid calling mon callbacks |
308 | # from anything but the event loop context. |
308 | # from anything but the event loop context. |
309 | $DELAY = 1; |
309 | $DELAY = 1; |
310 | push @DELAY, sub { AnyEvent::MP::Kernel::_kill (@args) }; |
310 | push @DELAY, sub { AnyEvent::MP::Kernel::_kill (@args) }; |
311 | $DELAY_W ||= AE::timer 0, 0, \&_send_delayed; |
311 | $DELAY_W ||= AE::timer 0, 0, $send_delayed; |
312 | } |
312 | } |
313 | |
313 | |
314 | sub monitor { |
314 | sub monitor { |
315 | # maybe always delay, too? |
315 | # maybe always delay, too? |
316 | if ($DELAY_W) { |
316 | if ($DELAY_W) { |