… | |
… | |
27 | use common::sense; |
27 | use common::sense; |
28 | |
28 | |
29 | use AnyEvent; |
29 | use AnyEvent; |
30 | |
30 | |
31 | BEGIN { |
31 | BEGIN { |
32 | our $VERSION = '2.0'; |
32 | our $VERSION = 2.03; |
33 | our @ISA = qw(Exporter); |
33 | our @ISA = qw(Exporter); |
34 | |
34 | |
35 | require Exporter; |
35 | require Exporter; |
36 | #Exporter::export_ok_tags (keys %EXPORT_TAGS); |
36 | #Exporter::export_ok_tags (keys %EXPORT_TAGS); |
37 | |
37 | |
… | |
… | |
41 | |
41 | |
42 | our ($THR_RES_FD, $ICMP4_FD, $ICMP6_FD); |
42 | our ($THR_RES_FD, $ICMP4_FD, $ICMP6_FD); |
43 | |
43 | |
44 | our $THR_RES_FH; open $THR_RES_FH, "<&=$THR_RES_FD" or die "FATAL: cannot fdopen"; |
44 | our $THR_RES_FH; open $THR_RES_FH, "<&=$THR_RES_FD" or die "FATAL: cannot fdopen"; |
45 | |
45 | |
|
|
46 | our $ICMP4_FH; |
|
|
47 | our $ICMP6_FH; |
|
|
48 | |
|
|
49 | our @IDLE_CB; |
|
|
50 | |
|
|
51 | AnyEvent::post_detect { |
46 | our $ICMP4_FH; our $ICMP4_W = $ICMP4_FD >= 0 && (open $ICMP4_FH, "<&=$ICMP4_FD") && AE::io $ICMP4_FH, 0, \&_recv_icmp4; |
52 | our $ICMP4_W = $ICMP4_FD >= 0 && (open $ICMP4_FH, "<&=$ICMP4_FD") && AE::io $ICMP4_FH, 0, \&_recv_icmp4; |
47 | our $ICMP6_FH; our $ICMP6_W = $ICMP6_FD >= 0 && (open $ICMP6_FH, "<&=$ICMP6_FD") && AE::io $ICMP6_FH, 0, \&_recv_icmp6; |
53 | our $ICMP6_W = $ICMP6_FD >= 0 && (open $ICMP6_FH, "<&=$ICMP6_FD") && AE::io $ICMP6_FH, 0, \&_recv_icmp6; |
|
|
54 | |
|
|
55 | our $THR_RES_W = AE::io $THR_RES_FH, 0, sub { |
|
|
56 | sysread $THR_RES_FH, my $buf, 8; |
|
|
57 | |
|
|
58 | for my $id (unpack "S*", $buf) { |
|
|
59 | _stop_id $id; |
|
|
60 | ($IDLE_CB[$id] || sub { })->(); |
|
|
61 | } |
|
|
62 | }; |
|
|
63 | }; |
48 | |
64 | |
49 | =item AnyEvent::FastPing::ipv4_supported |
65 | =item AnyEvent::FastPing::ipv4_supported |
50 | |
66 | |
51 | Returns true iff IPv4 is supported in this module and on this system. |
67 | Returns true iff IPv4 is supported in this module and on this system. |
52 | |
68 | |
… | |
… | |
153 | =cut |
169 | =cut |
154 | |
170 | |
155 | sub new { |
171 | sub new { |
156 | my ($klass) = @_; |
172 | my ($klass) = @_; |
157 | |
173 | |
|
|
174 | AnyEvent::detect unless defined $AnyEvent::MODEL; |
|
|
175 | |
158 | _new $klass, (rand 65536), (rand 65536), (rand 65536) |
176 | _new $klass, (rand 65536), (rand 65536), (rand 65536) |
159 | } |
177 | } |
160 | |
|
|
161 | our @IDLE_CB; |
|
|
162 | |
178 | |
163 | sub DESTROY { |
179 | sub DESTROY { |
164 | undef $IDLE_CB[ &id ]; |
180 | undef $IDLE_CB[ &id ]; |
165 | &_free; |
181 | &_free; |
166 | } |
182 | } |
… | |
… | |
225 | =cut |
241 | =cut |
226 | |
242 | |
227 | sub on_idle { |
243 | sub on_idle { |
228 | $IDLE_CB[ &id ] = $_[1]; |
244 | $IDLE_CB[ &id ] = $_[1]; |
229 | } |
245 | } |
230 | |
|
|
231 | our $THR_RES_W = AE::io $THR_RES_FH, 0, sub { |
|
|
232 | sysread $THR_RES_FH, my $buf, 8; |
|
|
233 | |
|
|
234 | for my $id (unpack "S*", $buf) { |
|
|
235 | _stop_id $id; |
|
|
236 | ($IDLE_CB[$id] || sub { })->(); |
|
|
237 | } |
|
|
238 | }; |
|
|
239 | |
246 | |
240 | =item $pinger->interval ($seconds) |
247 | =item $pinger->interval ($seconds) |
241 | |
248 | |
242 | Configures the minimum interval between packet sends for this pinger - the |
249 | Configures the minimum interval between packet sends for this pinger - the |
243 | pinger will not send packets faster than this rate (or actually 1 / rate), |
250 | pinger will not send packets faster than this rate (or actually 1 / rate), |