Fix sigsuspend to use rt_sigsuspend on all platforms.

Change-Id: I981c1a66d35480d4457a0a08a1b042dac94daa5b
This commit is contained in:
Elliott Hughes
2013-10-15 18:01:56 -07:00
parent c100a10069
commit 1f5af926fa
15 changed files with 69 additions and 82 deletions

View File

@@ -153,3 +153,36 @@ TEST(signal, sigwait) {
ASSERT_EQ(0, errno);
ASSERT_EQ(SIGALRM, received_signal);
}
static int gSigSuspendTestHelperCallCount = 0;
static void SigSuspendTestHelper(int) {
++gSigSuspendTestHelperCallCount;
}
TEST(signal, sigsuspend) {
ScopedSignalHandler ssh(SIGALRM, SigSuspendTestHelper);
// Block SIGALRM.
sigset_t just_SIGALRM;
sigemptyset(&just_SIGALRM);
sigaddset(&just_SIGALRM, SIGALRM);
sigset_t original_set;
ASSERT_EQ(0, sigprocmask(SIG_BLOCK, &just_SIGALRM, &original_set));
// Raise SIGALRM and check our signal handler wasn't called.
raise(SIGALRM);
ASSERT_EQ(0, gSigSuspendTestHelperCallCount);
// Use sigsuspend to block everything except SIGALRM...
sigset_t not_SIGALRM;
sigfillset(&not_SIGALRM);
sigdelset(&not_SIGALRM, SIGALRM);
ASSERT_EQ(-1, sigsuspend(&not_SIGALRM));
ASSERT_EQ(EINTR, errno);
// ...and check that we now receive our pending SIGALRM.
ASSERT_EQ(1, gSigSuspendTestHelperCallCount);
// Restore the original set.
assert(0 == sigprocmask(SIG_SETMASK, &original_set, NULL));
}