Module Name: src
Committed By: mgorny
Date: Thu Feb 13 15:25:58 UTC 2020
Modified Files:
src/tests/lib/libc/sys: t_ptrace_wait.c
Log Message:
Extend concurrent signal tests to pass signal back to the thread
To generate a diff of this commit:
cvs rdiff -u -r1.156 -r1.157 src/tests/lib/libc/sys/t_ptrace_wait.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/tests/lib/libc/sys/t_ptrace_wait.c
diff -u src/tests/lib/libc/sys/t_ptrace_wait.c:1.156 src/tests/lib/libc/sys/t_ptrace_wait.c:1.157
--- src/tests/lib/libc/sys/t_ptrace_wait.c:1.156 Thu Feb 13 15:25:29 2020
+++ src/tests/lib/libc/sys/t_ptrace_wait.c Thu Feb 13 15:25:58 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: t_ptrace_wait.c,v 1.156 2020/02/13 15:25:29 mgorny Exp $ */
+/* $NetBSD: t_ptrace_wait.c,v 1.157 2020/02/13 15:25:58 mgorny Exp $ */
/*-
* Copyright (c) 2016, 2017, 2018, 2019 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_ptrace_wait.c,v 1.156 2020/02/13 15:25:29 mgorny Exp $");
+__RCSID("$NetBSD: t_ptrace_wait.c,v 1.157 2020/02/13 15:25:58 mgorny Exp $");
#define __LEGACY_PT_LWPINFO
@@ -8635,8 +8635,23 @@ const int thread_concurrent_signals_list
SIGUSR2
};
+enum thread_concurrent_signal_handling {
+ /* the signal is discarded by debugger */
+ TCSH_DISCARD,
+ /* the handler is set to SIG_IGN */
+ TCSH_SIG_IGN,
+ /* an actual handler is used */
+ TCSH_HANDLER
+};
+
static pthread_barrier_t thread_concurrent_barrier;
+static void
+thread_concurrent_sig_handler(int sig)
+{
+ /* TODO: verify that handler is actually called */
+}
+
static void *
thread_concurrent_signals_thread(void *arg)
{
@@ -8650,7 +8665,8 @@ thread_concurrent_signals_thread(void *a
}
static void
-thread_concurrent_test(int signal_threads)
+thread_concurrent_test(enum thread_concurrent_signal_handling signal_handle,
+ int signal_threads)
{
const int exitval = 5;
const int sigval = SIGSTOP;
@@ -8660,6 +8676,11 @@ thread_concurrent_test(int signal_thread
= {{0, 0}};
int i;
+ if (signal_handle == TCSH_SIG_IGN)
+ atf_tc_expect_fail("PR kern/54960");
+ else if (signal_handle == TCSH_HANDLER)
+ atf_tc_skip("PR kern/54960");
+
/* Protect against out-of-bounds array access. */
ATF_REQUIRE(signal_threads <= THREAD_CONCURRENT_SIGNALS_NUM);
@@ -8674,6 +8695,25 @@ thread_concurrent_test(int signal_thread
DPRINTF("Before raising %s from child\n", strsignal(sigval));
FORKEE_ASSERT(raise(sigval) == 0);
+ if (signal_handle != TCSH_DISCARD) {
+ struct sigaction sa;
+ unsigned int j;
+
+ memset(&sa, 0, sizeof(sa));
+ if (signal_handle == TCSH_SIG_IGN)
+ sa.sa_handler = SIG_IGN;
+ else
+ sa.sa_handler = thread_concurrent_sig_handler;
+ sigemptyset(&sa.sa_mask);
+
+ for (j = 0;
+ j < __arraycount(thread_concurrent_signals_list);
+ j++)
+ FORKEE_ASSERT(sigaction(
+ thread_concurrent_signals_list[j], &sa, NULL)
+ != -1);
+ }
+
DPRINTF("Before starting threads from the child\n");
FORKEE_ASSERT(pthread_barrier_init(
&thread_concurrent_barrier, NULL,
@@ -8741,7 +8781,9 @@ thread_concurrent_test(int signal_thread
*FIND_EVENT_COUNT(signal_counts, info.psi_lwpid) += 1;
DPRINTF("Before resuming the child process\n");
- SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+ SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1,
+ signal_handle != TCSH_DISCARD ? WSTOPSIG(status) : 0)
+ != -1);
}
for (i = 0; i < signal_threads; i++)
@@ -8756,7 +8798,7 @@ thread_concurrent_test(int signal_thread
validate_status_exited(status, exitval);
}
-#define THREAD_CONCURRENT_TEST(test, sigs, descr) \
+#define THREAD_CONCURRENT_TEST(test, sig_hdl, sigs, descr) \
ATF_TC(test); \
ATF_TC_HEAD(test, tc) \
{ \
@@ -8765,13 +8807,21 @@ ATF_TC_HEAD(test, tc) \
\
ATF_TC_BODY(test, tc) \
{ \
- thread_concurrent_test(sigs); \
+ thread_concurrent_test(sig_hdl, sigs); \
}
-THREAD_CONCURRENT_TEST(thread_concurrent_signals,
- THREAD_CONCURRENT_SIGNALS_NUM,
- "Verify that concurrent signals issued to a single thread are reported "
- "correctly");
+THREAD_CONCURRENT_TEST(thread_concurrent_signals, TCSH_DISCARD,
+ THREAD_CONCURRENT_SIGNALS_NUM,
+ "Verify that concurrent signals issued to a single thread are reported "
+ "correctly");
+THREAD_CONCURRENT_TEST(thread_concurrent_signals_sig_ign, TCSH_SIG_IGN,
+ THREAD_CONCURRENT_SIGNALS_NUM,
+ "Verify that concurrent signals issued to a single thread are reported "
+ "correctly and passed back to SIG_IGN handler");
+THREAD_CONCURRENT_TEST(thread_concurrent_signals_handler, TCSH_HANDLER,
+ THREAD_CONCURRENT_SIGNALS_NUM,
+ "Verify that concurrent signals issued to a single thread are reported "
+ "correctly and passed back to a handler function");
#endif /*defined(TWAIT_HAVE_STATUS)*/
@@ -9363,6 +9413,8 @@ ATF_TP_ADD_TCS(tp)
#if defined(TWAIT_HAVE_STATUS)
ATF_TP_ADD_TC(tp, thread_concurrent_signals);
+ ATF_TP_ADD_TC(tp, thread_concurrent_signals_sig_ign);
+ ATF_TP_ADD_TC(tp, thread_concurrent_signals_handler);
#endif
ATF_TP_ADD_TCS_PTRACE_WAIT_AMD64();