aboutsummaryrefslogtreecommitdiff
path: root/tests/signal_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/signal_test.cpp')
-rw-r--r--tests/signal_test.cpp99
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) {