… | |
… | |
635 | |
635 | |
636 | sub trace { |
636 | sub trace { |
637 | my ($seed) = @_; |
637 | my ($seed) = @_; |
638 | my $cv = AE::cv; |
638 | my $cv = AE::cv; |
639 | my %seen; |
639 | my %seen; |
|
|
640 | my $exit; |
640 | |
641 | |
641 | my $to; |
642 | my %to; |
642 | |
643 | |
643 | init; |
644 | init; |
644 | |
645 | |
645 | my $reply = port { |
646 | my $reply = port { |
646 | my ($node, undef, @neigh) = @_; |
647 | my ($node, undef, @neigh) = @_; |
647 | |
648 | |
648 | $to = AE::timer 15, 0, sub { exit 1 }; |
649 | delete $to{$node}; |
|
|
650 | |
649 | @neigh = grep $_ ne $NODE, @neigh; |
651 | @neigh = grep $_ ne $NODE, @neigh; |
650 | |
652 | |
651 | print $node, " -> ", (join " ", @neigh), "\n"; |
653 | print $node, " -> ", (join " ", @neigh), "\n"; |
652 | |
654 | |
653 | for (@neigh) { |
655 | for my $neigh (@neigh) { |
654 | unless ($seen{$_}++) { |
656 | unless ($seen{$neigh}++) { |
655 | $cv->begin; |
657 | $cv->begin; |
|
|
658 | $to{$neigh} = AE::timer 15, 0, sub { |
|
|
659 | print "$neigh (timeout)\n"; |
|
|
660 | $exit = 1; |
|
|
661 | $cv->end; |
|
|
662 | }; |
656 | AnyEvent::MP::Kernel::eval_on $_, "AnyEvent::MP::Kernel::up_nodes" => $SELF => $_; |
663 | AnyEvent::MP::Kernel::eval_on $neigh, "AnyEvent::MP::Kernel::up_nodes" => $SELF => $neigh; |
657 | } |
664 | } |
658 | } |
665 | } |
659 | |
666 | |
660 | $cv->end; |
667 | $cv->end; |
661 | }; |
668 | }; |
662 | |
669 | |
663 | $cv->begin; |
670 | $cv->begin; |
664 | snd $reply, seed => undef, $seed; |
671 | snd $reply, seed => undef, $seed; |
665 | |
672 | |
666 | $cv->recv; |
673 | $cv->recv; |
|
|
674 | |
|
|
675 | exit $exit; |
667 | } |
676 | } |
668 | |
677 | |
669 | sub shell { |
678 | sub shell { |
670 | init; |
679 | init; |
671 | |
680 | |