File Coverage

blib/lib/IO/Event/AnyEvent.pm
Criterion Covered Total %
statement 87 124 70.1
branch 11 24 45.8
condition 4 6 66.6
subroutine 22 33 66.6
pod 0 10 0.0
total 124 197 62.9


line stmt bran cond sub pod time code
1              
2             #
3             # Use AnyEvent for the IO::Event's event handler
4             #
5              
6             my $debug = 0;
7             my $debug_timer;
8             my $lost_event_timer;
9              
10             {
11             package IO::Event::AnyEvent;
12              
13             our $lost_event_hack = 2;
14              
15             require IO::Event;
16 20     20   136 use strict;
  20         39  
  20         852  
17 20     20   137 use warnings;
  20         58  
  20         751  
18 20     20   119 use Scalar::Util qw(refaddr);
  20         39  
  20         30416  
19              
20             our @ISA = qw(IO::Event::Common);
21              
22             my %selves;
23             my $condvar;
24              
25             sub import
26             {
27 0     0   0 require IO::Event;
28 0         0 IO::Event->import('AnyEvent');
29             }
30              
31             sub new
32             {
33 195     195 0 3310 my ($pkg, @stuff) = @_;
34 195         7001 my $self = $pkg->SUPER::new(@stuff);
35 195         2301 return $self;
36             }
37              
38             sub loop
39             {
40 4     4 0 162 $condvar = AnyEvent->condvar;
41              
42 4 50       1425 if ($debug) {
43             $debug_timer = AnyEvent->timer(after => 0.1, interval => 0.1, cb => sub {
44 0     0   0 print STDERR "WATCHING:\n";
45 0         0 for my $ie (values %selves) {
46 0         0 print STDERR "\t";
47 0 0       0 print STDERR "R" if ${*$ie}{ie_anyevent_read};
  0         0  
48 0 0       0 print STDERR "W" if ${*$ie}{ie_anyevent_read};
  0         0  
49 0         0 print STDERR " ${*$ie}{ie_desc}\n";
  0         0  
50             }
51 0         0 });
52             }
53 4 50       29 if ($lost_event_hack) {
54             $lost_event_timer = AnyEvent->timer(
55             after => $lost_event_hack,
56             interval => $lost_event_hack,
57             cb => sub {
58 12     12   1074773 for my $ie (values %selves) {
59 42 50       247 next unless ${*$ie}{ie_anyevent_read};
  42         345  
60 42 100       67 next if ${*$ie}{ie_listener}; # no spurious connections!
  42         176  
61             # print STDERR "DISPATCHING FOR READ for ${*$ie}{ie_desc}\n"; # LOST EVENTS
62 33         215 $ie->ie_dispatch_read();
63             }
64             },
65 4         104 );
66             }
67 4         220 $condvar->recv;
68             }
69              
70             sub timer
71             {
72 3     3 0 31 IO::Event::AnyEvent::Wrapper->new('Timer', @_);
73             }
74              
75             sub unloop
76             {
77 0 0   0 0 0 $condvar->send(@_) if $condvar;
78             }
79              
80             sub unloop_all
81             {
82 2 50   2 0 158 $condvar->send(@_) if $condvar;
83             }
84              
85             sub idle
86             {
87 1     1 0 8 IO::Event::AnyEvent::Wrapper->new('Idle', @_);
88             }
89              
90             sub set_write_polling
91             {
92 0     0 0 0 my ($self, $new) = @_;
93 0         0 my $event = ${*$self}{ie_write};
  0         0  
94 0 0       0 if ($new) {
95 0         0 ${*$self}{ie_anyevent_write} = AnyEvent->io(
  0         0  
96             fh => ${*$self}{ie_fh},
97             cb => sub {
98             # print STDERR ""; # LOST EVENTS
99 0     0   0 $self->ie_dispatch_write();
100             },
101 0         0 poll => 'w',
102             );
103             } else {
104 0         0 delete ${*$self}{ie_anyevent_write};
  0         0  
105             }
106             }
107              
108             sub set_read_polling
109             {
110 379     379 0 2546 my ($self, $new) = @_;
111 379         1077 my $event = ${*$self}{ie_event};
  379         1358  
112 379 100       2729 if ($new) {
113 195         54336 ${*$self}{ie_anyevent_read} = AnyEvent->io(
  195         170927  
114             fh => ${*$self}{ie_fh},
115             cb => sub {
116             # print STDERR ""; # LOST EVENTS
117 197     197   1191805 $self->ie_dispatch_read();
118             },
119 195         514 poll => 'r',
120             );
121             } else {
122 184         452 delete ${*$self}{ie_anyevent_read};
  184         3434  
123             }
124             }
125              
126             sub ie_register
127             {
128 195     195 0 678 my ($self) = @_;
129 195         25989 my ($fh, $fileno) = $self->SUPER::ie_register();
130 195         520 $self->set_read_polling(${*$self}{ie_want_read_events} = ! ${*$self}{ie_readclosed});
  195         5113  
  195         624  
131 195         554 ${*$self}{ie_want_write_events} = '';
  195         1798  
132 195         3187 $selves{refaddr($self)} = $self;
133 195 50       2823 print STDERR "registered ${*$self}{ie_fileno}:${*$self}{ie_desc} $self $fh ${*$self}{ie_event}\n"
  0         0  
  0         0  
  0         0  
134             if $debug;
135             }
136              
137             sub ie_deregister
138             {
139 165     165 0 319002 my ($self) = @_;
140 165         3001 $self->SUPER::ie_deregister();
141 165         247 delete ${*$self}{ie_anyevent_write};
  165         1777  
142 165         422 delete ${*$self}{ie_anyevent_read};
  165         568  
143 165         2263 delete $selves{refaddr($self)};
144             }
145              
146             }{package IO::Event::AnyEvent::Wrapper;
147              
148 20     20   167 use strict;
  20         40  
  20         680  
149 20     20   102 use warnings;
  20         41  
  20         756  
150 20     20   130 use Scalar::Util qw(refaddr);
  20         74  
  20         2346  
151              
152             my %handlers;
153              
154             sub new
155             {
156 4     4   52 my ($pkg, $type, $req_pkg, %param) = @_;
157 4         15 my ($cpkg, $file, $line, $sub) = caller;
158 4         8 my $desc;
159             {
160 20     20   106 no warnings;
  20         37  
  20         10520  
  4         8  
161 4   66     39 $desc = $param{desc} || "\u$type\E event defined in ${cpkg}::${sub} at $file:$line";
162             }
163 4 100       16 if (ref($param{cb}) eq 'ARRAY') {
164 2         3 my ($obj, $meth) = @{$param{cb}};
  2         4  
165             $param{cb} = sub {
166 104     104   8881709 $obj->$meth();
167 2         24 };
168             }
169 4   66     51 $param{after} ||= $param{interval};
170 4         36 my $self = bless {
171             type => lc($type),
172             desc => $desc,
173             param => \%param,
174             }, $pkg;
175              
176 4         15 $self->start();
177              
178 4         165 return $self;
179             }
180              
181             sub start
182             {
183 29     29   61 my ($self) = @_;
184 29         123 $handlers{refaddr($self)} = $self;
185 29         90 my $type = $self->{type};
186 29         57 $self->{handler} = AnyEvent->$type(%{$self->{param}});
  29         411  
187             }
188              
189             sub again
190             {
191 25     25   362 my ($self) = @_;
192 25         93 $self->start;
193             }
194              
195             sub now
196             {
197 0     0   0 my ($self) = @_;
198 0         0 $self->{param}{cb}->($self);
199             }
200              
201             sub stop
202             {
203 25     25   489 my ($self) = @_;
204 25         390 delete $self->{handler};
205             }
206              
207             sub cancel
208             {
209 0     0     my ($self) = @_;
210 0           $self->stop();
211 0           delete $handlers{refaddr($self)};
212             }
213              
214             sub is_cancelled
215             {
216 0     0     my ($self) = @_;
217 0           return ! $handlers{refaddr($self)};
218             }
219              
220             sub is_active
221             {
222 0     0     my ($self) = @_;
223 0           return ! ! $self->{handler};
224             }
225              
226             sub is_running
227             {
228 0     0     return;
229             }
230              
231             sub pending
232             {
233 0     0     return;
234             }
235              
236              
237             }#end package
238             1;