Implement pthread_sigqueue.
Bug: http://b/112770187
Test: bionic-unit-tests
Change-Id: I03382cd5df2490b2e87265dba9007e2cb1b14cd2
diff --git a/tests/signal_test.cpp b/tests/signal_test.cpp
index cc95ef7..52a097b 100644
--- a/tests/signal_test.cpp
+++ b/tests/signal_test.cpp
@@ -597,6 +597,42 @@
ASSERT_EQ(1, g_sigqueue_signal_handler_call_count);
}
+TEST(signal, pthread_sigqueue_self) {
+ ScopedSignalHandler ssh(SIGALRM, SigqueueSignalHandler, SA_SIGINFO);
+ sigval_t sigval;
+ sigval.sival_int = 1;
+ errno = 0;
+ ASSERT_EQ(0, pthread_sigqueue(pthread_self(), SIGALRM, sigval));
+ ASSERT_EQ(0, errno);
+ ASSERT_EQ(1, g_sigqueue_signal_handler_call_count);
+}
+
+TEST(signal, pthread_sigqueue_other) {
+ ScopedSignalHandler ssh(SIGALRM, SigqueueSignalHandler, SA_SIGINFO);
+ sigval_t sigval;
+ sigval.sival_int = 1;
+
+ sigset_t mask;
+ sigfillset(&mask);
+ pthread_sigmask(SIG_SETMASK, &mask, nullptr);
+ pthread_t thread;
+ int rc = pthread_create(&thread, nullptr,
+ [](void*) -> void* {
+ sigset_t mask;
+ sigemptyset(&mask);
+ sigsuspend(&mask);
+ return nullptr;
+ },
+ nullptr);
+ ASSERT_EQ(0, rc);
+
+ errno = 0;
+ ASSERT_EQ(0, pthread_sigqueue(thread, SIGALRM, sigval));
+ ASSERT_EQ(0, errno);
+ pthread_join(thread, nullptr);
+ ASSERT_EQ(1, g_sigqueue_signal_handler_call_count);
+}
+
TEST(signal, sigwaitinfo) {
SignalMaskRestorer smr;