File Coverage

lib/Rex/Fork/Manager.pm
Criterion Covered Total %
statement 45 54 83.3
branch 6 10 60.0
condition 1 3 33.3
subroutine 9 10 90.0
pod 0 6 0.0
total 61 83 73.4


line stmt bran cond sub pod time code
1             #
2             # (c) Jan Gehring
3             #
4              
5             package Rex::Fork::Manager;
6              
7 56     56   862 use v5.12.5;
  56         229  
8 56     56   381 use warnings;
  56         172  
  56         2589  
9              
10             our $VERSION = '1.14.2.2'; # TRIAL VERSION
11              
12 56     56   686 use Rex::Fork::Task;
  56         195  
  56         701  
13 56     56   2011 use Time::HiRes qw(sleep);
  56         121  
  56         483  
14              
15             sub new {
16 138     138 0 839 my $that = shift;
17 138   33     1369 my $proto = ref($that) || $that;
18 138         844 my $self = {@_};
19              
20 138         429 bless( $self, $proto );
21              
22 138         727 $self->{'forks'} = [];
23 138         507 $self->{'running'} = 0;
24              
25 138         610 return $self;
26             }
27              
28             sub add {
29 135     135 0 530 my ( $self, $coderef ) = @_;
30              
31 135         1996 my $f = Rex::Fork::Task->new( coderef => $coderef );
32              
33 135         370 push( @{ $self->{'forks'} }, $f );
  135         505  
34              
35 135         785 $f->start;
36 106         1419 ++$self->{'running'};
37              
38 106 50       2651 if ( $self->{'running'} >= $self->{'max'} ) {
39 106         4009 $self->wait_for_one;
40             }
41             }
42              
43             sub start {
44 0     0 0 0 my ($self) = @_;
45              
46 0         0 my @threads = @{ $self->{'forks'} };
  0         0  
47 0         0 for ( my $i = 0 ; $i < scalar(@threads) ; ++$i ) {
48 0         0 $threads[$i]->start;
49 0         0 ++$self->{'running'};
50 0 0       0 if ( $self->{'running'} >= $self->{'max'} ) {
51 0         0 $self->wait_for_one;
52             }
53             }
54              
55 0         0 $self->wait_for_all;
56             }
57              
58             sub wait_for_one {
59 106     106 0 2146 my ($self) = @_;
60 106         1574 $self->wait_for;
61             }
62              
63             sub wait_for_all {
64 107     107 0 1004 my ($self) = @_;
65 107         1113 $self->wait_for(1);
66             }
67              
68             sub wait_for {
69 213     213 0 1228 my ( $self, $all ) = @_;
70             do {
71 6217         25182 FORK: for ( my $i = 0 ; $i < scalar( @{ $self->{'forks'} } ) ; $i++ ) {
  12327         152349  
72 6216         21349 my $thr = $self->{'forks'}->[$i];
73 6216 100       30544 unless ( $thr->{'running'} ) {
74 106         959 next FORK;
75             }
76              
77 6110         14753 my $kid;
78 6110         65242 $kid = $thr->wait;
79              
80 6110 100       26567 if ( $kid == -1 ) {
81 106         957 $thr = undef;
82 106         3515 $thr->{running} = 0;
83 106         641 --$self->{'running'};
84              
85 106 50       5641 return 1 unless $all;
86             }
87 6004         61666 sleep Rex::Config->get_waitpid_blocking_sleep_time;
88             }
89 213         1102 } until $self->{'running'} == 0;
90             }
91              
92             1;