/usr/local/CPAN/Stem/Stem/Event/Signal.pm
package Stem::Event::Signal ;
use Stem::Event::Queue ;
use strict ;
use warnings ;
use base 'Exporter' ;
our @EXPORT = qw( process_signal_queue ) ;
# this generic signal event code needs the safe signals of perl 5.8+
use 5.008 ;
my %signal2event ;
my @signal_queue ;
my %cached_handlers ;
# this sub will cache the handler closures so we can reuse them.
sub _build {
my( $self ) = @_ ;
my $signal = $self->{'signal'} ;
$self->{'method'} ||= "sig_\L${signal}_handler" ;
# create the signal event handler and cache it.
# we cache them so we can reuse these closures and never leak
$SIG{ $signal } = $cached_handlers{$signal} ||=
sub {
mark_not_empty() ;
#print "HIT $signal\n";
push @signal_queue, $signal
} ;
# track the event object for this signal
$signal2event{$signal} = $self ;
#print "$signal = $SIG{ $signal }\n" ;
return ;
}
sub _cancel {
my( $self ) = @_ ;
$SIG{ $self->{'signal'} } = 'DEFAULT' ;
return ;
}
sub process_signal_queue {
my $sig_count = @signal_queue ;
#print "PROCESS SIGNAL Q $sig_count\n" ;
# return if we have no pending signals
return $sig_count unless $sig_count ;
while( my $signal = shift @signal_queue ) {
my $event = $signal2event{ $signal } ;
next unless $event ;
next unless $event->{'active'} ;
$event->trigger() ;
}
return $sig_count ;
}
1 ;