package POE::Event::Signal; use POE::Kernel; use POE::Event; use base 'POE::Event'; use strict; use warnings; our $flag; sub dispatch { my $self = shift; my $kernel = $self->[POE::Event::KERNEL]; my $time = $self->[POE::Event::TIME]; my $sender = $self->[POE::Event::FROM]; my $session = $self->[POE::Event::TO]; my $signal = $self->[POE::Event::NAME]; # I think my $args = $self->[POE::Event::ARGS]; # Reset the sig_handled flag # $flag = 0; # not thread safe local $flag = 0; # This algorithm is copied pretty much verbatim from POE's Kernel.pm, it's very elegant anyways. my @touched_sessions = ($session); my $touched_index = 0; while ($touched_index < @touched_sessions) { my $next_target = $touched_sessions[$touched_index]; push @touched_sessions, $kernel->get_children($next_target); $touched_index++; } if (my $signal_watchers = $kernel->[POE::Kernel::KR_SIGNALS()]->{$signal}) { while( $touched_index-- ) { my $target_session = $touched_sessions[$touched_index]; if (exists( $signal_watchers->{$target_session} )) { POE::Event->new( $kernel, $time, $sender, $target_session, $signal_watchers->{$target_session}->[1], $args, )->dispatch(); } } } foreach my $dead_session (@touched_sessions) { # Sessions go boom } # Flag not set? KILL ALL HUMANS. # TODO } sub HANDLED { $flag = 1; } 1;