File Coverage

blib/lib/Signal/Pending.pm
Criterion Covered Total %
statement 32 50 64.0
branch 0 4 0.0
condition n/a
subroutine 10 18 55.5
pod n/a
total 42 72 58.3


line stmt bran cond sub pod time code
1             package Signal::Pending;
2             $Signal::Pending::VERSION = '0.008';
3 1     1   582 use strict;
  1         2  
  1         36  
4 1     1   5 use warnings FATAL => 'all';
  1         2  
  1         42  
5              
6 1     1   5 use Config;
  1         2  
  1         42  
7 1     1   5 use POSIX qw/sigpending/;
  1         2  
  1         7  
8 1     1   76 use IPC::Signal qw/sig_num sig_name/;
  1         1  
  1         51  
9 1     1   7 use Carp qw/croak/;
  1         2  
  1         531  
10              
11             my $sig_max = $Config{sig_count} - 1;
12              
13             tie %Signal::Pending, __PACKAGE__;
14              
15             sub TIEHASH {
16 1     1   2 my $class = shift;
17 1         3 my $self = { iterator => 1, };
18 1         5 return bless $self, $class;
19             }
20              
21             sub _get_status {
22 1     1   7 my ($self, $num) = @_;
23 1         5 my $mask = POSIX::SigSet->new;
24 1         6 sigpending($mask);
25 1         7 return $mask->ismember($num);
26             }
27              
28             sub FETCH {
29 1     1   7 my ($self, $key) = @_;
30 1         5 return $self->_get_status(sig_num($key));
31             }
32              
33             sub STORE {
34 0     0   0 my ($self, $key, $value) = @_;
35 0         0 croak 'Can\'t assign to %Signal::Pending';
36             }
37              
38             sub DELETE {
39 0     0   0 my ($self, $key) = @_;
40 0         0 croak 'Can\'t delete from %Signal::Pending';
41             }
42              
43             sub CLEAR {
44 0     0   0 my ($self) = @_;
45 0         0 croak 'Can\'t clear %Signal::Pending';
46             }
47              
48             sub EXISTS {
49 0     0   0 my ($self, $key) = @_;
50 0         0 return defined sig_num($key);
51             }
52              
53             sub FIRSTKEY {
54 0     0   0 my $self = shift;
55 0         0 $self->{iterator} = 1;
56 0         0 return $self->NEXTKEY;
57             }
58              
59             sub NEXTKEY {
60 0     0   0 my $self = shift;
61 0 0       0 if ($self->{iterator} <= $sig_max) {
62 0         0 my $num = $self->{iterator}++;
63 0 0       0 return wantarray ? (sig_name($num) => $self->_get_status($num)) : sig_name($num);
64             }
65             else {
66 0         0 return;
67             }
68             }
69              
70             sub SCALAR {
71 3     3   1786 my $self = shift;
72 3         14 my $mask = POSIX::SigSet->new;
73 3         20 sigpending($mask);
74 3         15 return scalar grep { $mask->ismember($_) } 1 .. $sig_max;
  192         355  
75             }
76              
77 0     0     sub UNTIE {
78             }
79              
80 0     0     sub DESTROY {
81             }
82              
83             1; # End of Signal::Mask
84              
85             # ABSTRACT: Signal pending status made easy
86              
87             __END__