Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/tests/lib/libc/sys Include LWP events in concurrent event test



details:   https://anonhg.NetBSD.org/src/rev/34fea2b7ba73
branches:  trunk
changeset: 969262:34fea2b7ba73
user:      mgorny <mgorny%NetBSD.org@localhost>
date:      Thu Feb 13 15:26:45 2020 +0000

description:
Include LWP events in concurrent event test

LWP events will be necessary when breakpoint/watchpoint support is added
to the test.  However, they also benefit us by testing whether TRAP_LWP
events do not break signal reporting.

diffstat:

 tests/lib/libc/sys/t_ptrace_wait.c |  44 +++++++++++++++++++++++++------------
 1 files changed, 29 insertions(+), 15 deletions(-)

diffs (88 lines):

diff -r bf893daeb9c5 -r 34fea2b7ba73 tests/lib/libc/sys/t_ptrace_wait.c
--- a/tests/lib/libc/sys/t_ptrace_wait.c        Thu Feb 13 15:26:18 2020 +0000
+++ b/tests/lib/libc/sys/t_ptrace_wait.c        Thu Feb 13 15:26:45 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: t_ptrace_wait.c,v 1.158 2020/02/13 15:26:18 mgorny Exp $       */
+/*     $NetBSD: t_ptrace_wait.c,v 1.159 2020/02/13 15:26:45 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.158 2020/02/13 15:26:18 mgorny Exp $");
+__RCSID("$NetBSD: t_ptrace_wait.c,v 1.159 2020/02/13 15:26:45 mgorny Exp $");
 
 #define __LEGACY_PT_LWPINFO
 
@@ -8686,6 +8686,7 @@
        int status;
        struct lwp_event_count signal_counts[THREAD_CONCURRENT_SIGNALS_NUM]
            = {{0, 0}};
+       ptrace_event_t event;
        int i;
 
        if (signal_handle == TCSH_SIG_IGN)
@@ -8758,13 +8759,18 @@
 
        validate_status_stopped(status, sigval);
 
+       DPRINTF("Set LWP event mask for the child process\n");
+       memset(&event, 0, sizeof(event));
+       event.pe_set_event |= PTRACE_LWP_CREATE;
+       SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &event, sizeof(event))
+           != -1);
+
        DPRINTF("Before resuming the child process where it left off\n");
        SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
 
        DPRINTF("Before entering signal collection loop\n");
        while (1) {
                ptrace_siginfo_t info;
-               int expected_sig;
 
                DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
                TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0),
@@ -8785,21 +8791,29 @@
                    info.psi_siginfo.si_signo, info.psi_lwpid,
                    WSTOPSIG(status));
 
-               expected_sig = thread_concurrent_signals_list[info.psi_lwpid %
-                   __arraycount(thread_concurrent_signals_list)];
-               ATF_CHECK_EQ_MSG(info.psi_siginfo.si_signo, expected_sig,
-                   "lwp=%d, expected %d, got %d", info.psi_lwpid,
-                   expected_sig, info.psi_siginfo.si_signo);
-               ATF_CHECK_EQ_MSG(WSTOPSIG(status), expected_sig,
-                   "lwp=%d, expected %d, got %d", info.psi_lwpid,
-                   expected_sig, WSTOPSIG(status));
-
-               *FIND_EVENT_COUNT(signal_counts, info.psi_lwpid) += 1;
+               ATF_CHECK_EQ_MSG(info.psi_siginfo.si_signo, WSTOPSIG(status),
+                   "lwp=%d, WSTOPSIG=%d, psi_siginfo=%d", info.psi_lwpid,
+                   WSTOPSIG(status), info.psi_siginfo.si_signo);
+
+               if (WSTOPSIG(status) != SIGTRAP) {
+                       int expected_sig =
+                           thread_concurrent_signals_list[info.psi_lwpid %
+                           __arraycount(thread_concurrent_signals_list)];
+                       ATF_CHECK_EQ_MSG(WSTOPSIG(status), expected_sig,
+                               "lwp=%d, expected %d, got %d", info.psi_lwpid,
+                               expected_sig, WSTOPSIG(status));
+
+                       *FIND_EVENT_COUNT(signal_counts, info.psi_lwpid) += 1;
+               } else {
+                       ATF_CHECK_EQ_MSG(info.psi_siginfo.si_code, TRAP_LWP,
+                           "lwp=%d, expected TRAP_LWP (%d), got %d",
+                           info.psi_lwpid, TRAP_LWP, info.psi_siginfo.si_code);
+               }
 
                DPRINTF("Before resuming the child process\n");
                SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1,
-                    signal_handle != TCSH_DISCARD ? WSTOPSIG(status) : 0)
-                    != -1);
+                    signal_handle != TCSH_DISCARD && WSTOPSIG(status) != SIGTRAP
+                    ? WSTOPSIG(status) : 0) != -1);
        }
 
        for (i = 0; i < signal_threads; i++)



Home | Main Index | Thread Index | Old Index