merging
[urisagit/Stem.git] / lib / Stem / Event / Signal.pm
CommitLineData
4536f655 1package Stem::Event::Signal ;
2
3use Stem::Event::Queue ;
4
5use strict ;
6use warnings ;
7
8use base 'Exporter' ;
9our @EXPORT = qw( process_signal_queue ) ;
10
11# this generic signal event code needs the safe signals of perl 5.8+
12
13use 5.008 ;
14
15my %signal2event ;
16
17my @signal_queue ;
18my %cached_handlers ;
19
20# this sub will cache the handler closures so we can reuse them.
21
22sub _build {
23
24 my( $self ) = @_ ;
25
26 my $signal = $self->{'signal'} ;
27
28 $self->{'method'} ||= "sig_\L${signal}_handler" ;
29
30# create the signal event handler and cache it.
31# we cache them so we can reuse these closures and never leak
32
33 $SIG{ $signal } = $cached_handlers{$signal} ||=
34 sub {
d88e4371 35<<<<<<< HEAD:lib/Stem/Event/Signal.pm
4932dd97 36 Stem::Event::Queue::queue_has_event() ;
37
4536f655 38#print "HIT $signal\n";
d88e4371 39=======
f4d1dc84 40print "HIT $signal\n";
41 Stem::Event::Queue::mark_not_empty() ;
d88e4371 42>>>>>>> master:lib/Stem/Event/Signal.pm
4536f655 43 push @signal_queue, $signal
44 } ;
45
46# track the event object for this signal
47
48 $signal2event{$signal} = $self ;
49
50#print "$signal = $SIG{ $signal }\n" ;
4932dd97 51
52# make sure the event queue is set up so we can handle signals in the
53# event loop
54
55 Stem::Event::Queue::_init_event_queue() ;
56
4536f655 57 return ;
58}
59
60sub _cancel {
61
62 my( $self ) = @_ ;
63
64 $SIG{ $self->{'signal'} } = 'DEFAULT' ;
65
66 return ;
67}
68
69sub process_signal_queue {
70
71 my $sig_count = @signal_queue ;
72
73#print "PROCESS SIGNAL Q $sig_count\n" ;
74
75# return if we have no pending signals
76
77 return $sig_count unless $sig_count ;
78
79 while( my $signal = shift @signal_queue ) {
80
81 my $event = $signal2event{ $signal } ;
82
83 next unless $event ;
84 next unless $event->{'active'} ;
85
86 $event->trigger() ;
87 }
88
89 return $sig_count ;
90}
91
921 ;