You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.2 KiB
50 lines
1.2 KiB
package Thread::Signal;
|
|
use Thread qw(async);
|
|
|
|
=head1 NAME
|
|
|
|
Thread::Signal - Start a thread which runs signal handlers reliably
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
use Thread::Signal;
|
|
|
|
$SIG{HUP} = \&some_handler;
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
The C<Thread::Signal> module starts up a special signal handler thread.
|
|
All signals to the process are delivered to it and it runs the
|
|
associated C<$SIG{FOO}> handlers for them. Without this module,
|
|
signals arriving at inopportune moments (such as when perl's internals
|
|
are in the middle of updating critical structures) cause the perl
|
|
code of the handler to be run unsafely which can cause memory corruption
|
|
or worse.
|
|
|
|
=head1 BUGS
|
|
|
|
This module changes the semantics of signal handling slightly in that
|
|
the signal handler is run separately from the main thread (and in
|
|
parallel with it). This means that tricks such as calling C<die> from
|
|
a signal handler behave differently (and, in particular, can't be
|
|
used to exit directly from a system call).
|
|
|
|
=cut
|
|
|
|
if (!init_thread_signals()) {
|
|
require Carp;
|
|
Carp::croak("init_thread_signals failed: $!");
|
|
}
|
|
|
|
async {
|
|
my $sig;
|
|
while ($sig = await_signal()) {
|
|
&$sig();
|
|
}
|
|
};
|
|
|
|
END {
|
|
kill_sighandler_thread();
|
|
}
|
|
|
|
1;
|