--- AnyEvent-MP/MP/Node.pm 2009/09/07 12:04:32 1.38 +++ AnyEvent-MP/MP/Node.pm 2009/09/08 13:46:25 1.39 @@ -208,7 +208,7 @@ sub _send_delayed { local $AnyEvent::MP::Kernel::SRCNODE = $AnyEvent::MP::Kernel::NODE{""}; - AnyEvent::MP::Kernel::_inject (@{ shift @DELAY }) + (shift @DELAY)->() while @DELAY; undef $DELAY_W; $DELAY = -50; @@ -221,7 +221,8 @@ $self->{send} = sub { if ($DELAY++ >= 0) { - push @DELAY, $_[0]; + my $msg = $_[0]; + push @DELAY, sub { AnyEvent::MP::Kernel::_inject (@$msg) }; $DELAY_W ||= AE::timer 0, 0, \&_send_delayed; } else { local $AnyEvent::MP::Kernel::SRCNODE = $self; @@ -239,29 +240,41 @@ sub kill { my ($self, $port, @reason) = @_; - delete $AnyEvent::MP::Kernel::PORT{$port}; - delete $AnyEvent::MP::Kernel::PORT_DATA{$port}; + my $delay_cb = sub { + delete $AnyEvent::MP::Kernel::PORT{$port}; + delete $AnyEvent::MP::Kernel::PORT_DATA{$port}; + + my $mon = delete $AnyEvent::MP::Kernel::LMON{$port} + or !@reason + or $AnyEvent::MP::Kernel::WARN->(8, "unmonitored local port $port died with reason: @reason"); - my $mon = delete $AnyEvent::MP::Kernel::LMON{$port} - or !@reason - or $AnyEvent::MP::Kernel::WARN->(8, "unmonitored local port $port died with reason: @reason"); + $_->(@reason) for values %$mon; + }; - $_->(@reason) for values %$mon; + $DELAY_W ? push @DELAY, $delay_cb : &$delay_cb; } sub monitor { my ($self, $portid, $cb) = @_; - return $cb->(no_such_port => "cannot monitor nonexistent port", "$self->{id}#$portid") - unless exists $AnyEvent::MP::Kernel::PORT{$portid}; + my $delay_cb = sub { + return $cb->(no_such_port => "cannot monitor nonexistent port", "$self->{id}#$portid") + unless exists $AnyEvent::MP::Kernel::PORT{$portid}; + + $AnyEvent::MP::Kernel::LMON{$portid}{$cb+0} = $cb; + }; - $AnyEvent::MP::Kernel::LMON{$portid}{$cb+0} = $cb; + $DELAY_W ? push @DELAY, $delay_cb : &$delay_cb; } sub unmonitor { my ($self, $portid, $cb) = @_; - delete $AnyEvent::MP::Kernel::LMON{$portid}{$cb+0}; + my $delay_cb = sub { + delete $AnyEvent::MP::Kernel::LMON{$portid}{$cb+0}; + }; + + $DELAY_W ? push @DELAY, $delay_cb : &$delay_cb; } =head1 SEE ALSO