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);