File Coverage

blib/lib/Inferno/RegMgr.pm
Criterion Covered Total %
statement 16 18 88.8
branch n/a
condition n/a
subroutine 6 6 100.0
pod n/a
total 22 24 91.6


line stmt bran cond sub pod time code
1             package Inferno::RegMgr;
2              
3 1     1   20336 use warnings;
  1         2  
  1         29  
4 1     1   5 use strict;
  1         2  
  1         33  
5 1     1   4 use Carp;
  1         5  
  1         76  
6              
7             # update POD & Changes & README
8 1     1   796 use version; our $VERSION = qv('0.1.7');
  1         1945  
  1         4  
9              
10             # update DEPENDENCIES in POD & Makefile.PL & README
11 1     1   67 use Scalar::Util qw( weaken refaddr );
  1         2  
  1         112  
12 1     1   416 use IO::Stream; # to import consts like CONNECTED
  0            
  0            
13             use EV;
14              
15              
16             use constant RETRY => 1; # sec, delay between re-connections
17              
18              
19             sub new {
20             my ($class, $reg) = @_;
21             my $self = {
22             registry => $reg,
23             is_connected => 0,
24             io => undef,
25             t => undef,
26             tasks => {},
27             };
28             bless $self, $class;
29             $self->_open_event();
30             return $self;
31             }
32              
33             sub _open_event {
34             my ($self) = @_;
35             weaken( my $this = $self );
36             $self->{io} = $self->{registry}->open_event({
37             cb => sub { $this->_cb_event(@_) },
38             });
39             weaken( $self->{io} );
40             return;
41             }
42              
43             sub _cb_event {
44             my ($self, $e, $err) = @_;
45             if ($e & CONNECTED) {
46             $self->{is_connected} = 1;
47             for my $task (values %{ $self->{tasks} }) {
48             $task->START();
49             }
50             }
51             if ($e & IN) {
52             for my $task (values %{ $self->{tasks} }) {
53             $task->REFRESH();
54             }
55             }
56             if ($e & EOF) {
57             $self->{is_connected} = 0;
58             for my $task (values %{ $self->{tasks} }) {
59             $task && $task->STOP();
60             }
61             }
62             if ($e & EOF || $err) {
63             weaken( my $this = $self );
64             $self->{t} = EV::timer RETRY, 0, sub { $this->_open_event() };
65             }
66             return;
67             }
68              
69             sub attach {
70             my ($self, $task) = @_;
71             croak 'already attached' if defined $task->{manager};
72             weaken( $task->{manager} = $self );
73             $self->{tasks}{ refaddr($task) } = $task;
74             if ($self->{is_connected}) {
75             $task->START();
76             }
77             return;
78             }
79              
80             sub detach {
81             my ($self, $task) = @_;
82             croak 'not attached to this manager' if $task->{manager} != $self;
83             if ($self->{is_connected}) {
84             $task->STOP();
85             }
86             undef $task->{manager};
87             delete $self->{tasks}{ refaddr($task) };
88             return;
89             }
90              
91             sub DESTROY {
92             my ($self) = @_;
93             for my $task (values %{ $self->{tasks} }) {
94             # $task can be already freed if DESTROY called while global destruction
95             $task && $self->detach($task);
96             }
97             if (defined $self->{io}) {
98             $self->{io}->close();
99             }
100             $self->{t} = undef;
101             return;
102             }
103              
104              
105             1; # Magic true value required at end of module
106             __END__