--- AnyEvent-FastPing/FastPing.pm 2014/10/13 11:15:15 1.17 +++ AnyEvent-FastPing/FastPing.pm 2016/11/11 01:18:56 1.18 @@ -29,7 +29,7 @@ use AnyEvent; BEGIN { - our $VERSION = 2.02; + our $VERSION = 2.03; our @ISA = qw(Exporter); require Exporter; @@ -43,8 +43,24 @@ our $THR_RES_FH; open $THR_RES_FH, "<&=$THR_RES_FD" or die "FATAL: cannot fdopen"; -our $ICMP4_FH; our $ICMP4_W = $ICMP4_FD >= 0 && (open $ICMP4_FH, "<&=$ICMP4_FD") && AE::io $ICMP4_FH, 0, \&_recv_icmp4; -our $ICMP6_FH; our $ICMP6_W = $ICMP6_FD >= 0 && (open $ICMP6_FH, "<&=$ICMP6_FD") && AE::io $ICMP6_FH, 0, \&_recv_icmp6; +our $ICMP4_FH; +our $ICMP6_FH; + +our @IDLE_CB; + +AnyEvent::post_detect { + our $ICMP4_W = $ICMP4_FD >= 0 && (open $ICMP4_FH, "<&=$ICMP4_FD") && AE::io $ICMP4_FH, 0, \&_recv_icmp4; + our $ICMP6_W = $ICMP6_FD >= 0 && (open $ICMP6_FH, "<&=$ICMP6_FD") && AE::io $ICMP6_FH, 0, \&_recv_icmp6; + + our $THR_RES_W = AE::io $THR_RES_FH, 0, sub { + sysread $THR_RES_FH, my $buf, 8; + + for my $id (unpack "S*", $buf) { + _stop_id $id; + ($IDLE_CB[$id] || sub { })->(); + } + }; +}; =item AnyEvent::FastPing::ipv4_supported @@ -155,11 +171,11 @@ sub new { my ($klass) = @_; + AnyEvent::detect unless defined $AnyEvent::MODEL; + _new $klass, (rand 65536), (rand 65536), (rand 65536) } -our @IDLE_CB; - sub DESTROY { undef $IDLE_CB[ &id ]; &_free; @@ -228,15 +244,6 @@ $IDLE_CB[ &id ] = $_[1]; } -our $THR_RES_W = AE::io $THR_RES_FH, 0, sub { - sysread $THR_RES_FH, my $buf, 8; - - for my $id (unpack "S*", $buf) { - _stop_id $id; - ($IDLE_CB[$id] || sub { })->(); - } -}; - =item $pinger->interval ($seconds) Configures the minimum interval between packet sends for this pinger - the