ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent-MP/MP/Node.pm
(Generate patch)

Comparing AnyEvent-MP/MP/Node.pm (file contents):
Revision 1.60 by root, Wed Mar 21 15:22:16 2012 UTC vs.
Revision 1.61 by root, Wed Mar 21 23:48:39 2012 UTC

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
268our $DELAY = -50; 268our $DELAY = -50;
269our @DELAY; 269our @DELAY;
270our $DELAY_W; 270our $DELAY_W;
271 271
272sub _send_delayed { 272our $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
280sub transport_reset { 280sub 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
314sub monitor { 314sub monitor {
315 # maybe always delay, too? 315 # maybe always delay, too?
316 if ($DELAY_W) { 316 if ($DELAY_W) {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines