diff --git a/stdlib/test-atexit-race-common.c b/stdlib/test-atexit-race-common.c new file mode 100644 index 0000000000..b3792837c7 --- /dev/null +++ b/stdlib/test-atexit-race-common.c @@ -0,0 +1,69 @@ +/* Bug 14333: Support file for atexit/exit, etc. race tests. + Copyright (C) 2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +/* This file must be run from within a directory called "stdlib". */ + +/* The atexit/exit, at_quick_exit/quick_exit, __cxa_atexit/exit, etc. + exhibited data race while accessing destructor function list (Bug 14333). + + This test spawns large number of threads, which all race to register + large number of destructors. + + Before the fix, running this test resulted in a SIGSEGV. + After the fix, we expect clean process termination. */ + +#if !defined(CALL_EXIT) || !defined(CALL_ATEXIT) +#error Must define CALL_EXIT and CALL_ATEXIT before using this file. +#endif + +#include +#include +#include + +const size_t kNumThreads = 1024; +const size_t kNumHandlers = 1024; + +static void * +threadfunc (void *unused) +{ + size_t i; + for (i = 0; i < kNumHandlers; ++i) { + CALL_ATEXIT; + } + return NULL; +} + +static int +do_test (void) +{ + size_t i; + pthread_attr_t attr; + + xpthread_attr_init (&attr); + xpthread_attr_setdetachstate (&attr, 1); + + for (i = 0; i < kNumThreads; ++i) { + xpthread_create (&attr, threadfunc, NULL); + } + xpthread_attr_destroy (&attr); + + CALL_EXIT; +} + +#define TEST_FUNCTION do_test +#include