65231038bd4957423ec576401cf99b777c2e29cb
[urisagit/Stem.git] / lib / Stem / Event / Signal.pm
1 package Stem::Event::Signal ;
2
3 use Stem::Event::Queue ;
4
5 use strict ;
6 use warnings ;
7
8 use base 'Exporter' ;
9 our @EXPORT = qw( process_signal_queue ) ;
10
11 # this generic signal event code needs the safe signals of perl 5.8+
12
13 use 5.008 ;
14
15 my %signal2event ;
16
17 my @signal_queue ;
18 my %cached_handlers ;
19
20 # this sub will cache the handler closures so we can reuse them. 
21
22 sub _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 {
35 <<<<<<< HEAD:lib/Stem/Event/Signal.pm
36         Stem::Event::Queue::queue_has_event() ;
37                         
38 #print "HIT $signal\n";
39 =======
40 print "HIT $signal\n";
41                         Stem::Event::Queue::mark_not_empty() ;
42 >>>>>>> master:lib/Stem/Event/Signal.pm
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" ;
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
57         return ;
58 }
59
60 sub _cancel {
61
62         my( $self ) = @_ ;
63
64         $SIG{ $self->{'signal'} } = 'DEFAULT' ;
65
66         return ;
67 }
68
69 sub 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
92 1 ;