The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl
use strict;
use warnings FATAL => 'all';
use if $ENV{PERL_PSELECT_TEST_DISABLE}, # for shipit on MacOSX
    'Test::More' => skip_all => 'skip for releasing';

use Errno ();
use POSIX ();
use Time::HiRes ();
use POSIX::pselect;

use Test::More tests => 5;

sub doit {
    my $got_usr1 = 0;
    # setup sighandler and block SIGUSR1
    local $SIG{USR1} = sub { $got_usr1 = 1 };
    POSIX::sigprocmask(POSIX::SIG_BLOCK(),
        POSIX::SigSet->new(POSIX::SIGUSR1()));
    # send SIGUSR1 to myself
    my $pid = fork || do {
        kill POSIX::SIGUSR1(), getppid
            or die "Cannot send SIGUSR1 to the parent: $!";
        exit(0);
    };
    while (wait() != $pid) {}
    ok ! $got_usr1, 'did not get SIGUSR1';
    # perform a pselect
    my $now = Time::HiRes::time();
    my $ret = pselect(undef, undef, undef, 1, do {
        my $ss = POSIX::SigSet->new;
        $ss->fillset;
        $ss->delset(POSIX::SIGUSR1());
        $ss;
    });
    cmp_ok $ret, '<=', 0;
    is $! + 0, Errno::EINTR(), '$! == EINTR';
    ok $got_usr1, 'got SIGUSR1';
    my $elapsed = Time::HiRes::time - $now;
    cmp_ok $elapsed, '<', 0.5;
}

doit();

done_testing;