diff options
Diffstat (limited to 'tests/signal_test.cpp')
-rw-r--r-- | tests/signal_test.cpp | 99 |
1 files changed, 53 insertions, 46 deletions
diff --git a/tests/signal_test.cpp b/tests/signal_test.cpp index ffbb667e0..3c660346d 100644 --- a/tests/signal_test.cpp +++ b/tests/signal_test.cpp @@ -154,6 +154,44 @@ TEST(signal, raise_in_signal_handler) { raise(SIGALRM); } +TEST(signal, sigwait_SIGALRM) { + ScopedSignalHandler ssh(SIGALRM, [](int sig) { ASSERT_EQ(SIGALRM, sig); }); + + sigset_t wait_set; + sigemptyset(&wait_set); + sigaddset(&wait_set, SIGALRM); + + alarm(1); + + int received_signal; + errno = 0; + ASSERT_EQ(0, sigwait(&wait_set, &received_signal)); + ASSERT_EQ(0, errno); + ASSERT_EQ(SIGALRM, received_signal); +} + +TEST(signal, sigwait64_SIGRTMIN) { + ScopedSignalHandler ssh(SIGRTMIN, [](int sig) { ASSERT_EQ(SIGRTMIN, sig); }); + + sigset64_t wait_set; + sigemptyset64(&wait_set); + sigaddset64(&wait_set, SIGRTMIN); + + pid_t tid = gettid(); + std::thread thread([&tid]() { + sleep(1); + tgkill(getpid(), tid, SIGRTMIN); + }); + + int received_signal; + errno = 0; + ASSERT_EQ(0, sigwait64(&wait_set, &received_signal)); + ASSERT_EQ(0, errno); + ASSERT_EQ(SIGRTMIN, received_signal); + + thread.join(); +} + static int g_sigsuspend_signal_handler_call_count = 0; TEST(signal, sigsuspend_sigpending) { @@ -582,7 +620,8 @@ static void SigqueueSignalHandler(int signum, siginfo_t* info, void*) { TEST(signal, sigqueue) { ScopedSignalHandler ssh(SIGALRM, SigqueueSignalHandler, SA_SIGINFO); - sigval_t sigval = {.sival_int = 1}; + sigval_t sigval; + sigval.sival_int = 1; errno = 0; ASSERT_EQ(0, sigqueue(getpid(), SIGALRM, sigval)); ASSERT_EQ(0, errno); @@ -591,7 +630,8 @@ TEST(signal, sigqueue) { TEST(signal, pthread_sigqueue_self) { ScopedSignalHandler ssh(SIGALRM, SigqueueSignalHandler, SA_SIGINFO); - sigval_t sigval = {.sival_int = 1}; + sigval_t sigval; + sigval.sival_int = 1; errno = 0; ASSERT_EQ(0, pthread_sigqueue(pthread_self(), SIGALRM, sigval)); ASSERT_EQ(0, errno); @@ -600,7 +640,8 @@ TEST(signal, pthread_sigqueue_self) { TEST(signal, pthread_sigqueue_other) { ScopedSignalHandler ssh(SIGALRM, SigqueueSignalHandler, SA_SIGINFO); - sigval_t sigval = {.sival_int = 1}; + sigval_t sigval; + sigval.sival_int = 1; sigset_t mask; sigfillset(&mask); @@ -623,44 +664,6 @@ TEST(signal, pthread_sigqueue_other) { ASSERT_EQ(1, g_sigqueue_signal_handler_call_count); } -TEST(signal, sigwait_SIGALRM) { - SignalMaskRestorer smr; - - // Block SIGALRM. - sigset_t just_SIGALRM; - sigemptyset(&just_SIGALRM); - sigaddset(&just_SIGALRM, SIGALRM); - ASSERT_EQ(0, sigprocmask(SIG_BLOCK, &just_SIGALRM, nullptr)); - - // Raise SIGALRM. - sigval_t sigval = {.sival_int = 1}; - ASSERT_EQ(0, sigqueue(getpid(), SIGALRM, sigval)); - - // Get pending SIGALRM. - int sig; - ASSERT_EQ(0, sigwait(&just_SIGALRM, &sig)); - ASSERT_EQ(SIGALRM, sig); -} - -TEST(signal, sigwait64_SIGRTMIN) { - SignalMaskRestorer smr; - - // Block SIGRTMIN. - sigset64_t just_SIGRTMIN; - sigemptyset64(&just_SIGRTMIN); - sigaddset64(&just_SIGRTMIN, SIGRTMIN); - ASSERT_EQ(0, sigprocmask64(SIG_BLOCK, &just_SIGRTMIN, nullptr)); - - // Raise SIGRTMIN. - sigval_t sigval = {.sival_int = 1}; - ASSERT_EQ(0, sigqueue(getpid(), SIGRTMIN, sigval)); - - // Get pending SIGRTMIN. - int sig; - ASSERT_EQ(0, sigwait64(&just_SIGRTMIN, &sig)); - ASSERT_EQ(SIGRTMIN, sig); -} - TEST(signal, sigwaitinfo) { SignalMaskRestorer smr; @@ -671,7 +674,8 @@ TEST(signal, sigwaitinfo) { ASSERT_EQ(0, sigprocmask(SIG_BLOCK, &just_SIGALRM, nullptr)); // Raise SIGALRM. - sigval_t sigval = {.sival_int = 1}; + sigval_t sigval; + sigval.sival_int = 1; ASSERT_EQ(0, sigqueue(getpid(), SIGALRM, sigval)); // Get pending SIGALRM. @@ -693,7 +697,8 @@ TEST(signal, sigwaitinfo64_SIGRTMIN) { ASSERT_EQ(0, sigprocmask64(SIG_BLOCK, &just_SIGRTMIN, nullptr)); // Raise SIGRTMIN. - sigval_t sigval = {.sival_int = 1}; + sigval_t sigval; + sigval.sival_int = 1; ASSERT_EQ(0, sigqueue(getpid(), SIGRTMIN, sigval)); // Get pending SIGRTMIN. @@ -803,13 +808,15 @@ TEST(signal, rt_tgsigqueueinfo) { #endif TEST(signal, sigset_size) { - // The setjmp implementations assume that sigset_t can fit in a - // long. This is true because ARM and x86 have broken rt signal support, - // and AArch64 and x86_64 both have a SIGRTMAX defined as 64. + // The setjmp implementations for ARM, AArch64, x86, and x86_64 assume that sigset_t can fit in a + // long. This is true because ARM and x86 have broken rt signal support, and AArch64 and x86_64 + // both have a SIGRTMAX defined as 64. +#if defined(__arm__) || defined(__aarch64__) || defined(__i386__) || defined(__x86_64__) #if defined(__BIONIC__) static_assert(sizeof(sigset_t) <= sizeof(long), "sigset_t doesn't fit in a long"); #endif static_assert(sizeof(sigset64_t)*8 >= 64, "sigset64_t too small for real-time signals"); +#endif } TEST(signal, sigignore_EINVAL) { |