Re: is Event the best event loop module?

[email protected] (Danny Faught)
Newsgroups perl.loop
Organization Tejas Software Consulting
Message-ID <[email protected]>
Uri Guttman wrote:
> are you doing your own signal handling in perl? if so, you should switch
> to event.pm. perl's signal handling is well known to be unsafe.

I'm putting together some code samples to explain how event loops work,
but for any serious even-driven work, I'd use one of the available
libraries.  FWIW, the slides will be on my web site some time tomorrow.

> the way to handle that properly is to check for any pending signals
> before you enter the select call (while blocking any from coming in) and
> then checking after the select returns. this can only be done correctly
> in C.

There's no way in perl or C that I know of to atomically set a signal
mask and enter a select call.  I've seen rumors of a pselect library
call available on some systems that can do this.  A sigprocmask call
followed by a select call has a race condition, because a signal can
come in between the two statements.  How do you solve this in C?  I've
seen a klugey solution that requires a setjmp/longjmp.

If you don't have to watch for I/O, and you're only looking for signals,
then a sigsuspend is a nice solution.  Here's a code fragment that does
this below, using the POSIX module.  I love using the POSIX module to do
things in perl that people think can only be done in C.  It might should
be doing a sigaction rather that using the SIG hash, now that I've
re-read a few more of the FAQs.

This solution would work with I/O if you can get a SIGIO when there's
I/O to check, but it looks like that's only available for certain types
of I/O.

----snip
#!/usr/bin/perl -w

use strict;
use POSIX qw(SIGINT SIGALRM SIG_SETMASK sigprocmask sigsuspend);

my $empty_mask = new POSIX::SigSet;
my $block_mask = new POSIX::SigSet (SIGINT, SIGALRM);
sigprocmask(SIG_SETMASK, $block_mask);

$SIG{CHLD} = \&sigchld_handler;
$SIG{ALRM} = \&sigalrm_handler;

# additional setup here
while (1) {
    sigsuspend($empty_mask);
    # signals are blocked again
    # process events now
}
----snip

--
Danny Faught
Tejas Software Consulting
http://www.tejasconsulting.com
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.