Module Name:    src
Committed By:   mgorny
Date:           Thu Feb 13 15:26:18 UTC 2020

Modified Files:
        src/tests/lib/libc/sys: t_ptrace_wait.c

Log Message:
Test whether signal handler is called in concurrent bombarding


To generate a diff of this commit:
cvs rdiff -u -r1.157 -r1.158 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.157 src/tests/lib/libc/sys/t_ptrace_wait.c:1.158
--- src/tests/lib/libc/sys/t_ptrace_wait.c:1.157	Thu Feb 13 15:25:58 2020
+++ src/tests/lib/libc/sys/t_ptrace_wait.c	Thu Feb 13 15:26:18 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: t_ptrace_wait.c,v 1.157 2020/02/13 15:25:58 mgorny Exp $	*/
+/*	$NetBSD: t_ptrace_wait.c,v 1.158 2020/02/13 15:26:18 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.157 2020/02/13 15:25:58 mgorny Exp $");
+__RCSID("$NetBSD: t_ptrace_wait.c,v 1.158 2020/02/13 15:26:18 mgorny Exp $");
 
 #define __LEGACY_PT_LWPINFO
 
@@ -8645,11 +8645,15 @@ enum thread_concurrent_signal_handling {
 };
 
 static pthread_barrier_t thread_concurrent_barrier;
+static pthread_key_t thread_concurrent_key;
 
 static void
 thread_concurrent_sig_handler(int sig)
 {
-	/* TODO: verify that handler is actually called */
+	void *tls_val = pthread_getspecific(thread_concurrent_key);
+	DPRINTF("Before increment, LWP %d tls_val=%p\n", _lwp_self(), tls_val);
+	FORKEE_ASSERT(pthread_setspecific(thread_concurrent_key,
+	    (void*)((uintptr_t)tls_val + 1)) == 0);
 }
 
 static void *
@@ -8657,10 +8661,18 @@ thread_concurrent_signals_thread(void *a
 {
 	int sigval = thread_concurrent_signals_list[
 	    _lwp_self() % __arraycount(thread_concurrent_signals_list)];
+	enum thread_concurrent_signal_handling *signal_handle = arg;
+	void *tls_val;
+
 	pthread_barrier_wait(&thread_concurrent_barrier);
 	DPRINTF("Before raising %s from LWP %d\n", strsignal(sigval),
 		_lwp_self());
 	pthread_kill(pthread_self(), sigval);
+	if (*signal_handle == TCSH_HANDLER) {
+	    tls_val = pthread_getspecific(thread_concurrent_key);
+	    DPRINTF("After raising, LWP %d tls_val=%p\n", _lwp_self(), tls_val);
+	    FORKEE_ASSERT(tls_val == (void*)1);
+	}
 	return NULL;
 }
 
@@ -8718,10 +8730,13 @@ thread_concurrent_test(enum thread_concu
 		FORKEE_ASSERT(pthread_barrier_init(
 		    &thread_concurrent_barrier, NULL,
 		    signal_threads) == 0);
+		FORKEE_ASSERT(pthread_key_create(&thread_concurrent_key, NULL)
+		    == 0);
 
 		for (i = 0; i < signal_threads; i++) {
 			FORKEE_ASSERT(pthread_create(&sig_threads[i], NULL,
-			    thread_concurrent_signals_thread, NULL) == 0);
+			    thread_concurrent_signals_thread,
+			    &signal_handle) == 0);
 		}
 
 		DPRINTF("Before joining threads from the child\n");
@@ -8729,6 +8744,7 @@ thread_concurrent_test(enum thread_concu
 			FORKEE_ASSERT(pthread_join(sig_threads[i], NULL) == 0);
 		}
 
+		FORKEE_ASSERT(pthread_key_delete(thread_concurrent_key) == 0);
 		FORKEE_ASSERT(pthread_barrier_destroy(
 		    &thread_concurrent_barrier) == 0);
 

Reply via email to