File Coverage

blib/lib/Signal/Pending.pm
Criterion Covered Total %
statement 35 51 68.6
branch 0 4 0.0
condition n/a
subroutine 11 19 57.8
pod n/a
total 46 74 62.1


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