--- AnyEvent-MP/MP/Node.pm 2009/09/06 00:13:21 1.37 +++ AnyEvent-MP/MP/Node.pm 2009/09/07 12:04:32 1.38 @@ -201,14 +201,32 @@ # we are trivially connected } +# delay every so often to avoid recursion, also used to delay after spawn +our $DELAY; +our @DELAY; +our $DELAY_W; + +sub _send_delayed { + local $AnyEvent::MP::Kernel::SRCNODE = $AnyEvent::MP::Kernel::NODE{""}; + AnyEvent::MP::Kernel::_inject (@{ shift @DELAY }) + while @DELAY; + undef $DELAY_W; + $DELAY = -50; +} + sub transport_reset { my ($self) = @_; Scalar::Util::weaken $self; $self->{send} = sub { - local $AnyEvent::MP::Kernel::SRCNODE = $self; - AnyEvent::MP::Kernel::_inject (@{ $_[0] }); + if ($DELAY++ >= 0) { + push @DELAY, $_[0]; + $DELAY_W ||= AE::timer 0, 0, \&_send_delayed; + } else { + local $AnyEvent::MP::Kernel::SRCNODE = $self; + AnyEvent::MP::Kernel::_inject (@{ $_[0] }); + } }; }