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

Comparing AnyEvent-FastPing/FastPing.pm (file contents):
Revision 1.15 by root, Sat Feb 5 23:37:21 2011 UTC vs.
Revision 1.19 by root, Sat Nov 12 01:20:46 2016 UTC

27use common::sense; 27use common::sense;
28 28
29use AnyEvent; 29use AnyEvent;
30 30
31BEGIN { 31BEGIN {
32 our $VERSION = '2.0'; 32 our $VERSION = 2.1;
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
39 XSLoader::load (__PACKAGE__, $VERSION); 39 XSLoader::load (__PACKAGE__, $VERSION);
40} 40}
41 41
42our ($THR_RES_FD, $ICMP4_FD, $ICMP6_FD); 42our ($THR_RES_FD, $ICMP4_FD, $ICMP6_FD);
43 43
44our $THR_RES_FH; open $THR_RES_FH, "<&=$THR_RES_FD" or die "FATAL: cannot fdopen"; 44our $THR_RES_FH;
45 45
46our $ICMP4_FH; our $ICMP4_W = $ICMP4_FD >= 0 && (open $ICMP4_FH, "<&=$ICMP4_FD") && AE::io $ICMP4_FH, 0, \&_recv_icmp4; 46our $ICMP4_FH;
47our $ICMP6_FH; our $ICMP6_W = $ICMP6_FD >= 0 && (open $ICMP6_FH, "<&=$ICMP6_FD") && AE::io $ICMP6_FH, 0, \&_recv_icmp6; 47our $ICMP6_FH;
48
49our @IDLE_CB;
48 50
49=item AnyEvent::FastPing::ipv4_supported 51=item AnyEvent::FastPing::ipv4_supported
50 52
51Returns true iff IPv4 is supported in this module and on this system. 53Returns true iff IPv4 is supported in this module and on this system.
52 54
151- you should be stingy with your pinger objects. 153- you should be stingy with your pinger objects.
152 154
153=cut 155=cut
154 156
155sub new { 157sub new {
156 my ($klass) = @_; 158 _boot;
157 159
160 our $ICMP4_W = $ICMP4_FD >= 0 && (open $ICMP4_FH, "<&=$ICMP4_FD") && AE::io $ICMP4_FH, 0, \&_recv_icmp4;
161 our $ICMP6_W = $ICMP6_FD >= 0 && (open $ICMP6_FH, "<&=$ICMP6_FD") && AE::io $ICMP6_FH, 0, \&_recv_icmp6;
162
163 open $THR_RES_FH, "<&=$THR_RES_FD" or die "AnyEvent::FastPing: FATAL: cannot fdopen thread result fd";
164
165 our $THR_RES_W = AE::io $THR_RES_FH, 0, sub {
166 sysread $THR_RES_FH, my $buf, 8;
167
168 for my $id (unpack "S*", $buf) {
169 _stop_id $id;
170 ($IDLE_CB[$id] || sub { })->();
171 }
172 };
173
174 *new = sub {
158 _new $klass, (rand 65536), (rand 65536), (rand 65536) 175 _new shift, (rand 65536), (rand 65536), (rand 65536)
176 };
177
178 goto &new;
159} 179}
160
161our @IDLE_CB;
162 180
163sub DESTROY { 181sub DESTROY {
164 undef $IDLE_CB[ &id ]; 182 undef $IDLE_CB[ &id ];
165 &_free; 183 &_free;
166} 184}
225=cut 243=cut
226 244
227sub on_idle { 245sub on_idle {
228 $IDLE_CB[ &id ] = $_[1]; 246 $IDLE_CB[ &id ] = $_[1];
229} 247}
230
231our $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 248
240=item $pinger->interval ($seconds) 249=item $pinger->interval ($seconds)
241 250
242Configures the minimum interval between packet sends for this pinger - the 251Configures the minimum interval between packet sends for this pinger - the
243pinger will not send packets faster than this rate (or actually 1 / rate), 252pinger will not send packets faster than this rate (or actually 1 / rate),

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines