File Coverage

blib/lib/Proc/JobQueue/EventQueue.pm
Criterion Covered Total %
statement 18 49 36.7
branch 0 12 0.0
condition 0 9 0.0
subroutine 6 11 54.5
pod 3 3 100.0
total 27 84 32.1


line stmt bran cond sub pod time code
1              
2             package Proc::JobQueue::EventQueue;
3              
4 1     1   38622 use strict;
  1         3  
  1         42  
5 1     1   5 use warnings;
  1         1  
  1         43  
6 1     1   6 use Carp qw(confess);
  1         2  
  1         63  
7             require Proc::JobQueue;
8 1     1   5 use Time::HiRes qw(time);
  1         2  
  1         9  
9 1     1   152 use Object::Dependency;
  1         2  
  1         12  
10             require POSIX;
11              
12             our @ISA = qw(Proc::JobQueue);
13              
14             our $timer_interval = 6;
15             my $debug = 0;
16              
17             sub new
18             {
19 0     0 1   my ($pkg, %params) = @_;
20              
21 0   0       $params{dependency_graph} ||= Object::Dependency->new();
22              
23 0           my $queue = $pkg->SUPER::new(
24             unloop => undef,
25             startmore_in_progress => 0,
26             on_failure => \&on_failure,
27             %params
28             );
29              
30 0           my $last_dump = time;
31              
32             my $timer = IO::Event->timer(
33             interval => $params{timer_interval} || $timer_interval,
34             cb => sub {
35 0 0   0     print STDERR "beep!\n" if $debug;
36 0           eval {
37 0           $queue->startmore;
38             };
39 0 0         if ($@) {
40 0           print STDERR "DIE DIE DIE DIE DIE (DT1): $@";
41             # exit 1; hangs
42 0           POSIX::_exit(1);
43             };
44 0 0 0       if ($debug && time > $last_dump + $timer_interval) {
45 0           $params{dependency_graph}->dump_graph();
46 0           $last_dump = time;
47             }
48 1     1   318 use POSIX ":sys_wait_h";
  1         2  
  1         9  
49 0           my $k;
50 0           do { $k = waitpid(-1, WNOHANG) } while $k > 0;
  0            
51             },
52 0   0       );
53              
54             $Event::DIED = sub {
55 0     0     Event::verbose_exception_handler(@_);
56 0           $queue->unloop();
57 0           IO::Event::unloop_all();
58 0           };
59              
60 0           return $queue;
61             }
62              
63             sub unloop
64             {
65 0     0 1   my ($queue) = @_;
66 0 0         if ($queue->{unloop}) {
67 0           $queue->unloop($queue->alldone);
68             } else {
69 0           IO::Event::unloop_all();
70             }
71             }
72              
73             sub on_failure
74             {
75 0     0 1   my ($queue, $job, @exit_code) = @_;
76 0 0         if ($job->{on_failure}) {
    0          
77 0           $job->{on_failure}->(@exit_code);
78             } elsif ($job->{errors}) {
79 0           $job->{errors}->("FAILED: $job->{desc}", @exit_code);
80             } else {
81 0           print STDERR "JOB $job->{desc} FAILED\nexit @exit_code\n";
82             }
83             }
84              
85              
86             1;
87              
88             __END__