diff options
Diffstat (limited to 'nptl')
98 files changed, 258 insertions, 7328 deletions
diff --git a/nptl/Makefile b/nptl/Makefile index 0e835ae83f..b1e60d303f 100644 --- a/nptl/Makefile +++ b/nptl/Makefile @@ -276,55 +276,27 @@ tests = tst-attr2 tst-attr3 tst-default-attr \ tst-rwlock15 tst-rwlock17 tst-rwlock18 \ tst-once5 \ tst-sem17 \ - tst-align tst-align3 \ - tst-kill1 tst-kill2 tst-kill3 tst-kill4 tst-kill5 tst-kill6 \ - tst-raise1 \ - tst-detach1 \ - tst-eintr2 tst-eintr3 tst-eintr4 tst-eintr5 \ - tst-tsd1 tst-tsd2 tst-tsd3 tst-tsd4 tst-tsd5 tst-tsd6 \ - tst-tls1 tst-tls2 \ - tst-fork1 tst-fork2 tst-fork3 tst-fork4 \ - tst-atfork1 \ - tst-cancel1 tst-cancel2 tst-cancel3 tst-cancel4 tst-cancel4_1 \ - tst-cancel4_2 tst-cancel5 \ - tst-cancel6 tst-cancel7 tst-cancel8 tst-cancel9 tst-cancel10 \ - tst-cancel11 tst-cancel12 tst-cancel13 tst-cancel14 tst-cancel15 \ - tst-cancel16 tst-cancel17 tst-cancel18 tst-cancel19 tst-cancel20 \ - tst-cancel21 tst-cancel22 tst-cancel23 tst-cancel24 \ - tst-cancel26 tst-cancel27 tst-cancel28 \ + tst-tsd3 tst-tsd4 \ + tst-cancel4 tst-cancel4_1 tst-cancel4_2 tst-cancel5 \ + tst-cancel6 tst-cancel7 tst-cancel9 tst-cancel11 tst-cancel13 \ + tst-cancel16 tst-cancel17 tst-cancel20 tst-cancel21 tst-cancel24 \ tst-cancel-self tst-cancel-self-cancelstate \ - tst-cancel-self-canceltype tst-cancel-self-testcancel \ - tst-cleanup0 tst-cleanup1 tst-cleanup2 tst-cleanup3 tst-cleanup4 \ - tst-flock1 tst-flock2 \ - tst-signal1 tst-signal2 tst-signal3 tst-signal4 tst-signal5 \ - tst-signal6 tst-signal8 \ - tst-exec1 tst-exec2 tst-exec3 tst-exec4 tst-exec5 \ - tst-exit1 tst-exit2 tst-exit3 \ - tst-stdio1 tst-stdio2 \ - tst-stack1 tst-stack2 tst-stack3 tst-stack4 \ + tst-cleanup4 \ + tst-flock2 \ + tst-signal1 tst-signal2 tst-signal3 \ + tst-exec4 tst-exec5 \ + tst-stack2 tst-stack3 tst-stack4 \ tst-pthread-attr-affinity \ - tst-unload \ tst-dlsym1 \ - tst-sysconf \ - tst-locale1 tst-locale2 \ - tst-umask1 \ - tst-popen1 \ - tst-clock1 \ tst-context1 \ tst-sched1 \ - tst-backtrace1 \ - tst-vfork1 tst-vfork2 tst-vfork1x tst-vfork2x \ - tst-getpid3 \ - tst-setuid3 \ tst-initializers1 $(addprefix tst-initializers1-,\ c89 gnu89 c99 gnu99 c11 gnu11) \ - tst-bad-schedattr \ tst-thread_local1 \ - tst-robust-fork tst-create-detached tst-memstream \ + tst-robust-fork \ tst-thread-exit-clobber tst-minstack-cancel tst-minstack-exit \ tst-minstack-throw \ tst-rwlock-pwn \ - tst-unwind-thread \ tst-thread-affinity-pthread \ tst-thread-affinity-pthread2 \ tst-thread-affinity-sched \ @@ -353,9 +325,6 @@ test-srcs = tst-oddstacklimit # 18435 - pthread_once hangs when init routine throws an exception. test-xfail-tst-once5 = yes -# Files which must not be linked with libpthread. -tests-nolibpthread = tst-unload - gen-as-const-headers = unwindbuf.sym \ pthread-pi-defines.sym @@ -390,15 +359,11 @@ endif LDFLAGS-pthread.so = -Wl,--enable-new-dtags,-z,nodelete,-z,initfirst -# GCC-4.9 compiles 'sprintf(NULL, ...)' into UD2 on x86_64 without -fno-builtin -CFLAGS-tst-cleanup2.c += -fno-builtin -CFLAGS-tst-cleanupx2.c += -fno-builtin +tests += tst-cancelx4 tst-cancelx5 tst-cancelx6 tst-cancelx7 tst-cancelx9 \ + tst-cancelx11 tst-cancelx13 \ + tst-cancelx16 tst-cancelx17 tst-cancelx20 tst-cancelx21 \ + tst-cleanupx4 -tests += tst-cancelx2 tst-cancelx3 tst-cancelx4 tst-cancelx5 \ - tst-cancelx6 tst-cancelx7 tst-cancelx8 tst-cancelx9 tst-cancelx10 \ - tst-cancelx11 tst-cancelx12 tst-cancelx13 tst-cancelx14 tst-cancelx15 \ - tst-cancelx16 tst-cancelx17 tst-cancelx18 tst-cancelx20 tst-cancelx21 \ - tst-cleanupx0 tst-cleanupx1 tst-cleanupx2 tst-cleanupx3 tst-cleanupx4 ifeq ($(build-shared),yes) tests += tst-atfork2 tst-tls4 tst-_res1 tst-fini1 tst-compat-forwarder \ tst-audit-threads @@ -466,23 +431,23 @@ CFLAGS-funlockfile.c += $(libio-mtsafe) link-libc-static := $(common-objpfx)libc.a $(static-gnulib) \ $(common-objpfx)libc.a -tests-static += tst-locale1 tst-locale2 tst-stackguard1-static \ +tests-static += tst-stackguard1-static \ tst-cancel21-static tst-cancel24-static \ tst-mutex8-static tst-mutexpi8-static tst-sem11-static \ tst-sem12-static tst-cond11-static -tests += tst-cancel21-static tst-cancel24-static \ - tst-cond11-static +tests += tst-cancel21-static tst-cancel24-static + tests-internal += tst-sem11-static tst-sem12-static tst-stackguard1-static xtests-static += tst-setuid1-static # These tests are linked with libc before libpthread -tests-reverse += tst-cancel5 tst-cancel23 tst-vfork1x tst-vfork2x +tests-reverse += tst-cancel5 ifeq ($(run-built-tests),yes) tests-special += $(objpfx)tst-stack3-mem.out $(objpfx)tst-oddstacklimit.out ifeq ($(build-shared),yes) -tests-special += $(objpfx)tst-tls6.out $(objpfx)tst-cleanup0-cmp.out +tests-special += $(objpfx)tst-tls6.out endif endif @@ -520,33 +485,19 @@ CFLAGS-tst-cancelx5.c += -Wno-error # Run the cancellation and cleanup tests also for the modern, exception-based # implementation. For this we have to pass the -fexceptions parameter. -CFLAGS-tst-cancelx2.c += -fexceptions -CFLAGS-tst-cancelx3.c += -fexceptions CFLAGS-tst-cancelx4.c += -fexceptions CFLAGS-tst-cancelx5.c += -fexceptions CFLAGS-tst-cancelx6.c += -fexceptions CFLAGS-tst-cancelx7.c += -fexceptions -CFLAGS-tst-cancelx8.c += -fexceptions CFLAGS-tst-cancelx9.c += -fexceptions -CFLAGS-tst-cancelx10.c += -fexceptions CFLAGS-tst-cancelx11.c += -fexceptions -CFLAGS-tst-cancelx12.c += -fexceptions CFLAGS-tst-cancelx13.c += -fexceptions -CFLAGS-tst-cancelx14.c += -fexceptions -CFLAGS-tst-cancelx15.c += -fexceptions CFLAGS-tst-cancelx16.c += -fexceptions CFLAGS-tst-cancelx17.c += -fexceptions -CFLAGS-tst-cancelx18.c += -fexceptions CFLAGS-tst-cancelx20.c += -fexceptions -fasynchronous-unwind-tables CFLAGS-tst-cancelx21.c += -fexceptions -fasynchronous-unwind-tables -CFLAGS-tst-cleanupx0.c += -fexceptions -fasynchronous-unwind-tables -CFLAGS-tst-cleanupx1.c += -fexceptions -fasynchronous-unwind-tables -CFLAGS-tst-cleanupx2.c += -fexceptions -CFLAGS-tst-cleanupx3.c += -fexceptions CFLAGS-tst-cleanupx4.c += -fexceptions CFLAGS-tst-cleanupx4aux.c += -fexceptions -CFLAGS-tst-align.c += $(stack-align-test-flags) -CFLAGS-tst-align3.c += $(stack-align-test-flags) CFLAGS-tst-initializers1.c += -W -Wall -Werror CFLAGS-tst-initializers1-< = $(CFLAGS-tst-initializers1.c) \ $(patsubst tst-initializers1-%.c,-std=%,$<) @@ -559,7 +510,6 @@ CFLAGS-tst-initializers1-gnu11.c += $(CFLAGS-tst-initializers1-<) tst-cancel7-ARGS = --command "exec $(host-test-program-cmd)" tst-cancelx7-ARGS = $(tst-cancel7-ARGS) -tst-umask1-ARGS = $(objpfx)tst-umask1.temp $(objpfx)tst-atfork2: $(libdl) $(shared-thread-library) LDFLAGS-tst-atfork2 = -rdynamic @@ -612,9 +562,6 @@ $(objpfx)tst-tls6.out: tst-tls6.sh $(objpfx)tst-tls5 \ $(BASH) $< $(common-objpfx) '$(test-via-rtld-prefix)' \ '$(test-wrapper-env)' '$(run-program-env)' > $@; \ $(evaluate-test) -$(objpfx)tst-cancel28: $(common-objpfx)rt/librt.so -else -$(objpfx)tst-cancel28: $(common-objpfx)rt/librt.a endif $(objpfx)tst-dlsym1: $(libdl) $(shared-thread-library) @@ -647,36 +594,11 @@ $(objpfx)libpthread.so: $(addprefix $(objpfx),$(crti-objs) $(crtn-objs)) $(objpfx)libpthread.so: +preinit += $(addprefix $(objpfx),$(crti-objs)) $(objpfx)libpthread.so: +postinit += $(addprefix $(objpfx),$(crtn-objs)) -# Make sure we link with the thread library. ifeq ($(build-shared),yes) -$(addprefix $(objpfx), \ - $(filter-out $(tests-static) $(xtests-static) $(tests-reverse) \ - $(tests-nolibpthread), \ - $(tests) $(tests-internal) $(xtests) $(test-srcs) $(tests-container))): \ - $(objpfx)libpthread.so -$(objpfx)tst-unload: $(libdl) -# $(objpfx)../libc.so is used instead of $(common-objpfx)libc.so, -# since otherwise libpthread.so comes before libc.so when linking. -$(addprefix $(objpfx), $(tests-reverse)): \ - $(objpfx)../libc.so $(objpfx)libpthread.so -$(objpfx)../libc.so: $(common-objpfx)libc.so ; -$(addprefix $(objpfx),$(tests-static) $(xtests-static)): $(objpfx)libpthread.a - $(objpfx)tst-atfork2.out: $(objpfx)tst-atfork2mod.so -else -$(addprefix $(objpfx),$(tests) $(test-srcs)): $(objpfx)libpthread.a endif ifeq ($(build-shared),yes) - -$(objpfx)tst-cleanup0.out: /dev/null $(objpfx)tst-cleanup0 - $(make-test-out) > $@ 2>&1; \ - $(evaluate-test) - -$(objpfx)tst-cleanup0-cmp.out: tst-cleanup0.expect $(objpfx)tst-cleanup0.out - cmp $^ > $@; \ - $(evaluate-test) - $(objpfx)crti.o: $(objpfx)pt-crti.o ln -f $< $@ @@ -729,8 +651,6 @@ $(objpfx)tst-audit-threads: $(objpfx)tst-audit-threads-mod2.so $(objpfx)tst-audit-threads.out: $(objpfx)tst-audit-threads-mod1.so tst-audit-threads-ENV = LD_AUDIT=$(objpfx)tst-audit-threads-mod1.so -CFLAGS-tst-unwind-thread.c += -funwind-tables - # The test uses dlopen indirectly and would otherwise load system # objects. tst-setuid1-static-ENV = \ diff --git a/nptl/eintr.c b/nptl/eintr.c deleted file mode 100644 index 99a03e0957..0000000000 --- a/nptl/eintr.c +++ /dev/null @@ -1,86 +0,0 @@ -/* Copyright (C) 2003-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <signal.h> -#include <unistd.h> -#include <support/xthread.h> -#include <support/xsignal.h> -#include <support/xthread.h> - - -static int the_sig; - - -static void -eintr_handler (int sig) -{ - if (sig != the_sig) - { - write (STDOUT_FILENO, "eintr_handler: signal number wrong\n", 35); - _exit (1); - } - write (STDOUT_FILENO, ".", 1); -} - - -static void * -eintr_source (void *arg) -{ - struct timespec ts = { .tv_sec = 0, .tv_nsec = 500000 }; - - if (arg == NULL) - { - sigset_t ss; - sigemptyset (&ss); - sigaddset (&ss, the_sig); - xpthread_sigmask (SIG_BLOCK, &ss, NULL); - } - - while (1) - { - if (arg != NULL) - pthread_kill (*(pthread_t *) arg, the_sig); - else - kill (getpid (), the_sig); - - nanosleep (&ts, NULL); - } - - /* NOTREACHED */ - return NULL; -} - - -static void -setup_eintr (int sig, pthread_t *thp) -{ - struct sigaction sa; - sigemptyset (&sa.sa_mask); - sa.sa_flags = 0; - sa.sa_handler = eintr_handler; - if (sigaction (sig, &sa, NULL) != 0) - { - puts ("setup_eintr: sigaction failed"); - exit (1); - } - the_sig = sig; - - /* Create the thread which will fire off the signals. */ - xpthread_create (NULL, eintr_source, thp); -} diff --git a/nptl/tst-align.c b/nptl/tst-align.c deleted file mode 100644 index 6bb030fc13..0000000000 --- a/nptl/tst-align.c +++ /dev/null @@ -1,70 +0,0 @@ -/* Copyright (C) 2003-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdbool.h> -#include <stdint.h> -#include <stdio.h> -#include <tst-stack-align.h> - -static void * -tf (void *arg) -{ - bool ok = true; - - puts ("in thread"); - - if (TEST_STACK_ALIGN ()) - ok = false; - - return ok ? NULL : (void *) -1l; -} - -static int -do_test (void) -{ - bool ok = true; - - puts ("in main"); - - if (TEST_STACK_ALIGN ()) - ok = false; - - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("create failed"); - return 1; - } - - void *res; - if (pthread_join (th, &res) != 0) - { - puts ("join failed"); - return 1; - } - - if (res != NULL) - ok = false; - - return ok ? 0 : 1; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-align3.c b/nptl/tst-align3.c deleted file mode 100644 index b9a35f9586..0000000000 --- a/nptl/tst-align3.c +++ /dev/null @@ -1,56 +0,0 @@ -/* Copyright (C) 2005-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2005. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdbool.h> -#include <stdint.h> -#include <stdio.h> -#include <tst-stack-align.h> - -static bool ok = true; -static pthread_once_t once = PTHREAD_ONCE_INIT; - -static void -once_test (void) -{ - puts ("in once_test"); - - if (TEST_STACK_ALIGN ()) - ok = false; -} - -static int -do_test (void) -{ - puts ("in main"); - - if (TEST_STACK_ALIGN ()) - ok = false; - - if (pthread_once (&once, once_test)) - { - puts ("pthread once failed"); - return 1; - } - - return ok ? 0 : 1; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-atfork1.c b/nptl/tst-atfork1.c deleted file mode 100644 index b7d2c023df..0000000000 --- a/nptl/tst-atfork1.c +++ /dev/null @@ -1,120 +0,0 @@ -/* Copyright (C) 2002-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/wait.h> - - -static int val; - - -static void -prepare1 (void) -{ - val *= 2; -} - -static void -prepare2 (void) -{ - ++val; -} - -static void -parent1 (void) -{ - val += 4; -} - -static void -parent2 (void) -{ - val *= 4; -} - -static void -child1 (void) -{ - val += 8; -} - -static void -child2 (void) -{ - val *= 8; -} - - -static int -do_test (void) -{ - pid_t pid; - int status = 0; - - if (pthread_atfork (prepare1, parent1, child1) != 0) - { - puts ("1st atfork failed"); - exit (1); - } - if (pthread_atfork (prepare2, parent2, child2) != 0) - { - puts ("2nd atfork failed"); - exit (1); - } - - pid = fork (); - if (pid == -1) - { - puts ("fork failed"); - exit (1); - } - - if (pid != 0) - { - /* Parent. */ - if (val != 24) - { - printf ("expected val=%d, got %d\n", 24, val); - exit (1); - } - - if (TEMP_FAILURE_RETRY (waitpid (pid, &status, 0)) != pid) - { - puts ("waitpid failed"); - exit (1); - } - } - else - { - /* Child. */ - if (val != 80) - { - printf ("expected val=%d, got %d\n", 80, val); - exit (2); - } - } - - return status; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-backtrace1.c b/nptl/tst-backtrace1.c deleted file mode 100644 index 9c7efd306a..0000000000 --- a/nptl/tst-backtrace1.c +++ /dev/null @@ -1,85 +0,0 @@ -/* Copyright (C) 2004-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2004. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <execinfo.h> -#include <pthread.h> -#include <stdio.h> - -#define BT_SIZE 64 -void *bt_array[BT_SIZE]; -int bt_cnt; - -int -do_bt (void) -{ - bt_cnt = backtrace (bt_array, BT_SIZE); - return 56; -} - -int -call_do_bt (void) -{ - return do_bt () + 1; -} - -void * -tf (void *arg) -{ - if (call_do_bt () != 57) - return (void *) 1L; - return NULL; -} - -int -do_test (void) -{ - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL)) - { - puts ("create failed"); - return 1; - } - - void *res; - if (pthread_join (th, &res)) - { - puts ("join failed"); - return 1; - } - - if (res != NULL) - { - puts ("thread failed"); - return 1; - } - - char **text = backtrace_symbols (bt_array, bt_cnt); - if (text == NULL) - { - puts ("backtrace_symbols failed"); - return 1; - } - - for (int i = 0; i < bt_cnt; ++i) - puts (text[i]); - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-bad-schedattr.c b/nptl/tst-bad-schedattr.c deleted file mode 100644 index f837dbdc76..0000000000 --- a/nptl/tst-bad-schedattr.c +++ /dev/null @@ -1,97 +0,0 @@ -/* Test that pthread_create diagnoses invalid scheduling parameters. - Copyright (C) 2014-2020 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 - <https://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - - -static void * -thread_function (void *arg) -{ - abort (); -} - - -static int -do_test (void) -{ -#if !defined SCHED_FIFO || !defined SCHED_OTHER - puts ("SCHED_FIFO or SCHED_OTHER not available at compile time"); - return 0; /* 77 */ -#else - - int err; - -#define TRY(func, arglist) \ - if ((err = func arglist) != 0) \ - { \ - printf ("%s: %s\n", #func, strerror (err)); \ - return 2; \ - } - - int fifo_max = sched_get_priority_max (SCHED_FIFO); - if (fifo_max == -1) - { - assert (errno == ENOTSUP || errno == ENOSYS); - puts ("SCHED_FIFO not supported, cannot test"); - return 0; /* 77 */ - } - - int other_max = sched_get_priority_max (SCHED_OTHER); - if (other_max == -1) - { - assert (errno == ENOTSUP || errno == ENOSYS); - puts ("SCHED_OTHER not supported, cannot test"); - return 0; /* 77 */ - } - - assert (fifo_max > other_max); - - pthread_attr_t attr; - TRY (pthread_attr_init, (&attr)); - TRY (pthread_attr_setinheritsched, (&attr, PTHREAD_EXPLICIT_SCHED)); - TRY (pthread_attr_setschedpolicy, (&attr, SCHED_FIFO)); - - /* This value is chosen so as to be valid for SCHED_FIFO but invalid for - SCHED_OTHER. */ - struct sched_param param = { .sched_priority = other_max + 1 }; - TRY (pthread_attr_setschedparam, (&attr, ¶m)); - - TRY (pthread_attr_setschedpolicy, (&attr, SCHED_OTHER)); - - /* Now ATTR has a sched_param that is invalid for its policy. */ - pthread_t th; - err = pthread_create (&th, &attr, &thread_function, NULL); - if (err != EINVAL) - { - printf ("pthread_create returned %d (%s), expected %d (EINVAL: %s)\n", - err, strerror (err), EINVAL, strerror (EINVAL)); - return 1; - } - - return 0; -#endif -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel-self-canceltype.c b/nptl/tst-cancel-self-canceltype.c deleted file mode 100644 index 4f4ae08682..0000000000 --- a/nptl/tst-cancel-self-canceltype.c +++ /dev/null @@ -1,53 +0,0 @@ -/* Copyright (C) 2012-2020 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 - <https://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include "tst-cancel-self-cleanup.c" - - -static int -do_test (void) -{ - int ret = 0, should_fail = 0; - - pthread_cleanup_push (cleanup, &should_fail); - - if ((ret = pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, NULL)) != 0) - { - printf ("setcanceltype failed: %s\n", strerror (ret)); - exit (1); - } - - if ((ret = pthread_cancel (pthread_self ())) != 0) - { - printf ("cancel failed: %s\n", strerror (ret)); - exit (1); - } - - /* Wait to be canceled. Don't give any cancellation points to play with. */ - while (1); - pthread_cleanup_pop (0); - - return 1; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel-self-cleanup.c b/nptl/tst-cancel-self-cleanup.c deleted file mode 100644 index 5373397f69..0000000000 --- a/nptl/tst-cancel-self-cleanup.c +++ /dev/null @@ -1,23 +0,0 @@ -/* Copyright (C) 2012-2020 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 - <https://www.gnu.org/licenses/>. */ - -static void -cleanup (void *cleanup_should_fail) -{ - printf ("Main thread got cancelled and is being cleaned up now\n"); - exit (*(int *)cleanup_should_fail); -} diff --git a/nptl/tst-cancel-self-testcancel.c b/nptl/tst-cancel-self-testcancel.c deleted file mode 100644 index f9e4b82137..0000000000 --- a/nptl/tst-cancel-self-testcancel.c +++ /dev/null @@ -1,48 +0,0 @@ -/* Copyright (C) 2012-2020 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 - <https://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include "tst-cancel-self-cleanup.c" - - -static int -do_test (void) -{ - int ret = 0, should_fail = 0; - - pthread_cleanup_push (cleanup, &should_fail); - if ((ret = pthread_cancel (pthread_self ())) != 0) - { - printf ("cancel failed: %s\n", strerror (ret)); - exit (1); - } - - pthread_testcancel (); - - printf ("Could not cancel self.\n"); - pthread_cleanup_pop (0); - - return 1; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel1.c b/nptl/tst-cancel1.c deleted file mode 100644 index 19a12a0b96..0000000000 --- a/nptl/tst-cancel1.c +++ /dev/null @@ -1,162 +0,0 @@ -/* Copyright (C) 2002-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - - -static pthread_mutex_t m1 = PTHREAD_MUTEX_INITIALIZER; -static pthread_mutex_t m2 = PTHREAD_MUTEX_INITIALIZER; - -static int cntr; - - -static void -cleanup (void *arg) -{ - if (arg != (void *) 42l) - cntr = 42; - else - cntr = 1; -} - - -static void * -tf (void *arg) -{ - /* Ignore all signals. This must not have any effect on delivering - the cancellation signal. */ - sigset_t ss; - - sigfillset (&ss); - - if (pthread_sigmask (SIG_BLOCK, &ss, NULL) != 0) - { - puts ("pthread_sigmask failed"); - exit (1); - } - - pthread_cleanup_push (cleanup, (void *) 42l); - - int err = pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, NULL); - if (err != 0) - { - printf ("setcanceltype failed: %s\n", strerror (err)); - exit (1); - } - /* The following code is not standard compliant: the mutex functions - must not be called with asynchronous cancellation enabled. */ - - err = pthread_mutex_unlock (&m2); - if (err != 0) - { - printf ("child: mutex_unlock failed: %s\n", strerror (err)); - exit (1); - } - - err = pthread_mutex_lock (&m1); - if (err != 0) - { - printf ("child: 1st mutex_lock failed: %s\n", strerror (err)); - exit (1); - } - - /* We should never come here. */ - - pthread_cleanup_pop (0); - - return NULL; -} - - -static int -do_test (void) -{ - int err; - pthread_t th; - int result = 0; - void *retval; - - /* Get the mutexes. */ - err = pthread_mutex_lock (&m1); - if (err != 0) - { - printf ("parent: 1st mutex_lock failed: %s\n", strerror (err)); - return 1; - } - err = pthread_mutex_lock (&m2); - if (err != 0) - { - printf ("parent: 2nd mutex_lock failed: %s\n", strerror (err)); - return 1; - } - - err = pthread_create (&th, NULL, tf, NULL); - if (err != 0) - { - printf ("create failed: %s\n", strerror (err)); - return 1; - } - - err = pthread_mutex_lock (&m2); - if (err != 0) - { - printf ("parent: 3rd mutex_lock failed: %s\n", strerror (err)); - return 1; - } - - err = pthread_cancel (th); - if (err != 0) - { - printf ("cancel failed: %s\n", strerror (err)); - return 1; - } - - err = pthread_join (th, &retval); - if (err != 0) - { - printf ("join failed: %s\n", strerror (err)); - return 1; - } - - if (retval != PTHREAD_CANCELED) - { - printf ("wrong return value: %p\n", retval); - result = 1; - } - - if (cntr == 42) - { - puts ("cleanup handler called with wrong argument"); - result = 1; - } - else if (cntr != 1) - { - puts ("cleanup handling not called"); - result = 1; - } - - return result; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel10.c b/nptl/tst-cancel10.c deleted file mode 100644 index 79caefb31f..0000000000 --- a/nptl/tst-cancel10.c +++ /dev/null @@ -1,125 +0,0 @@ -/* Copyright (C) 2003-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - - -static void -cleanup (void *arg) -{ - /* Just for fun. */ - if (pthread_cancel (pthread_self ()) != 0) - { - puts ("cleanup: cancel failed"); - exit (1); - } - - printf ("cleanup for %ld\n", (long int) arg); -} - - -static void * -tf (void *arg) -{ - long int n = (long int) arg; - - pthread_cleanup_push (cleanup, arg); - - if (pthread_setcanceltype ((n & 1) == 0 - ? PTHREAD_CANCEL_DEFERRED - : PTHREAD_CANCEL_ASYNCHRONOUS, NULL) != 0) - { - puts ("setcanceltype failed"); - exit (1); - } - - if (pthread_cancel (pthread_self ()) != 0) - { - puts ("cancel failed"); - exit (1); - } - - pthread_testcancel (); - - /* We should never come here. */ - - pthread_cleanup_pop (0); - - return NULL; -} - - -static int -do_test (void) -{ - pthread_attr_t at; - - if (pthread_attr_init (&at) != 0) - { - puts ("attr_init failed"); - return 1; - } - - if (pthread_attr_setstacksize (&at, 1 * 1024 * 1024) != 0) - { - puts ("attr_setstacksize failed"); - return 1; - } - -#define N 20 - int i; - pthread_t th[N]; - - for (i = 0; i < N; ++i) - if (pthread_create (&th[i], &at, tf, (void *) (long int) i) != 0) - { - puts ("create failed"); - exit (1); - } - - if (pthread_attr_destroy (&at) != 0) - { - puts ("attr_destroy failed"); - return 1; - } - - for (i = 0; i < N; ++i) - { - void *r; - if (pthread_join (th[i], &r) != 0) - { - puts ("join failed"); - exit (1); - } - - if (r != PTHREAD_CANCELED) - { - puts ("thread not canceled"); - exit (1); - } - } - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel12.c b/nptl/tst-cancel12.c deleted file mode 100644 index 55045f55d2..0000000000 --- a/nptl/tst-cancel12.c +++ /dev/null @@ -1,123 +0,0 @@ -/* Test sem_wait cancellation for uncontended case. - Copyright (C) 2003-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <semaphore.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - - -static pthread_barrier_t bar; -static sem_t sem; - - -static void -cleanup (void *arg) -{ - static int ncall; - - if (++ncall != 1) - { - puts ("second call to cleanup"); - exit (1); - } -} - - -static void * -tf (void *arg) -{ - pthread_cleanup_push (cleanup, NULL); - - int e = pthread_barrier_wait (&bar); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("error: tf: 1st barrier_wait failed"); - exit (1); - } - - /* This call should be cancelable. */ - sem_wait (&sem); - - pthread_cleanup_pop (0); - - return NULL; -} - - -static int -do_test (void) -{ - pthread_t th; - - if (pthread_barrier_init (&bar, NULL, 2) != 0) - { - puts ("error: barrier_init failed"); - exit (1); - } - - /* A value higher than 0 will check for uncontended pthread cancellation, - where the sem_wait operation will return immediatelly. */ - if (sem_init (&sem, 0, 1) != 0) - { - puts ("error: sem_init failed"); - exit (1); - } - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("error: create failed"); - exit (1); - } - - if (pthread_cancel (th) != 0) - { - puts ("error: pthread_cancel failed"); - exit (1); - } - - int e = pthread_barrier_wait (&bar); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("error: 1st barrier_wait failed"); - exit (1); - } - - void *r; - if (pthread_join (th, &r) != 0) - { - puts ("error: pthread_join failed"); - exit (1); - } - - if (r != PTHREAD_CANCELED) - { - puts ("error: thread not canceled"); - exit (1); - } - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel14.c b/nptl/tst-cancel14.c deleted file mode 100644 index 32e03eb173..0000000000 --- a/nptl/tst-cancel14.c +++ /dev/null @@ -1,133 +0,0 @@ -/* Test sem_timedwait cancellation for uncontended case. - Copyright (C) 2003-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <semaphore.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/time.h> - - -static pthread_barrier_t bar; -static sem_t sem; - - -static void -cleanup (void *arg) -{ - static int ncall; - - if (++ncall != 1) - { - puts ("second call to cleanup"); - exit (1); - } -} - - -static void * -tf (void *arg) -{ - pthread_cleanup_push (cleanup, NULL); - - int e = pthread_barrier_wait (&bar); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("error: tf: 1st barrier_wait failed"); - exit (1); - } - - struct timeval tv; - (void) gettimeofday (&tv, NULL); - - struct timespec ts; - TIMEVAL_TO_TIMESPEC (&tv, &ts); - - /* Timeout in 5 seconds. */ - ts.tv_sec += 5; - - /* This call should block and be cancelable. */ - sem_timedwait (&sem, &ts); - - pthread_cleanup_pop (0); - - return NULL; -} - - -static int -do_test (void) -{ - pthread_t th; - - if (pthread_barrier_init (&bar, NULL, 2) != 0) - { - puts ("error: barrier_init failed"); - exit (1); - } - - if (sem_init (&sem, 0, 1) != 0) - { - puts ("error: sem_init failed"); - exit (1); - } - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("error: create failed"); - exit (1); - } - - /* Check whether cancellation is honored even before sem_timedwait does - anything. */ - if (pthread_cancel (th) != 0) - { - puts ("error: 1st cancel failed"); - exit (1); - } - - int e = pthread_barrier_wait (&bar); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("1st barrier_wait failed"); - exit (1); - } - - void *r; - if (pthread_join (th, &r) != 0) - { - puts ("join failed"); - exit (1); - } - - if (r != PTHREAD_CANCELED) - { - puts ("thread not canceled"); - exit (1); - } - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel15.c b/nptl/tst-cancel15.c deleted file mode 100644 index c16d9d17eb..0000000000 --- a/nptl/tst-cancel15.c +++ /dev/null @@ -1,138 +0,0 @@ -/* Test sem_timedwait cancellation for contended case. - Copyright (C) 2003-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <semaphore.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/time.h> - - -static pthread_barrier_t bar; -static sem_t sem; - - -static void -cleanup (void *arg) -{ - static int ncall; - - if (++ncall != 1) - { - puts ("second call to cleanup"); - exit (1); - } -} - - -static void * -tf (void *arg) -{ - int e; - - pthread_cleanup_push (cleanup, NULL); - - e = pthread_barrier_wait (&bar); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("error: tf: 1st barrier_wait failed"); - exit (1); - } - - struct timeval tv; - (void) gettimeofday (&tv, NULL); - - struct timespec ts; - TIMEVAL_TO_TIMESPEC (&tv, &ts); - - /* Timeout in 5 seconds. */ - ts.tv_sec += 5; - - /* This call should block and be cancelable. */ - errno = 0; - e = sem_timedwait (&sem, &ts); - - pthread_cleanup_pop (0); - - return NULL; -} - - -static int -do_test (void) -{ - pthread_t th; - - if (pthread_barrier_init (&bar, NULL, 2) != 0) - { - puts ("error: barrier_init failed"); - exit (1); - } - - if (sem_init (&sem, 0, 0) != 0) - { - puts ("error: sem_init failed"); - exit (1); - } - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("error: create failed"); - exit (1); - } - - int e = pthread_barrier_wait (&bar); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("error: 1st barrier_wait failed"); - exit (1); - } - - /* Give the child a chance to go to sleep in sem_wait. */ - sleep (1); - - /* Check whether cancellation is honored when waiting in sem_timedwait. */ - if (pthread_cancel (th) != 0) - { - puts ("error: 1st cancel failed"); - exit (1); - } - - void *r; - if (pthread_join (th, &r) != 0) - { - puts ("error: join failed"); - exit (1); - } - - if (r != PTHREAD_CANCELED) - { - puts ("error: thread not canceled"); - exit (1); - } - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel18.c b/nptl/tst-cancel18.c deleted file mode 100644 index 7dce66c91c..0000000000 --- a/nptl/tst-cancel18.c +++ /dev/null @@ -1,173 +0,0 @@ -/* Copyright (C) 2003-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <time.h> -#include <unistd.h> - - -static pthread_barrier_t b; - - -/* Cleanup handling test. */ -static int cl_called; - -static void -cl (void *arg) -{ - ++cl_called; -} - - -static void * -tf (void *arg) -{ - int r = pthread_barrier_wait (&b); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - pthread_cleanup_push (cl, NULL); - - struct timespec ts = { .tv_sec = arg == NULL ? 10000000 : 0, .tv_nsec = 0 }; - TEMP_FAILURE_RETRY (clock_nanosleep (CLOCK_REALTIME, 0, &ts, &ts)); - - pthread_cleanup_pop (0); - - puts ("clock_nanosleep returned"); - - exit (1); -} - - -static int -do_test (void) -{ - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - puts ("barrier_init failed"); - return 1; - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("1st create failed"); - return 1; - } - - int r = pthread_barrier_wait (&b); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - struct timespec ts = { .tv_sec = 0, .tv_nsec = 100000000 }; - while (nanosleep (&ts, &ts) != 0) - continue; - - puts ("going to cancel in-time"); - if (pthread_cancel (th) != 0) - { - puts ("1st cancel failed"); - return 1; - } - - void *status; - if (pthread_join (th, &status) != 0) - { - puts ("1st join failed"); - return 1; - } - if (status != PTHREAD_CANCELED) - { - puts ("1st thread not canceled"); - return 1; - } - - if (cl_called == 0) - { - puts ("cleanup handler not called"); - return 1; - } - if (cl_called > 1) - { - puts ("cleanup handler called more than once"); - return 1; - } - - puts ("in-time cancellation succeeded"); - - - cl_called = 0; - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("2nd create failed"); - return 1; - } - - puts ("going to cancel early"); - if (pthread_cancel (th) != 0) - { - puts ("2nd cancel failed"); - return 1; - } - - r = pthread_barrier_wait (&b); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - if (pthread_join (th, &status) != 0) - { - puts ("2nd join failed"); - return 1; - } - if (status != PTHREAD_CANCELED) - { - puts ("2nd thread not canceled"); - return 1; - } - - if (cl_called == 0) - { - printf ("cleanup handler not called\n"); - return 1; - } - if (cl_called > 1) - { - printf ("cleanup handler called more than once\n"); - return 1; - } - - puts ("early cancellation succeeded"); - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel19.c b/nptl/tst-cancel19.c deleted file mode 100644 index b6752d8252..0000000000 --- a/nptl/tst-cancel19.c +++ /dev/null @@ -1,285 +0,0 @@ -/* Copyright (C) 2003-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <error.h> -#include <fcntl.h> -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/select.h> -#include <sys/time.h> -#include <unistd.h> - -static void * -tf (void *arg) -{ - return NULL; -} - -static void -handler (int sig) -{ -} - -static void __attribute__ ((noinline)) -clobber_lots_of_regs (void) -{ -#define X1(n) long r##n = 10##n; __asm __volatile ("" : "+r" (r##n)); -#define X2(n) X1(n##0) X1(n##1) X1(n##2) X1(n##3) X1(n##4) -#define X3(n) X2(n##0) X2(n##1) X2(n##2) X2(n##3) X2(n##4) - X3(0) X3(1) X3(2) X3(3) X3(4) -#undef X1 -#define X1(n) __asm __volatile ("" : : "r" (r##n)); - X3(0) X3(1) X3(2) X3(3) X3(4) -#undef X1 -#undef X2 -#undef X3 -} - -static int -do_test (void) -{ - pthread_t th; - int old, rc; - int ret = 0; - int fd[2]; - - rc = pipe (fd); - if (rc < 0) - error (EXIT_FAILURE, errno, "couldn't create pipe"); - - rc = pthread_create (&th, NULL, tf, NULL); - if (rc) - error (EXIT_FAILURE, rc, "couldn't create thread"); - - rc = pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED, &old); - if (rc) - { - error (0, rc, "1st pthread_setcanceltype failed"); - ret = 1; - } - if (old != PTHREAD_CANCEL_DEFERRED && old != PTHREAD_CANCEL_ASYNCHRONOUS) - { - error (0, 0, "1st pthread_setcanceltype returned invalid value %d", - old); - ret = 1; - } - - clobber_lots_of_regs (); - close (fd[0]); - - rc = pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, &old); - if (rc) - { - error (0, rc, "pthread_setcanceltype after close failed"); - ret = 1; - } - if (old != PTHREAD_CANCEL_DEFERRED) - { - error (0, 0, "pthread_setcanceltype after close returned invalid value %d", - old); - ret = 1; - } - - clobber_lots_of_regs (); - close (fd[1]); - - rc = pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED, &old); - if (rc) - { - error (0, rc, "pthread_setcanceltype after 2nd close failed"); - ret = 1; - } - if (old != PTHREAD_CANCEL_ASYNCHRONOUS) - { - error (0, 0, "pthread_setcanceltype after 2nd close returned invalid value %d", - old); - ret = 1; - } - - struct sigaction sa = { .sa_handler = handler, .sa_flags = 0 }; - sigemptyset (&sa.sa_mask); - sigaction (SIGALRM, &sa, NULL); - - struct itimerval it; - it.it_value.tv_sec = 1; - it.it_value.tv_usec = 0; - it.it_interval = it.it_value; - setitimer (ITIMER_REAL, &it, NULL); - - clobber_lots_of_regs (); - pause (); - - memset (&it, 0, sizeof (it)); - setitimer (ITIMER_REAL, &it, NULL); - - rc = pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, &old); - if (rc) - { - error (0, rc, "pthread_setcanceltype after pause failed"); - ret = 1; - } - if (old != PTHREAD_CANCEL_DEFERRED) - { - error (0, 0, "pthread_setcanceltype after pause returned invalid value %d", - old); - ret = 1; - } - - it.it_value.tv_sec = 1; - it.it_value.tv_usec = 0; - it.it_interval = it.it_value; - setitimer (ITIMER_REAL, &it, NULL); - - clobber_lots_of_regs (); - pause (); - - memset (&it, 0, sizeof (it)); - setitimer (ITIMER_REAL, &it, NULL); - - rc = pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED, &old); - if (rc) - { - error (0, rc, "pthread_setcanceltype after 2nd pause failed"); - ret = 1; - } - if (old != PTHREAD_CANCEL_ASYNCHRONOUS) - { - error (0, 0, "pthread_setcanceltype after 2nd pause returned invalid value %d", - old); - ret = 1; - } - - char fname[] = "/tmp/tst-cancel19-dir-XXXXXX\0foo/bar"; - char *enddir = strchr (fname, '\0'); - if (mkdtemp (fname) == NULL) - { - error (0, errno, "mkdtemp failed"); - ret = 1; - } - *enddir = '/'; - - clobber_lots_of_regs (); - creat (fname, 0400); - - rc = pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, &old); - if (rc) - { - error (0, rc, "pthread_setcanceltype after creat failed"); - ret = 1; - } - if (old != PTHREAD_CANCEL_DEFERRED) - { - error (0, 0, "pthread_setcanceltype after creat returned invalid value %d", - old); - ret = 1; - } - - clobber_lots_of_regs (); - creat (fname, 0400); - - rc = pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED, &old); - if (rc) - { - error (0, rc, "pthread_setcanceltype after 2nd creat failed"); - ret = 1; - } - if (old != PTHREAD_CANCEL_ASYNCHRONOUS) - { - error (0, 0, "pthread_setcanceltype after 2nd creat returned invalid value %d", - old); - ret = 1; - } - - clobber_lots_of_regs (); - open (fname, O_CREAT, 0400); - - rc = pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, &old); - if (rc) - { - error (0, rc, "pthread_setcanceltype after open failed"); - ret = 1; - } - if (old != PTHREAD_CANCEL_DEFERRED) - { - error (0, 0, "pthread_setcanceltype after open returned invalid value %d", - old); - ret = 1; - } - - clobber_lots_of_regs (); - open (fname, O_CREAT, 0400); - - rc = pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED, &old); - if (rc) - { - error (0, rc, "pthread_setcanceltype after 2nd open failed"); - ret = 1; - } - if (old != PTHREAD_CANCEL_ASYNCHRONOUS) - { - error (0, 0, "pthread_setcanceltype after 2nd open returned invalid value %d", - old); - ret = 1; - } - - *enddir = '\0'; - rmdir (fname); - - clobber_lots_of_regs (); - select (-1, NULL, NULL, NULL, NULL); - - rc = pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, &old); - if (rc) - { - error (0, rc, "pthread_setcanceltype after select failed"); - ret = 1; - } - if (old != PTHREAD_CANCEL_DEFERRED) - { - error (0, 0, "pthread_setcanceltype after select returned invalid value %d", - old); - ret = 1; - } - - clobber_lots_of_regs (); - select (-1, NULL, NULL, NULL, NULL); - - rc = pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED, &old); - if (rc) - { - error (0, rc, "pthread_setcanceltype after 2nd select failed"); - ret = 1; - } - if (old != PTHREAD_CANCEL_ASYNCHRONOUS) - { - error (0, 0, "pthread_setcanceltype after 2nd select returned invalid value %d", - old); - ret = 1; - } - - pthread_join (th, NULL); - - return ret; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel2.c b/nptl/tst-cancel2.c deleted file mode 100644 index 1e86711596..0000000000 --- a/nptl/tst-cancel2.c +++ /dev/null @@ -1,95 +0,0 @@ -/* Copyright (C) 2002-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <unistd.h> - - -static int fd[2]; - - -static void * -tf (void *arg) -{ - /* The buffer size must be larger than the pipe size so that the - write blocks. */ - char buf[100000]; - - while (write (fd[1], buf, sizeof (buf)) > 0); - - return (void *) 42l; -} - - -static int -do_test (void) -{ - pthread_t th; - void *r; - struct sigaction sa; - - sa.sa_handler = SIG_IGN; - sigemptyset (&sa.sa_mask); - sa.sa_flags = 0; - - if (sigaction (SIGPIPE, &sa, NULL) != 0) - { - puts ("sigaction failed"); - return 1; - } - - if (pipe (fd) != 0) - { - puts ("pipe failed"); - return 1; - } - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("create failed"); - return 1; - } - - if (pthread_cancel (th) != 0) - { - puts ("cancel failed"); - return 1; - } - - /* This will cause the write in the child to return. */ - close (fd[0]); - - if (pthread_join (th, &r) != 0) - { - puts ("join failed"); - return 1; - } - - if (r != PTHREAD_CANCELED) - { - printf ("result is wrong: expected %p, got %p\n", PTHREAD_CANCELED, r); - return 1; - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel22.c b/nptl/tst-cancel22.c deleted file mode 100644 index 82a5454132..0000000000 --- a/nptl/tst-cancel22.c +++ /dev/null @@ -1,119 +0,0 @@ -/* Copyright (C) 2003-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - -pthread_barrier_t b; -int seen; - -static void * -tf (void *arg) -{ - int old; - int r = pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &old); - if (r != 0) - { - puts ("setcancelstate failed"); - exit (1); - } - - r = pthread_barrier_wait (&b); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - for (int i = 0; i < 10; ++i) - { - struct timespec ts = { .tv_sec = 0, .tv_nsec = 100000000 }; - TEMP_FAILURE_RETRY (nanosleep (&ts, &ts)); - } - - seen = 1; - pthread_setcancelstate (old, NULL); - - struct timespec ts = { .tv_sec = 0, .tv_nsec = 100000000 }; - TEMP_FAILURE_RETRY (nanosleep (&ts, &ts)); - - exit (1); -} - - -static int -do_test (void) -{ - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - puts ("barrier init failed"); - return 1; - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("thread creation failed"); - return 1; - } - - int r = pthread_barrier_wait (&b); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - return 1; - } - - if (pthread_cancel (th) != 0) - { - puts ("cancel failed"); - return 1; - } - - void *status; - if (pthread_join (th, &status) != 0) - { - puts ("join failed"); - return 1; - } - if (status != PTHREAD_CANCELED) - { - puts ("thread not canceled"); - return 1; - } - - if (pthread_barrier_destroy (&b) != 0) - { - puts ("barrier_destroy failed"); - return 1; - } - - if (seen != 1) - { - puts ("thread cancelled when PTHREAD_CANCEL_DISABLED"); - return 1; - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel23.c b/nptl/tst-cancel23.c deleted file mode 100644 index 211168748e..0000000000 --- a/nptl/tst-cancel23.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel22.c" diff --git a/nptl/tst-cancel26.c b/nptl/tst-cancel26.c deleted file mode 100644 index 91948ae909..0000000000 --- a/nptl/tst-cancel26.c +++ /dev/null @@ -1,68 +0,0 @@ -/* Check for failure paths handling for cancellation points. - Copyright (C) 2015-2020 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 - <https://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -/* Check that the cancel syscall points handles both the errno and return code - correctly for invalid arguments. */ -static void * -tf (void *arg) -{ -#ifdef SET_CANCEL_DISABLE - pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, NULL); -#endif - - /* This is a cancellation point, but we should not be cancelled. */ - int r = write (-1, 0, 0); - - if (r != -1 || errno != EBADF) - { - printf ("error: write returned %d, errno %d\n", r, errno); - exit (1); - } - - return NULL; -} - -static int -do_test (void) -{ - pthread_t th; - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("error: pthread_create failed"); - exit (1); - } - - if (pthread_join (th, NULL) != 0) - { - puts ("error: pthread_join failed"); - exit (1); - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel27.c b/nptl/tst-cancel27.c deleted file mode 100644 index d3d582e22c..0000000000 --- a/nptl/tst-cancel27.c +++ /dev/null @@ -1,23 +0,0 @@ -/* Check for failure paths handling for cancellation points. - Copyright (C) 2015-2020 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 - <https://www.gnu.org/licenses/>. */ - -/* Similar to tst-cancel26.c but with pthread cancel state set to - PTHREAD_CANCEL_DISABLE. */ - -#define SET_CANCEL_DISABLE 1 -#include "tst-cancel26.c" diff --git a/nptl/tst-cancel28.c b/nptl/tst-cancel28.c deleted file mode 100644 index 11beb0168c..0000000000 --- a/nptl/tst-cancel28.c +++ /dev/null @@ -1,79 +0,0 @@ -/* Check if the thread created by POSIX timer using SIGEV_THREAD is - cancellable. - Copyright (C) 2020 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 - <https://www.gnu.org/licenses/>. */ - -#include <stdio.h> -#include <time.h> -#include <signal.h> -#include <unistd.h> -#include <stdbool.h> - -#include <support/check.h> -#include <support/test-driver.h> -#include <support/xthread.h> - -static pthread_barrier_t barrier; -static pthread_t timer_thread; - -static void -cl (void *arg) -{ - xpthread_barrier_wait (&barrier); -} - -static void -thread_handler (union sigval sv) -{ - timer_thread = pthread_self (); - - xpthread_barrier_wait (&barrier); - - pthread_cleanup_push (cl, NULL); - while (1) - clock_nanosleep (CLOCK_REALTIME, 0, &(struct timespec) { 1, 0 }, NULL); - pthread_cleanup_pop (0); -} - -static int -do_test (void) -{ - struct sigevent sev = { 0 }; - sev.sigev_notify = SIGEV_THREAD; - sev.sigev_notify_function = &thread_handler; - - timer_t timerid; - TEST_COMPARE (timer_create (CLOCK_REALTIME, &sev, &timerid), 0); - - xpthread_barrier_init (&barrier, NULL, 2); - - struct itimerspec trigger = { 0 }; - trigger.it_value.tv_nsec = 1000000; - TEST_COMPARE (timer_settime (timerid, 0, &trigger, NULL), 0); - - xpthread_barrier_wait (&barrier); - - xpthread_cancel (timer_thread); - - xpthread_barrier_init (&barrier, NULL, 2); - xpthread_barrier_wait (&barrier); - - return 0; -} - -/* A stall in cancellation is a regression. */ -#include <support/test-driver.c> diff --git a/nptl/tst-cancel3.c b/nptl/tst-cancel3.c deleted file mode 100644 index 0a531dbcdb..0000000000 --- a/nptl/tst-cancel3.c +++ /dev/null @@ -1,97 +0,0 @@ -/* Copyright (C) 2002-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <unistd.h> - - -static int fd[2]; - - -static void * -tf (void *arg) -{ - char buf[100]; - - if (read (fd[0], buf, sizeof (buf)) == sizeof (buf)) - { - puts ("read succeeded"); - return (void *) 1l; - } - - return NULL; -} - - -static int -do_test (void) -{ - pthread_t th; - void *r; - struct sigaction sa; - - sa.sa_handler = SIG_IGN; - sigemptyset (&sa.sa_mask); - sa.sa_flags = 0; - - if (sigaction (SIGPIPE, &sa, NULL) != 0) - { - puts ("sigaction failed"); - return 1; - } - - if (pipe (fd) != 0) - { - puts ("pipe failed"); - return 1; - } - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("create failed"); - return 1; - } - - if (pthread_cancel (th) != 0) - { - puts ("cancel failed"); - return 1; - } - - /* This will cause the read in the child to return. */ - close (fd[0]); - - if (pthread_join (th, &r) != 0) - { - puts ("join failed"); - return 1; - } - - if (r != PTHREAD_CANCELED) - { - puts ("result is wrong"); - return 1; - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel8.c b/nptl/tst-cancel8.c deleted file mode 100644 index 0ee1e85db3..0000000000 --- a/nptl/tst-cancel8.c +++ /dev/null @@ -1,142 +0,0 @@ -/* Copyright (C) 2003-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -static pthread_barrier_t bar; - -static int global; - - -static void -cleanup (void *arg) -{ - global = 1; -} - - -static void * -tf (void *arg) -{ - /* Enable cancellation, but defer it. */ - if (pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL) != 0) - { - puts ("setcancelstate failed"); - exit (1); - } - if (pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED, NULL) != 0) - { - puts ("setcanceltype failed"); - exit (1); - } - - /* Add cleanup handler. */ - pthread_cleanup_push (cleanup, NULL); - - /* Synchronize with the main thread. */ - int r = pthread_barrier_wait (&bar); - if (r != 0 && r!= PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("tf: first barrier_wait failed"); - exit (1); - } - - /* And again. Once this is done the main thread should have canceled - this thread. */ - r = pthread_barrier_wait (&bar); - if (r != 0 && r!= PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("tf: second barrier_wait failed"); - exit (1); - } - - /* Remove the cleanup handler without executing it. */ - pthread_cleanup_pop (0); - - /* Now react on the cancellation. */ - pthread_testcancel (); - - /* This call should never return. */ - return NULL; -} - - -static int -do_test (void) -{ - if (pthread_barrier_init (&bar, NULL, 2) != 0) - { - puts ("barrier_init failed"); - exit (1); - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("pthread_create failed"); - return 1; - } - - int r = pthread_barrier_wait (&bar); - if (r != 0 && r!= PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("first barrier_wait failed"); - exit (1); - } - - if (pthread_cancel (th) != 0) - { - puts ("pthread_cancel failed"); - return 1; - } - - r = pthread_barrier_wait (&bar); - if (r != 0 && r!= PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("second barrier_wait failed"); - exit (1); - } - - void *result; - if (pthread_join (th, &result) != 0) - { - puts ("pthread_join failed"); - return 1; - } - - if (result != PTHREAD_CANCELED) - { - puts ("thread was not canceled"); - exit (1); - } - - if (global != 0) - { - puts ("cancellation handler has been called"); - exit (1); - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancelx1.c b/nptl/tst-cancelx1.c deleted file mode 100644 index 594f095592..0000000000 --- a/nptl/tst-cancelx1.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel1.c" diff --git a/nptl/tst-cancelx10.c b/nptl/tst-cancelx10.c deleted file mode 100644 index e5bbb34e62..0000000000 --- a/nptl/tst-cancelx10.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel10.c" diff --git a/nptl/tst-cancelx12.c b/nptl/tst-cancelx12.c deleted file mode 100644 index f90ae61bac..0000000000 --- a/nptl/tst-cancelx12.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel12.c" diff --git a/nptl/tst-cancelx14.c b/nptl/tst-cancelx14.c deleted file mode 100644 index ba4e77584e..0000000000 --- a/nptl/tst-cancelx14.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel14.c" diff --git a/nptl/tst-cancelx15.c b/nptl/tst-cancelx15.c deleted file mode 100644 index 005c1f6e3f..0000000000 --- a/nptl/tst-cancelx15.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel15.c" diff --git a/nptl/tst-cancelx18.c b/nptl/tst-cancelx18.c deleted file mode 100644 index 56da18f382..0000000000 --- a/nptl/tst-cancelx18.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel18.c" diff --git a/nptl/tst-cancelx2.c b/nptl/tst-cancelx2.c deleted file mode 100644 index 95dc8a8575..0000000000 --- a/nptl/tst-cancelx2.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel2.c" diff --git a/nptl/tst-cancelx3.c b/nptl/tst-cancelx3.c deleted file mode 100644 index 3937f10b9c..0000000000 --- a/nptl/tst-cancelx3.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel3.c" diff --git a/nptl/tst-cancelx8.c b/nptl/tst-cancelx8.c deleted file mode 100644 index 0555c7ceb0..0000000000 --- a/nptl/tst-cancelx8.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel8.c" diff --git a/nptl/tst-cleanup0.c b/nptl/tst-cleanup0.c deleted file mode 100644 index fd196abb96..0000000000 --- a/nptl/tst-cleanup0.c +++ /dev/null @@ -1,74 +0,0 @@ -/* Copyright (C) 2002-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -static int global; - - -static void -ch (void *arg) -{ - int val = (long int) arg; - - printf ("ch (%d)\n", val); - - global *= val; - global += val; -} - - -static void -endfct (void) -{ - /* We force exit right here. */ - _exit (global); -} - - -static int -do_test (void) -{ - atexit (endfct); - - pthread_cancel (pthread_self ()); - - pthread_cleanup_push (ch, (void *) 1l); - - pthread_cleanup_push (ch, (void *) 2l); - - pthread_cleanup_push (ch, (void *) 3l); - - pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, NULL); - - pthread_cleanup_pop (1); - - pthread_cleanup_pop (1); - - pthread_cleanup_pop (1); - - return 100; -} - - -#define EXPECTED_STATUS 9 -#include <support/test-driver.c> diff --git a/nptl/tst-cleanup0.expect b/nptl/tst-cleanup0.expect deleted file mode 100644 index 4e3c581802..0000000000 --- a/nptl/tst-cleanup0.expect +++ /dev/null @@ -1,3 +0,0 @@ -ch (3) -ch (2) -ch (1) diff --git a/nptl/tst-cleanup1.c b/nptl/tst-cleanup1.c deleted file mode 100644 index 7805479857..0000000000 --- a/nptl/tst-cleanup1.c +++ /dev/null @@ -1,100 +0,0 @@ -/* Copyright (C) 2002-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" - -static int global; - - -static void -ch (void *arg) -{ - int val = (long int) arg; - - printf ("ch (%d)\n", val); - - global *= val; - global += val; -} - - -static void * -tf (void *a) -{ - pthread_cancel (pthread_self ()); - - pthread_cleanup_push (ch, (void *) 1l); - - pthread_cleanup_push (ch, (void *) 2l); - - pthread_cleanup_push (ch, (void *) 3l); - - pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, NULL); - - pthread_cleanup_pop (1); - - pthread_cleanup_pop (1); - - pthread_cleanup_pop (1); - - return NULL; -} - - -int -do_test (void) -{ - pthread_t th; - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - write_message ("create failed\n"); - _exit (1); - } - - void *r; - int e; - if ((e = pthread_join (th, &r)) != 0) - { - printf ("join failed: %d\n", e); - _exit (1); - } - - if (r != PTHREAD_CANCELED) - { - puts ("thread not canceled"); - exit (1); - } - - if (global != 9) - { - printf ("global = %d, expected 9\n", global); - exit (1); - } - - return 0; -} diff --git a/nptl/tst-cleanup2.c b/nptl/tst-cleanup2.c deleted file mode 100644 index 5936c242fc..0000000000 --- a/nptl/tst-cleanup2.c +++ /dev/null @@ -1,63 +0,0 @@ -/* Copyright (C) 2003-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Bao Duong <bduong@progress.com>, 2003. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <setjmp.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <sys/types.h> - -static sigjmp_buf jmpbuf; - -static void -sig_handler (int signo) -{ - siglongjmp (jmpbuf, 1); -} - -static int -do_test (void) -{ - char *p = NULL; - /* gcc can overwrite the success written value by scheduling instructions - around sprintf. It is allowed to do this since according to C99 the first - argument of sprintf is a character array and NULL is not a valid character - array. Mark the return value as volatile so that it gets reloaded on - return. */ - volatile int ret = 0; - - if (signal (SIGSEGV, &sig_handler) == SIG_ERR) - { - perror ("installing SIGSEGV handler"); - return 1; - } - - puts ("Attempting to sprintf to null ptr"); - if (setjmp (jmpbuf)) - { - puts ("Exiting main..."); - return ret; - } - - sprintf (p, "This should segv\n"); - - return 1; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cleanup3.c b/nptl/tst-cleanup3.c deleted file mode 100644 index 150d56162f..0000000000 --- a/nptl/tst-cleanup3.c +++ /dev/null @@ -1,98 +0,0 @@ -/* Copyright (C) 2003-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" - -static int global; - - -static void -ch (void *arg) -{ - int val = (long int) arg; - - printf ("ch (%d)\n", val); - - global *= val; - global += val; -} - - -static void * -tf (void *a) -{ - pthread_cleanup_push (ch, (void *) 1l); - - pthread_cleanup_push (ch, (void *) 2l); - - pthread_cleanup_push (ch, (void *) 3l); - - pthread_exit ((void *) 1l); - - pthread_cleanup_pop (1); - - pthread_cleanup_pop (1); - - pthread_cleanup_pop (1); - - return NULL; -} - - -int -do_test (void) -{ - pthread_t th; - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - write_message ("create failed\n"); - _exit (1); - } - - void *r; - int e; - if ((e = pthread_join (th, &r)) != 0) - { - printf ("join failed: %d\n", e); - _exit (1); - } - - if (r != (void *) 1l) - { - puts ("thread not canceled"); - exit (1); - } - - if (global != 9) - { - printf ("global = %d, expected 9\n", global); - exit (1); - } - - return 0; -} diff --git a/nptl/tst-cleanupx0.c b/nptl/tst-cleanupx0.c deleted file mode 100644 index 0012ab1b25..0000000000 --- a/nptl/tst-cleanupx0.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cleanup0.c" diff --git a/nptl/tst-cleanupx0.expect b/nptl/tst-cleanupx0.expect deleted file mode 100644 index 4e3c581802..0000000000 --- a/nptl/tst-cleanupx0.expect +++ /dev/null @@ -1,3 +0,0 @@ -ch (3) -ch (2) -ch (1) diff --git a/nptl/tst-cleanupx1.c b/nptl/tst-cleanupx1.c deleted file mode 100644 index 21e9e58bd6..0000000000 --- a/nptl/tst-cleanupx1.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cleanup1.c" diff --git a/nptl/tst-cleanupx2.c b/nptl/tst-cleanupx2.c deleted file mode 100644 index 8b9e350935..0000000000 --- a/nptl/tst-cleanupx2.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cleanup2.c" diff --git a/nptl/tst-cleanupx3.c b/nptl/tst-cleanupx3.c deleted file mode 100644 index 90baf904f9..0000000000 --- a/nptl/tst-cleanupx3.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cleanup3.c" diff --git a/nptl/tst-clock1.c b/nptl/tst-clock1.c deleted file mode 100644 index 26ef56852d..0000000000 --- a/nptl/tst-clock1.c +++ /dev/null @@ -1,50 +0,0 @@ -/* Copyright (C) 2003-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <time.h> -#include <unistd.h> - - -int -do_test (void) -{ -#if defined _POSIX_THREAD_CPUTIME && _POSIX_THREAD_CPUTIME >= 0 - clockid_t cl; - /* This is really only a linking-test here. */ - int e = pthread_getcpuclockid (pthread_self (), &cl); - if (e != 0) - { -# if _POSIX_THREAD_CPUTIME == 0 - if (sysconf (_SC_THREAD_CPUTIME) >= 0) -# endif - { - puts ("cpuclock advertized, but cannot get ID"); - exit (1); - } - } -#endif - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cond22.c b/nptl/tst-cond22.c new file mode 100644 index 0000000000..64f19ea0a5 --- /dev/null +++ b/nptl/tst-cond22.c @@ -0,0 +1,162 @@ +#include <pthread.h> +#include <stdio.h> +#include <stdlib.h> + + +static pthread_barrier_t b; +static pthread_cond_t c = PTHREAD_COND_INITIALIZER; +static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; + + +static void +cl (void *arg) +{ + pthread_mutex_unlock (&m); +} + + +static void * +tf (void *arg) +{ + if (pthread_mutex_lock (&m) != 0) + { + printf ("%s: mutex_lock failed\n", __func__); + exit (1); + } + int e = pthread_barrier_wait (&b); + if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) + { + printf ("%s: barrier_wait failed\n", __func__); + exit (1); + } + pthread_cleanup_push (cl, NULL); + /* We have to loop here because the cancellation might come after + the cond_wait call left the cancelable area and is then waiting + on the mutex. In this case the beginning of the second cond_wait + call will cause the cancellation to happen. */ + do + if (pthread_cond_wait (&c, &m) != 0) + { + printf ("%s: cond_wait failed\n", __func__); + exit (1); + } + while (arg == NULL); + pthread_cleanup_pop (0); + if (pthread_mutex_unlock (&m) != 0) + { + printf ("%s: mutex_unlock failed\n", __func__); + exit (1); + } + return NULL; +} + + +static int +do_test (void) +{ + int status = 0; + + if (pthread_barrier_init (&b, NULL, 2) != 0) + { + puts ("barrier_init failed"); + return 1; + } + + pthread_t th; + if (pthread_create (&th, NULL, tf, NULL) != 0) + { + puts ("1st create failed"); + return 1; + } + int e = pthread_barrier_wait (&b); + if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) + { + puts ("1st barrier_wait failed"); + return 1; + } + if (pthread_mutex_lock (&m) != 0) + { + puts ("1st mutex_lock failed"); + return 1; + } + if (pthread_cond_signal (&c) != 0) + { + puts ("1st cond_signal failed"); + return 1; + } + if (pthread_cancel (th) != 0) + { + puts ("cancel failed"); + return 1; + } + if (pthread_mutex_unlock (&m) != 0) + { + puts ("1st mutex_unlock failed"); + return 1; + } + void *res; + if (pthread_join (th, &res) != 0) + { + puts ("1st join failed"); + return 1; + } + if (res != PTHREAD_CANCELED) + { + puts ("first thread not canceled"); + status = 1; + } + + printf ("cond = { %llu, %llu, %u/%u/%u, %u/%u/%u, %u, %u }\n", + c.__data.__wseq, c.__data.__g1_start, + c.__data.__g_signals[0], c.__data.__g_refs[0], c.__data.__g_size[0], + c.__data.__g_signals[1], c.__data.__g_refs[1], c.__data.__g_size[1], + c.__data.__g1_orig_size, c.__data.__wrefs); + + if (pthread_create (&th, NULL, tf, (void *) 1l) != 0) + { + puts ("2nd create failed"); + return 1; + } + e = pthread_barrier_wait (&b); + if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) + { + puts ("2nd barrier_wait failed"); + return 1; + } + if (pthread_mutex_lock (&m) != 0) + { + puts ("2nd mutex_lock failed"); + return 1; + } + if (pthread_cond_signal (&c) != 0) + { + puts ("2nd cond_signal failed"); + return 1; + } + if (pthread_mutex_unlock (&m) != 0) + { + puts ("2nd mutex_unlock failed"); + return 1; + } + if (pthread_join (th, &res) != 0) + { + puts ("2nd join failed"); + return 1; + } + if (res != NULL) + { + puts ("2nd thread canceled"); + status = 1; + } + + printf ("cond = { %llu, %llu, %u/%u/%u, %u/%u/%u, %u, %u }\n", + c.__data.__wseq, c.__data.__g1_start, + c.__data.__g_signals[0], c.__data.__g_refs[0], c.__data.__g_size[0], + c.__data.__g_signals[1], c.__data.__g_refs[1], c.__data.__g_size[1], + c.__data.__g1_orig_size, c.__data.__wrefs); + + return status; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/nptl/tst-cond26.c b/nptl/tst-cond26.c new file mode 100644 index 0000000000..e647da00c2 --- /dev/null +++ b/nptl/tst-cond26.c @@ -0,0 +1,77 @@ +/* Test unsupported/bad clocks passed to pthread_cond_clockwait. + + Copyright (C) 2019-2020 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 + <https://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <pthread.h> +#include <stdio.h> +#include <time.h> +#include <unistd.h> +#include <support/check.h> +#include <support/timespec.h> +#include <support/xthread.h> + +static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; +static pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; + +#define NOT_A_VALID_CLOCK 123456 + +static int +do_test (void) +{ + xpthread_mutex_lock (&mut); + + const struct timespec ts = make_timespec (0, 0); + + /* These clocks are meaningless to sem_clockwait. */ +#if defined(CLOCK_PROCESS_CPUTIME_ID) + TEST_COMPARE (pthread_cond_clockwait (&cond, &mut, + CLOCK_PROCESS_CPUTIME_ID, &ts), EINVAL); +#endif +#if defined(CLOCK_THREAD_CPUTIME_ID) + TEST_COMPARE (pthread_cond_clockwait (&cond, &mut, + CLOCK_THREAD_CPUTIME_ID, &ts), EINVAL); +#endif + + /* These clocks might be meaningful, but are currently unsupported + by pthread_cond_clockwait. */ +#if defined(CLOCK_REALTIME_COARSE) + TEST_COMPARE (pthread_cond_clockwait (&cond, &mut, + CLOCK_REALTIME_COARSE, &ts), EINVAL); +#endif +#if defined(CLOCK_MONOTONIC_RAW) + TEST_COMPARE (pthread_cond_clockwait (&cond, &mut, + CLOCK_MONOTONIC_RAW, &ts), EINVAL); +#endif +#if defined(CLOCK_MONOTONIC_COARSE) + TEST_COMPARE (pthread_cond_clockwait (&cond, &mut, + CLOCK_MONOTONIC_COARSE, &ts), EINVAL); +#endif +#if defined(CLOCK_BOOTTIME) + TEST_COMPARE (pthread_cond_clockwait (&cond, &mut, + CLOCK_BOOTTIME, &ts), EINVAL); +#endif + + /* This is a completely invalid clock. */ + TEST_COMPARE (pthread_cond_clockwait (&cond, &mut, + NOT_A_VALID_CLOCK, &ts), EINVAL); + + return 0; +} + +#include <support/test-driver.c> diff --git a/nptl/tst-create-detached.c b/nptl/tst-create-detached.c deleted file mode 100644 index cd79c68908..0000000000 --- a/nptl/tst-create-detached.c +++ /dev/null @@ -1,138 +0,0 @@ -/* Bug 20116: Test rapid creation of detached threads. - Copyright (C) 2017-2020 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; see the file COPYING.LIB. If - not, see <https://www.gnu.org/licenses/>. */ - -/* The goal of the test is to trigger a failure if the parent touches - any part of the thread descriptor after the detached thread has - exited. We test this by creating many detached threads with large - stacks. The stacks quickly fill the the stack cache and subsequent - threads will start to cause the thread stacks to be immediately - unmapped to satisfy the stack cache max. With the stacks being - unmapped the parent's read of any part of the thread descriptor will - trigger a segfault. That segfault is what we are trying to cause, - since any segfault is a defect in the implementation. */ - -#include <pthread.h> -#include <stdio.h> -#include <errno.h> -#include <unistd.h> -#include <stdbool.h> -#include <sys/resource.h> -#include <support/xthread.h> - -/* Number of threads to create. */ -enum { threads_to_create = 100000 }; - -/* Number of threads which should spawn other threads. */ -enum { creator_threads = 2 }; - -/* Counter of threads created so far. This is incremented by all the - running creator threads. */ -static unsigned threads_created; - -/* Thread callback which does nothing, so that the thread exits - immediatedly. */ -static void * -do_nothing (void *arg) -{ - return NULL; -} - -/* Attribute indicating that the thread should be created in a detached - fashion. */ -static pthread_attr_t detached; - -/* Barrier to synchronize initialization. */ -static pthread_barrier_t barrier; - -static void * -creator_thread (void *arg) -{ - int ret; - xpthread_barrier_wait (&barrier); - - while (true) - { - pthread_t thr; - /* Thread creation will fail if the kernel does not free old - threads quickly enough, so we do not report errors. */ - ret = pthread_create (&thr, &detached, do_nothing, NULL); - if (ret == 0 && __atomic_add_fetch (&threads_created, 1, __ATOMIC_SEQ_CST) - >= threads_to_create) - break; - } - - return NULL; -} - -static int -do_test (void) -{ - /* Limit the size of the process, so that memory allocation will - fail without impacting the entire system. */ - { - struct rlimit limit; - if (getrlimit (RLIMIT_AS, &limit) != 0) - { - printf ("FAIL: getrlimit (RLIMIT_AS) failed: %m\n"); - return 1; - } - /* This limit, 800MB, is just a heuristic. Any value can be - picked. */ - long target = 800 * 1024 * 1024; - if (limit.rlim_cur == RLIM_INFINITY || limit.rlim_cur > target) - { - limit.rlim_cur = target; - if (setrlimit (RLIMIT_AS, &limit) != 0) - { - printf ("FAIL: setrlimit (RLIMIT_AS) failed: %m\n"); - return 1; - } - } - } - - xpthread_attr_init (&detached); - - xpthread_attr_setdetachstate (&detached, PTHREAD_CREATE_DETACHED); - - /* A large thread stack seems beneficial for reproducing a race - condition in detached thread creation. The goal is to reach the - limit of the runtime thread stack cache such that the detached - thread's stack is unmapped after exit and causes a segfault when - the parent reads the thread descriptor data stored on the the - unmapped stack. */ - xpthread_attr_setstacksize (&detached, 16 * 1024 * 1024); - - xpthread_barrier_init (&barrier, NULL, creator_threads); - - pthread_t threads[creator_threads]; - - for (int i = 0; i < creator_threads; ++i) - threads[i] = xpthread_create (NULL, creator_thread, NULL); - - for (int i = 0; i < creator_threads; ++i) - xpthread_join (threads[i]); - - xpthread_attr_destroy (&detached); - - xpthread_barrier_destroy (&barrier); - - return 0; -} - -#define TIMEOUT 100 -#include <support/test-driver.c> diff --git a/nptl/tst-detach1.c b/nptl/tst-detach1.c deleted file mode 100644 index b45732d3c1..0000000000 --- a/nptl/tst-detach1.c +++ /dev/null @@ -1,55 +0,0 @@ -/* Copyright (C) 2003-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -static void * -tf (void *arg) -{ - return NULL; -} - - -static int -do_test (void) -{ - pthread_t th; - if (pthread_create (&th, NULL, tf, (void *) pthread_self ()) != 0) - { - puts ("create failed"); - exit (1); - } - - /* Give the child a chance to finish. */ - sleep (1); - - if (pthread_detach (th) != 0) - { - puts ("detach failed"); - exit (1); - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-eintr2.c b/nptl/tst-eintr2.c deleted file mode 100644 index 4f26ccad04..0000000000 --- a/nptl/tst-eintr2.c +++ /dev/null @@ -1,88 +0,0 @@ -/* Copyright (C) 2003-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/time.h> -#include <support/check.h> -#include <support/timespec.h> -#include <support/xtime.h> - -#include "eintr.c" - - -static pthread_mutex_t m1 = PTHREAD_MUTEX_INITIALIZER; -static pthread_mutex_t m2 = PTHREAD_MUTEX_INITIALIZER; - - -static void * -tf1 (void *arg) -{ - struct timespec ts = timespec_add (xclock_now (CLOCK_REALTIME), - make_timespec (10000, 0)); - - /* This call must never return. */ - int e = pthread_mutex_timedlock (&m1, &ts); - char buf[100]; - printf ("tf1: mutex_timedlock returned: %s\n", - strerror_r (e, buf, sizeof (buf))); - - exit (1); -} - - -static void * -tf2 (void *arg) -{ - while (1) - { - TEST_COMPARE (pthread_mutex_lock (&m2), 0); - TEST_COMPARE (pthread_mutex_unlock (&m2), 0); - - struct timespec ts = { .tv_sec = 0, .tv_nsec = 10000000 }; - nanosleep (&ts, NULL); - } - return NULL; -} - - -static int -do_test (void) -{ - TEST_COMPARE (pthread_mutex_lock (&m1), 0); - - setup_eintr (SIGUSR1, NULL); - - char buf[100]; - xpthread_create (NULL, tf1, NULL); - xpthread_create (NULL, tf2, NULL); - - delayed_exit (3); - /* This call must never return. */ - int e = pthread_mutex_lock (&m1); - printf ("main: mutex_lock returned: %s\n", - strerror_r (e, buf, sizeof (buf))); - - return 1; -} - -#include <support/test-driver.c> diff --git a/nptl/tst-eintr3.c b/nptl/tst-eintr3.c deleted file mode 100644 index 528ead1fc4..0000000000 --- a/nptl/tst-eintr3.c +++ /dev/null @@ -1,60 +0,0 @@ -/* Copyright (C) 2003-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <support/check.h> -#include <support/xthread.h> - -#include "eintr.c" - - -static void * -tf (void *arg) -{ - pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; - xpthread_mutex_lock (&m); - /* This call must not return. */ - xpthread_mutex_lock (&m); - - puts ("tf: mutex_lock returned"); - exit (1); -} - - -static int -do_test (void) -{ - pthread_t self = pthread_self (); - - setup_eintr (SIGUSR1, &self); - - pthread_t th = xpthread_create (NULL, tf, NULL); - - delayed_exit (1); - /* This call must never return. */ - xpthread_join (th); - puts ("error: pthread_join returned"); - return 1; -} - -#include <support/test-driver.c> diff --git a/nptl/tst-eintr4.c b/nptl/tst-eintr4.c deleted file mode 100644 index 14f3675519..0000000000 --- a/nptl/tst-eintr4.c +++ /dev/null @@ -1,48 +0,0 @@ -/* Copyright (C) 2003-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <support/check.h> -#include <support/xthread.h> - -#include "eintr.c" - - -static int -do_test (void) -{ - pthread_t self = pthread_self (); - - setup_eintr (SIGUSR1, &self); - - pthread_barrier_t b; - xpthread_barrier_init (&b, NULL, 2); - - delayed_exit (1); - /* This call must never return. */ - xpthread_barrier_wait (&b); - puts ("error: pthread_barrier_wait returned"); - return 1; -} - -#include <support/test-driver.c> diff --git a/nptl/tst-eintr5.c b/nptl/tst-eintr5.c deleted file mode 100644 index bc6c0fef53..0000000000 --- a/nptl/tst-eintr5.c +++ /dev/null @@ -1,63 +0,0 @@ -/* Copyright (C) 2003-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/time.h> -#include <support/check.h> -#include <support/timespec.h> -#include <support/xthread.h> -#include <support/xtime.h> - -#include "eintr.c" - - -static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; -static pthread_cond_t c = PTHREAD_COND_INITIALIZER; - - -static void * -tf (void *arg) -{ - struct timespec ts = timespec_add (xclock_now (CLOCK_REALTIME), - make_timespec (10000, 0)); - - /* This call must never return. */ - TEST_COMPARE (pthread_cond_timedwait (&c, &m, &ts), 0); - FAIL_EXIT1 ("pthread_cond_timedwait returned unexpectedly\n"); -} - - -static int -do_test (void) -{ - setup_eintr (SIGUSR1, NULL); - - xpthread_create (NULL, tf, NULL); - - delayed_exit (3); - /* This call must never return. */ - xpthread_cond_wait (&c, &m); - FAIL_RET ("error: pthread_cond_wait returned"); -} - -#include <support/test-driver.c> diff --git a/nptl/tst-exec1.c b/nptl/tst-exec1.c deleted file mode 100644 index 892107d4c7..0000000000 --- a/nptl/tst-exec1.c +++ /dev/null @@ -1,156 +0,0 @@ -/* Simple exec test, only a thread in the parent. - Copyright (C) 2002-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <paths.h> -#include <pthread.h> -#include <signal.h> -#include <spawn.h> -#include <stdbool.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/wait.h> -#include <support/xsignal.h> - - -static void * -tf (void *arg) -{ - pthread_t th = (pthread_t) arg; - - if (pthread_join (th, NULL) == 0) - { - puts ("thread in parent joined!?"); - exit (1); - } - - puts ("join in thread in parent returned!?"); - exit (1); -} - - -static int -do_test (void) -{ - int fd[2]; - if (pipe (fd) != 0) - { - puts ("pipe failed"); - exit (1); - } - - /* Not interested in knowing when the pipe is closed. */ - xsignal (SIGPIPE, SIG_IGN); - - posix_spawn_file_actions_t a; - if (posix_spawn_file_actions_init (&a) != 0) - { - puts ("spawn_file_actions_init failed"); - exit (1); - } - - if (posix_spawn_file_actions_adddup2 (&a, fd[1], STDOUT_FILENO) != 0) - { - puts ("spawn_file_actions_adddup2 failed"); - exit (1); - } - - if (posix_spawn_file_actions_addclose (&a, fd[0]) != 0) - { - puts ("spawn_file_actions_addclose"); - exit (1); - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, (void *) pthread_self ()) != 0) - { - puts ("create failed"); - exit (1); - } - - pid_t pid; - char *argv[] = { (char *) _PATH_BSHELL, (char *) "-c", (char *) "echo $$", - NULL }; - if (posix_spawn (&pid, _PATH_BSHELL, &a, NULL, argv, NULL) != 0) - { - puts ("spawn failed"); - exit (1); - } - - close (fd[1]); - - char buf[200]; - ssize_t n; - bool seen_pid = false; - while (TEMP_FAILURE_RETRY ((n = read (fd[0], buf, sizeof (buf)))) > 0) - { - /* We only expect to read the PID. */ - char *endp; - long int rpid = strtol (buf, &endp, 10); - - if (*endp != '\n') - { - printf ("didn't parse whole line: \"%s\"\n", buf); - exit (1); - } - if (endp == buf) - { - puts ("read empty line"); - exit (1); - } - - if (rpid != pid) - { - printf ("found \"%s\", expected PID %ld\n", buf, (long int) pid); - exit (1); - } - - if (seen_pid) - { - puts ("found more than one PID line"); - exit (1); - } - - seen_pid = true; - } - - close (fd[0]); - - int status; - int err = waitpid (pid, &status, 0); - if (err != pid) - { - puts ("waitpid failed"); - exit (1); - } - - if (!seen_pid) - { - puts ("didn't get PID"); - exit (1); - } - - puts ("read correct PID"); - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-exec2.c b/nptl/tst-exec2.c deleted file mode 100644 index f57903da1e..0000000000 --- a/nptl/tst-exec2.c +++ /dev/null @@ -1,151 +0,0 @@ -/* Thread with running thread calls exec. - Copyright (C) 2002-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <paths.h> -#include <pthread.h> -#include <signal.h> -#include <spawn.h> -#include <stdbool.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/wait.h> -#include <support/xsignal.h> - - -static void * -tf (void *arg) -{ - pthread_t th = (pthread_t) arg; - - if (pthread_join (th, NULL) == 0) - { - puts ("thread in parent joined!?"); - exit (1); - } - - puts ("join in thread in parent returned!?"); - exit (1); -} - - -static int -do_test (void) -{ - int fd[2]; - if (pipe (fd) != 0) - { - puts ("pipe failed"); - exit (1); - } - - /* Not interested in knowing when the pipe is closed. */ - xsignal (SIGPIPE, SIG_IGN); - - pid_t pid = fork (); - if (pid == -1) - { - puts ("fork failed"); - exit (1); - } - - if (pid == 0) - { - /* Use the fd for stdout. This is kind of ugly because it - substitutes the fd of stdout but we know what we are doing - here... */ - if (dup2 (fd[1], STDOUT_FILENO) != STDOUT_FILENO) - { - puts ("dup2 failed"); - exit (1); - } - - close (fd[0]); - - pthread_t th; - if (pthread_create (&th, NULL, tf, (void *) pthread_self ()) != 0) - { - puts ("create failed"); - exit (1); - } - - execl (_PATH_BSHELL, _PATH_BSHELL, "-c", "echo $$", NULL); - - puts ("execl failed"); - exit (1); - } - - close (fd[1]); - - char buf[200]; - ssize_t n; - bool seen_pid = false; - while (TEMP_FAILURE_RETRY ((n = read (fd[0], buf, sizeof (buf)))) > 0) - { - /* We only expect to read the PID. */ - char *endp; - long int rpid = strtol (buf, &endp, 10); - - if (*endp != '\n') - { - printf ("didn't parse whole line: \"%s\"\n", buf); - exit (1); - } - if (endp == buf) - { - puts ("read empty line"); - exit (1); - } - - if (rpid != pid) - { - printf ("found \"%s\", expected PID %ld\n", buf, (long int) pid); - exit (1); - } - - if (seen_pid) - { - puts ("found more than one PID line"); - exit (1); - } - seen_pid = true; - } - - close (fd[0]); - - int status; - int err = waitpid (pid, &status, 0); - if (err != pid) - { - puts ("waitpid failed"); - exit (1); - } - - if (!seen_pid) - { - puts ("didn't get PID"); - exit (1); - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-exec3.c b/nptl/tst-exec3.c deleted file mode 100644 index b849d3aef7..0000000000 --- a/nptl/tst-exec3.c +++ /dev/null @@ -1,149 +0,0 @@ -/* Thread calls exec. - Copyright (C) 2002-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <paths.h> -#include <pthread.h> -#include <signal.h> -#include <spawn.h> -#include <stdbool.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/wait.h> -#include <support/xsignal.h> - - -static void * -tf (void *arg) -{ - execl (_PATH_BSHELL, _PATH_BSHELL, "-c", "echo $$", NULL); - - puts ("execl failed"); - exit (1); -} - - -static int -do_test (void) -{ - int fd[2]; - if (pipe (fd) != 0) - { - puts ("pipe failed"); - exit (1); - } - - /* Not interested in knowing when the pipe is closed. */ - xsignal (SIGPIPE, SIG_IGN); - - pid_t pid = fork (); - if (pid == -1) - { - puts ("fork failed"); - exit (1); - } - - if (pid == 0) - { - /* Use the fd for stdout. This is kind of ugly because it - substitutes the fd of stdout but we know what we are doing - here... */ - if (dup2 (fd[1], STDOUT_FILENO) != STDOUT_FILENO) - { - puts ("dup2 failed"); - exit (1); - } - - close (fd[0]); - - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("create failed"); - exit (1); - } - - if (pthread_join (th, NULL) == 0) - { - puts ("join succeeded!?"); - exit (1); - } - - puts ("join returned!?"); - exit (1); - } - - close (fd[1]); - - char buf[200]; - ssize_t n; - bool seen_pid = false; - while (TEMP_FAILURE_RETRY ((n = read (fd[0], buf, sizeof (buf)))) > 0) - { - /* We only expect to read the PID. */ - char *endp; - long int rpid = strtol (buf, &endp, 10); - - if (*endp != '\n') - { - printf ("didn't parse whole line: \"%s\"\n", buf); - exit (1); - } - if (endp == buf) - { - puts ("read empty line"); - exit (1); - } - - if (rpid != pid) - { - printf ("found \"%s\", expected PID %ld\n", buf, (long int) pid); - exit (1); - } - - if (seen_pid) - { - puts ("found more than one PID line"); - exit (1); - } - seen_pid = true; - } - - close (fd[0]); - - int status; - int err = waitpid (pid, &status, 0); - if (err != pid) - { - puts ("waitpid failed"); - exit (1); - } - - if (!seen_pid) - { - puts ("didn't get PID"); - exit (1); - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-exit1.c b/nptl/tst-exit1.c deleted file mode 100644 index 4ecc3d4ac5..0000000000 --- a/nptl/tst-exit1.c +++ /dev/null @@ -1,78 +0,0 @@ -/* Copyright (C) 2002-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - 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 - <https://www.gnu.org/licenses/>. */ - -/* NOTE: this tests functionality beyond POSIX. POSIX does not allow - exit to be called more than once. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> - -static pthread_barrier_t b; - - -static void * -tf (void *arg) -{ - int r = pthread_barrier_wait (&b); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - exit (0); -} - - -static int -do_test (void) -{ - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - puts ("barrier_init failed"); - exit (1); - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("create failed"); - exit (1); - } - - int r = pthread_barrier_wait (&b); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - /* Do nothing. */ - if (pthread_join (th, NULL) == 0) - { - puts ("join succeeded!?"); - exit (1); - } - - puts ("join returned!?"); - exit (1); -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-exit2.c b/nptl/tst-exit2.c deleted file mode 100644 index 0b7a2caf6a..0000000000 --- a/nptl/tst-exit2.c +++ /dev/null @@ -1,42 +0,0 @@ -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" - -static void * -tf (void *arg) -{ - while (1) - sleep (100); - - /* NOTREACHED */ - return NULL; -} - - -static int -do_test (void) -{ - pthread_t th; - - int e = pthread_create (&th, NULL, tf, NULL); - if (e != 0) - { - printf ("create failed: %s\n", strerror (e)); - return 1; - } - - delayed_exit (1); - - /* Terminate only this thread. */ - pthread_exit (NULL); - - /* NOTREACHED */ - return 1; -} diff --git a/nptl/tst-exit3.c b/nptl/tst-exit3.c deleted file mode 100644 index 9481ed9b42..0000000000 --- a/nptl/tst-exit3.c +++ /dev/null @@ -1,83 +0,0 @@ -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" - -static pthread_barrier_t b; - - -static void * -tf2 (void *arg) -{ - while (1) - sleep (100); - - /* NOTREACHED */ - return NULL; -} - - -static void * -tf (void *arg) -{ - pthread_t th; - - int e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - e = pthread_create (&th, NULL, tf2, NULL); - if (e != 0) - { - printf ("create failed: %s\n", strerror (e)); - exit (1); - } - - /* Terminate only this thread. */ - return NULL; -} - - -static int -do_test (void) -{ - pthread_t th; - - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - puts ("barrier_init failed"); - exit (1); - } - - int e = pthread_create (&th, NULL, tf, NULL); - if (e != 0) - { - printf ("create failed: %s\n", strerror (e)); - exit (1); - } - - e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - delayed_exit (3); - - /* Terminate only this thread. */ - pthread_exit (NULL); - - /* NOTREACHED */ - return 1; -} diff --git a/nptl/tst-flock1.c b/nptl/tst-flock1.c deleted file mode 100644 index 65faf46150..0000000000 --- a/nptl/tst-flock1.c +++ /dev/null @@ -1,92 +0,0 @@ -/* Copyright (C) 2002-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/file.h> - - -static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; - -static int fd; - - -static void * -tf (void *arg) -{ - if (flock (fd, LOCK_SH | LOCK_NB) != 0) - { - puts ("second flock failed"); - exit (1); - } - - pthread_mutex_unlock (&lock); - - return NULL; -} - - -static int -do_test (void) -{ - char tmp[] = "/tmp/tst-flock1-XXXXXX"; - - fd = mkstemp (tmp); - if (fd == -1) - { - puts ("mkstemp failed"); - exit (1); - } - - unlink (tmp); - - write (fd, "foobar xyzzy", 12); - - if (flock (fd, LOCK_EX | LOCK_NB) != 0) - { - puts ("first flock failed"); - exit (1); - } - - pthread_mutex_lock (&lock); - - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("pthread_create failed"); - exit (1); - } - - pthread_mutex_lock (&lock); - - void *result; - if (pthread_join (th, &result) != 0) - { - puts ("pthread_join failed"); - exit (1); - } - - close (fd); - - return result != NULL; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-fork1.c b/nptl/tst-fork1.c deleted file mode 100644 index fe5e015a2a..0000000000 --- a/nptl/tst-fork1.c +++ /dev/null @@ -1,121 +0,0 @@ -/* Copyright (C) 2002-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Roland McGrath <roland@redhat.com>, 2002. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/wait.h> - -static void * -thread_function (void * arg) -{ - int i = (intptr_t) arg; - int status; - pid_t pid; - pid_t pid2; - - pid = fork (); - switch (pid) - { - case 0: - printf ("%ld for %d\n", (long int) getpid (), i); - struct timespec ts = { .tv_sec = 0, .tv_nsec = 100000000 * i }; - nanosleep (&ts, NULL); - _exit (i); - break; - case -1: - printf ("fork: %m\n"); - return (void *) 1l; - break; - } - - pid2 = TEMP_FAILURE_RETRY (waitpid (pid, &status, 0)); - if (pid2 != pid) - { - printf ("waitpid returned %ld, expected %ld\n", - (long int) pid2, (long int) pid); - return (void *) 1l; - } - - printf ("%ld with %d, expected %d\n", - (long int) pid, WEXITSTATUS (status), i); - - return WEXITSTATUS (status) == i ? NULL : (void *) 1l; -} - -#define N 5 -static const int t[N] = { 7, 6, 5, 4, 3 }; - -static int -do_test (void) -{ - pthread_t th[N]; - int i; - int result = 0; - pthread_attr_t at; - - if (pthread_attr_init (&at) != 0) - { - puts ("attr_init failed"); - return 1; - } - - if (pthread_attr_setstacksize (&at, 1 * 1024 * 1024) != 0) - { - puts ("attr_setstacksize failed"); - return 1; - } - - for (i = 0; i < N; ++i) - if (pthread_create (&th[i], NULL, thread_function, - (void *) (intptr_t) t[i]) != 0) - { - printf ("creation of thread %d failed\n", i); - exit (1); - } - - if (pthread_attr_destroy (&at) != 0) - { - puts ("attr_destroy failed"); - return 1; - } - - for (i = 0; i < N; ++i) - { - void *v; - if (pthread_join (th[i], &v) != 0) - { - printf ("join of thread %d failed\n", i); - result = 1; - } - else if (v != NULL) - { - printf ("join %d successful, but child failed\n", i); - result = 1; - } - else - printf ("join %d successful\n", i); - } - - return result; -} - -#include <support/test-driver.c> diff --git a/nptl/tst-fork2.c b/nptl/tst-fork2.c deleted file mode 100644 index bfebab3c92..0000000000 --- a/nptl/tst-fork2.c +++ /dev/null @@ -1,89 +0,0 @@ -/* Copyright (C) 2002-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Roland McGrath <roland@redhat.com>, 2002. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/wait.h> - - -static pid_t initial_pid; - - -static void * -tf (void *arg) -{ - if (getppid () != initial_pid) - { - printf ("getppid in thread returned %ld, expected %ld\n", - (long int) getppid (), (long int) initial_pid); - return (void *) -1; - } - - return NULL; -} - - -int -main (void) -{ - initial_pid = getpid (); - - pid_t child = fork (); - if (child == 0) - { - if (getppid () != initial_pid) - { - printf ("first getppid returned %ld, expected %ld\n", - (long int) getppid (), (long int) initial_pid); - exit (1); - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("pthread_create failed"); - exit (1); - } - - void *result; - if (pthread_join (th, &result) != 0) - { - puts ("pthread_join failed"); - exit (1); - } - - exit (result == NULL ? 0 : 1); - } - else if (child == -1) - { - puts ("initial fork failed"); - return 1; - } - - int status; - if (TEMP_FAILURE_RETRY (waitpid (child, &status, 0)) != child) - { - printf ("waitpid failed: %m\n"); - return 1; - } - - return status; -} diff --git a/nptl/tst-fork3.c b/nptl/tst-fork3.c deleted file mode 100644 index 2da4c39698..0000000000 --- a/nptl/tst-fork3.c +++ /dev/null @@ -1,108 +0,0 @@ -/* Copyright (C) 2002-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Roland McGrath <roland@redhat.com>, 2002. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/wait.h> - - -static pid_t initial_pid; - - -static void * -tf2 (void *arg) -{ - if (getppid () != initial_pid) - { - printf ("getppid in thread returned %ld, expected %ld\n", - (long int) getppid (), (long int) initial_pid); - return (void *) -1; - } - - return NULL; -} - - -static void * -tf1 (void *arg) -{ - pid_t child = fork (); - if (child == 0) - { - if (getppid () != initial_pid) - { - printf ("first getppid returned %ld, expected %ld\n", - (long int) getppid (), (long int) initial_pid); - exit (1); - } - - pthread_t th2; - if (pthread_create (&th2, NULL, tf2, NULL) != 0) - { - puts ("child: pthread_create failed"); - exit (1); - } - - void *result; - if (pthread_join (th2, &result) != 0) - { - puts ("pthread_join failed"); - exit (1); - } - - exit (result == NULL ? 0 : 1); - } - else if (child == -1) - { - puts ("initial fork failed"); - exit (1); - } - - int status; - if (TEMP_FAILURE_RETRY (waitpid (child, &status, 0)) != child) - { - printf ("waitpid failed: %m\n"); - exit (1); - } - - exit (status); -} - - -static int -do_test (void) -{ - initial_pid = getpid (); - - pthread_t th1; - if (pthread_create (&th1, NULL, tf1, NULL) != 0) - { - puts ("parent: pthread_create failed"); - exit (1); - } - - /* This call should never return. */ - pthread_join (th1, NULL); - - return 1; -} - -#include <support/test-driver.c> diff --git a/nptl/tst-fork4.c b/nptl/tst-fork4.c deleted file mode 100644 index 3efbb724f8..0000000000 --- a/nptl/tst-fork4.c +++ /dev/null @@ -1,64 +0,0 @@ -/* Test of fork updating child universe's pthread structures. - Copyright (C) 2003-2020 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 - <https://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <unistd.h> -#include <sys/types.h> -#include <sys/wait.h> -#include <string.h> - - -static int -do_test (void) -{ - pthread_t me = pthread_self (); - - pid_t pid = fork (); - - if (pid < 0) - { - printf ("fork: %m\n"); - return 1; - } - - if (pid == 0) - { - int err = pthread_kill (me, SIGTERM); - printf ("pthread_kill returned: %s\n", strerror (err)); - return 3; - } - - int status; - errno = 0; - if (wait (&status) != pid) - printf ("wait failed: %m\n"); - else if (WIFSIGNALED (status) && WTERMSIG (status) == SIGTERM) - { - printf ("child correctly died with SIGTERM\n"); - return 0; - } - else - printf ("child died with bad status %#x\n", status); - - return 1; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-getpid3.c b/nptl/tst-getpid3.c deleted file mode 100644 index f1e77f6b10..0000000000 --- a/nptl/tst-getpid3.c +++ /dev/null @@ -1,114 +0,0 @@ -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/wait.h> - - -static pid_t pid; - -static void * -pid_thread (void *arg) -{ - if (pid != getpid ()) - { - printf ("pid wrong in thread: should be %d, is %d\n", - (int) pid, (int) getpid ()); - return (void *) 1L; - } - - return NULL; -} - -static int -do_test (void) -{ - pid = getpid (); - - pthread_t thr; - int ret = pthread_create (&thr, NULL, pid_thread, NULL); - if (ret) - { - printf ("pthread_create failed: %d\n", ret); - return 1; - } - - void *thr_ret; - ret = pthread_join (thr, &thr_ret); - if (ret) - { - printf ("pthread_create failed: %d\n", ret); - return 1; - } - else if (thr_ret) - { - printf ("thread getpid failed\n"); - return 1; - } - - pid_t child = fork (); - if (child == -1) - { - printf ("fork failed: %m\n"); - return 1; - } - else if (child == 0) - { - if (pid == getpid ()) - { - puts ("pid did not change after fork"); - exit (1); - } - - pid = getpid (); - ret = pthread_create (&thr, NULL, pid_thread, NULL); - if (ret) - { - printf ("pthread_create failed: %d\n", ret); - return 1; - } - - ret = pthread_join (thr, &thr_ret); - if (ret) - { - printf ("pthread_create failed: %d\n", ret); - return 1; - } - else if (thr_ret) - { - printf ("thread getpid failed\n"); - return 1; - } - - return 0; - } - - int status; - if (TEMP_FAILURE_RETRY (waitpid (child, &status, 0)) != child) - { - puts ("waitpid failed"); - kill (child, SIGKILL); - return 1; - } - - if (!WIFEXITED (status)) - { - if (WIFSIGNALED (status)) - printf ("died from signal %s\n", strsignal (WTERMSIG (status))); - else - puts ("did not terminate correctly"); - return 1; - } - if (WEXITSTATUS (status) != 0) - { - printf ("exit code %d\n", WEXITSTATUS (status)); - return 1; - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-kill1.c b/nptl/tst-kill1.c deleted file mode 100644 index f49598cc83..0000000000 --- a/nptl/tst-kill1.c +++ /dev/null @@ -1,99 +0,0 @@ -/* Copyright (C) 2003-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> - - -static pthread_cond_t c = PTHREAD_COND_INITIALIZER; -static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; -static pthread_barrier_t b; - -static void * -tf (void *a) -{ - if (pthread_mutex_lock (&m) != 0) - { - puts ("child: mutex_lock failed"); - exit (1); - } - - int e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("child: barrier_wait failed"); - exit (1); - } - - /* This call should never return. */ - pthread_cond_wait (&c, &m); - - return NULL; -} - - -int -do_test (void) -{ - pthread_t th; - - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - puts ("barrier_init failed"); - exit (1); - } - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("create failed"); - exit (1); - } - - int e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - if (pthread_mutex_lock (&m) != 0) - { - puts ("mutex_lock failed"); - exit (1); - } - - /* Send the thread a signal which it doesn't catch and which will - cause the process to terminate. */ - if (pthread_kill (th, SIGUSR1) != 0) - { - puts ("kill failed"); - exit (1); - } - - /* This call should never return. */ - pthread_join (th, NULL); - - return 0; -} - - -#define EXPECTED_SIGNAL SIGUSR1 -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-kill2.c b/nptl/tst-kill2.c deleted file mode 100644 index a91cf33b44..0000000000 --- a/nptl/tst-kill2.c +++ /dev/null @@ -1,137 +0,0 @@ -/* Copyright (C) 2003-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <sys/time.h> - - -static pthread_cond_t c = PTHREAD_COND_INITIALIZER; -static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; -static pthread_barrier_t b; - -static void * -tf (void *a) -{ - /* Block SIGUSR1. */ - sigset_t ss; - - sigemptyset (&ss); - sigaddset (&ss, SIGUSR1); - if (pthread_sigmask (SIG_BLOCK, &ss, NULL) != 0) - { - puts ("child: sigmask failed"); - exit (1); - } - - if (pthread_mutex_lock (&m) != 0) - { - puts ("child: mutex_lock failed"); - exit (1); - } - - int e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("child: barrier_wait failed"); - exit (1); - } - - /* Compute timeout. */ - struct timeval tv; - (void) gettimeofday (&tv, NULL); - struct timespec ts; - TIMEVAL_TO_TIMESPEC (&tv, &ts); - /* Timeout: 1sec. */ - ts.tv_sec += 1; - - /* This call should never return. */ - if (pthread_cond_timedwait (&c, &m, &ts) != ETIMEDOUT) - { - puts ("cond_timedwait didn't time out"); - exit (1); - } - - return NULL; -} - - -int -do_test (void) -{ - pthread_t th; - - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - puts ("barrier_init failed"); - exit (1); - } - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("create failed"); - exit (1); - } - - int e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - if (pthread_mutex_lock (&m) != 0) - { - puts ("mutex_lock failed"); - exit (1); - } - - /* Send the thread a signal which it has blocked. */ - if (pthread_kill (th, SIGUSR1) != 0) - { - puts ("kill failed"); - exit (1); - } - - if (pthread_mutex_unlock (&m) != 0) - { - puts ("mutex_unlock failed"); - exit (1); - } - - void *r; - if (pthread_join (th, &r) != 0) - { - puts ("join failed"); - exit (1); - } - if (r != NULL) - { - puts ("return value wrong"); - exit (1); - } - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-kill3.c b/nptl/tst-kill3.c deleted file mode 100644 index f2dec0a305..0000000000 --- a/nptl/tst-kill3.c +++ /dev/null @@ -1,158 +0,0 @@ -/* Copyright (C) 2003-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/time.h> - - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" - -static pthread_cond_t c = PTHREAD_COND_INITIALIZER; -static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; -static pthread_barrier_t b; - - -static void -handler (int sig) -{ - write_message ("handler called\n"); - _exit (1); -} - - -static void * -tf (void *a) -{ - /* Block SIGUSR1. */ - sigset_t ss; - - sigemptyset (&ss); - sigaddset (&ss, SIGUSR1); - if (pthread_sigmask (SIG_BLOCK, &ss, NULL) != 0) - { - puts ("child: sigmask failed"); - exit (1); - } - - if (pthread_mutex_lock (&m) != 0) - { - puts ("child: mutex_lock failed"); - exit (1); - } - - int e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("child: barrier_wait failed"); - exit (1); - } - - /* Compute timeout. */ - struct timeval tv; - (void) gettimeofday (&tv, NULL); - struct timespec ts; - TIMEVAL_TO_TIMESPEC (&tv, &ts); - /* Timeout: 1sec. */ - ts.tv_sec += 1; - - /* This call should never return. */ - if (pthread_cond_timedwait (&c, &m, &ts) != ETIMEDOUT) - { - puts ("cond_timedwait didn't time out"); - exit (1); - } - - return NULL; -} - - -int -do_test (void) -{ - pthread_t th; - - struct sigaction sa; - sigemptyset (&sa.sa_mask); - sa.sa_flags = 0; - sa.sa_handler = handler; - if (sigaction (SIGUSR1, &sa, NULL) != 0) - { - puts ("sigaction failed"); - exit (1); - } - - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - puts ("barrier_init failed"); - exit (1); - } - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("create failed"); - exit (1); - } - - int e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - if (pthread_mutex_lock (&m) != 0) - { - puts ("mutex_lock failed"); - exit (1); - } - - /* Send the thread a signal which it has blocked. */ - if (pthread_kill (th, SIGUSR1) != 0) - { - puts ("kill failed"); - exit (1); - } - - if (pthread_mutex_unlock (&m) != 0) - { - puts ("mutex_unlock failed"); - exit (1); - } - - void *r; - if (pthread_join (th, &r) != 0) - { - puts ("join failed"); - exit (1); - } - if (r != NULL) - { - puts ("return value wrong"); - exit (1); - } - - return 0; -} diff --git a/nptl/tst-kill4.c b/nptl/tst-kill4.c deleted file mode 100644 index 916ea14820..0000000000 --- a/nptl/tst-kill4.c +++ /dev/null @@ -1,90 +0,0 @@ -/* Copyright (C) 2003-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -static void * -tf (void *a) -{ - return NULL; -} - - -int -do_test (void) -{ - pthread_attr_t at; - if (pthread_attr_init (&at) != 0) - { - puts ("attr_create failed"); - exit (1); - } - - /* Limit thread stack size, because if it is too large, pthread_join - will free it immediately rather than put it into stack cache. */ - if (pthread_attr_setstacksize (&at, 2 * 1024 * 1024) != 0) - { - puts ("setstacksize failed"); - exit (1); - } - - pthread_t th; - if (pthread_create (&th, &at, tf, NULL) != 0) - { - puts ("create failed"); - exit (1); - } - - pthread_attr_destroy (&at); - - if (pthread_join (th, NULL) != 0) - { - puts ("join failed"); - exit (1); - } - - /* The following only works because we assume here something about - the implementation. Namely, that the memory allocated for the - thread descriptor is not going away, that the TID field is - cleared and therefore the signal is sent to process 0, and that - we can savely assume there is no other process with this ID at - that time. */ - int e = pthread_kill (th, 0); - if (e == 0) - { - puts ("pthread_kill succeeded"); - exit (1); - } - if (e != ESRCH) - { - puts ("pthread_kill didn't return ESRCH"); - exit (1); - } - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-kill5.c b/nptl/tst-kill5.c deleted file mode 100644 index aefe3d6604..0000000000 --- a/nptl/tst-kill5.c +++ /dev/null @@ -1,49 +0,0 @@ -/* Copyright (C) 2003-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <limits.h> - - -int -do_test (void) -{ - /* XXX This test might require architecture and system specific changes. - There is no guarantee that this signal number is invalid. */ - int e = pthread_kill (pthread_self (), INT_MAX); - if (e == 0) - { - puts ("kill didn't failed"); - exit (1); - } - if (e != EINVAL) - { - puts ("error not EINVAL"); - exit (1); - } - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-kill6.c b/nptl/tst-kill6.c deleted file mode 100644 index eaec47ccdb..0000000000 --- a/nptl/tst-kill6.c +++ /dev/null @@ -1,162 +0,0 @@ -/* Copyright (C) 2003-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <semaphore.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" - -static pthread_t receiver; -static sem_t sem; -static pthread_barrier_t b; - -static void -handler (int sig) -{ - if (sig != SIGUSR1) - { - write_message ("wrong signal\n"); - _exit (1); - } - - if (pthread_self () != receiver) - { - write_message ("not the intended receiver\n"); - _exit (1); - } - - if (sem_post (&sem) != 0) - { - write_message ("sem_post failed\n"); - _exit (1); - } -} - - -static void * -tf (void *a) -{ - int e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("child: barrier_wait failed"); - exit (1); - } - - return NULL; -} - - -int -do_test (void) -{ - struct sigaction sa; - sigemptyset (&sa.sa_mask); - sa.sa_flags = 0; - sa.sa_handler = handler; - if (sigaction (SIGUSR1, &sa, NULL) != 0) - { - puts ("sigaction failed"); - exit (1); - } - -#define N 20 - - if (pthread_barrier_init (&b, NULL, N + 1) != 0) - { - puts ("barrier_init failed"); - exit (1); - } - - pthread_attr_t a; - - if (pthread_attr_init (&a) != 0) - { - puts ("attr_init failed"); - exit (1); - } - - if (pthread_attr_setstacksize (&a, 1 * 1024 * 1024) != 0) - { - puts ("attr_setstacksize failed"); - return 1; - } - - pthread_t th[N]; - int i; - for (i = 0; i < N; ++i) - if (pthread_create (&th[i], &a, tf, NULL) != 0) - { - puts ("create failed"); - exit (1); - } - - if (pthread_attr_destroy (&a) != 0) - { - puts ("attr_destroy failed"); - exit (1); - } - - if (sem_init (&sem, 0, 0) != 0) - { - puts ("sem_init failed"); - exit (1); - } - - for (i = 0; i < N * 10; ++i) - { - receiver = th[i % N]; - - if (pthread_kill (receiver, SIGUSR1) != 0) - { - puts ("kill failed"); - exit (1); - } - - if (TEMP_FAILURE_RETRY (sem_wait (&sem)) != 0) - { - puts ("sem_wait failed"); - exit (1); - } - } - - int e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - for (i = 0; i < N; ++i) - if (pthread_join (th[i], NULL) != 0) - { - puts ("join failed"); - exit (1); - } - - return 0; -} diff --git a/nptl/tst-locale1.c b/nptl/tst-locale1.c deleted file mode 100644 index 887b9a6dd7..0000000000 --- a/nptl/tst-locale1.c +++ /dev/null @@ -1,22 +0,0 @@ -/* Test that the thread-local locale works right in the main thread - when statically linked. */ - -#include "../locale/tst-C-locale.c" - -#include <pthread.h> -#include <signal.h> - -/* This is never called, just here to get pthreads linked in. */ -int -useless (void) -{ - pthread_t th; - pthread_create (&th, 0, (void *(*) (void *)) useless, 0); - int result = 0; -#ifdef SIGRTMIN - /* This is to check __libc_current_sigrt* can be used in statically - linked apps. */ - result = SIGRTMIN; -#endif - return result; -} diff --git a/nptl/tst-locale2.c b/nptl/tst-locale2.c deleted file mode 100644 index a238209f87..0000000000 --- a/nptl/tst-locale2.c +++ /dev/null @@ -1,15 +0,0 @@ -/* Test that the thread-local locale works right in the main thread - when statically linked. */ - -#include "../argp/tst-argp1.c" - -#include <pthread.h> - -/* This is never called, just here to get pthreads linked in. */ -void * -useless (void *a) -{ - pthread_t th; - pthread_create (&th, 0, useless, a); - return NULL; -} diff --git a/nptl/tst-memstream.c b/nptl/tst-memstream.c deleted file mode 100644 index 4e8d86cb8b..0000000000 --- a/nptl/tst-memstream.c +++ /dev/null @@ -1,101 +0,0 @@ -/* Test for open_memstream locking. - Copyright (C) 2017-2020 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 - <https://www.gnu.org/licenses/>. */ - -/* This test checks if concurrent writes to a FILE created with - open_memstream are correctly interleaved without loss or corruption - of data. Large number of concurrent fputc operations are used - and in the end the bytes written to the memstream buffer are - counted to see if they all got recorded. - - This is a regression test to see if the single threaded stdio - optimization broke multi-threaded open_memstream usage. */ - -#include <pthread.h> -#include <stdio.h> -#include <support/check.h> -#include <support/xthread.h> - -enum -{ - thread_count = 2, - byte_count = 1000000, -}; - -struct closure -{ - FILE *fp; - char b; -}; - -static void * -thread_func (void *closure) -{ - struct closure *args = closure; - - for (int i = 0; i < byte_count; ++i) - fputc (args->b, args->fp); - - return NULL; -} - -int -do_test (void) -{ - char *buffer = NULL; - size_t buffer_length = 0; - FILE *fp = open_memstream (&buffer, &buffer_length); - if (fp == NULL) - FAIL_RET ("open_memstream: %m"); - - pthread_t threads[thread_count]; - struct closure args[thread_count]; - - for (int i = 0; i < thread_count; ++i) - { - args[i].fp = fp; - args[i].b = 'A' + i; - threads[i] = xpthread_create (NULL, thread_func, args + i); - } - - for (int i = 0; i < thread_count; ++i) - xpthread_join (threads[i]); - - fclose (fp); - - if (buffer_length != thread_count * byte_count) - FAIL_RET ("unexpected number of written bytes: %zu (should be %d)", - buffer_length, thread_count * byte_count); - - /* Verify that each thread written its unique character byte_count times. */ - size_t counts[thread_count] = { 0, }; - for (size_t i = 0; i < buffer_length; ++i) - { - if (buffer[i] < 'A' || buffer[i] >= 'A' + thread_count) - FAIL_RET ("written byte at %zu out of range: %d", i, buffer[i] & 0xFF); - ++counts[buffer[i] - 'A']; - } - for (int i = 0; i < thread_count; ++i) - if (counts[i] != byte_count) - FAIL_RET ("incorrect write count for thread %d: %zu (should be %d)", i, - counts[i], byte_count); - - return 0; -} - -#define TIMEOUT 100 -#include <support/test-driver.c> diff --git a/nptl/tst-popen1.c b/nptl/tst-popen1.c deleted file mode 100644 index 0726447be1..0000000000 --- a/nptl/tst-popen1.c +++ /dev/null @@ -1,59 +0,0 @@ -/* Copyright (C) 2003-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <error.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -static void * -dummy (void *x) -{ - return NULL; -} - -static char buf[sizeof "something\n"]; - -static int -do_test (void) -{ - FILE *f; - pthread_t p; - int err; - - f = popen ("echo something", "r"); - if (f == NULL) - error (EXIT_FAILURE, errno, "popen failed"); - if (fgets (buf, sizeof (buf), f) == NULL) - error (EXIT_FAILURE, 0, "fgets failed"); - if (strcmp (buf, "something\n")) - error (EXIT_FAILURE, 0, "read wrong data"); - if (pclose (f)) - error (EXIT_FAILURE, errno, "pclose returned non-zero"); - if ((err = pthread_create (&p, NULL, dummy, NULL))) - error (EXIT_FAILURE, err, "pthread_create failed"); - if ((err = pthread_join (p, NULL))) - error (EXIT_FAILURE, err, "pthread_join failed"); - exit (0); -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-raise1.c b/nptl/tst-raise1.c deleted file mode 100644 index f015cf3ff6..0000000000 --- a/nptl/tst-raise1.c +++ /dev/null @@ -1,61 +0,0 @@ -/* Copyright (C) 2003-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <error.h> -#include <signal.h> -#include <stdlib.h> -#include <stdio.h> - -volatile int count; - -void -sh (int sig) -{ - ++count; -} - -int -main (void) -{ - struct sigaction sa; - sa.sa_handler = sh; - sigemptyset (&sa.sa_mask); - sa.sa_flags = 0; - if (sigaction (SIGUSR1, &sa, NULL) < 0) - { - printf ("sigaction failed: %m\n"); - exit (1); - } - if (raise (SIGUSR1) < 0) - { - printf ("first raise failed: %m\n"); - exit (1); - } - if (raise (SIGUSR1) < 0) - { - printf ("second raise failed: %m\n"); - exit (1); - } - if (count != 2) - { - printf ("signal handler not called 2 times\n"); - exit (1); - } - exit (0); -} diff --git a/nptl/tst-setuid3.c b/nptl/tst-setuid3.c deleted file mode 100644 index 261c265664..0000000000 --- a/nptl/tst-setuid3.c +++ /dev/null @@ -1,118 +0,0 @@ -/* Copyright (C) 2014-2020 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 - <https://www.gnu.org/licenses/>. */ - -#include <stdio.h> -#include <errno.h> -#include <pthread.h> -#include <stdbool.h> -#include <unistd.h> - -/* The test must run under a non-privileged user ID. */ -static const uid_t test_uid = 1; - -static pthread_barrier_t barrier1; -static pthread_barrier_t barrier2; - -#define FAIL(fmt, ...) \ - do { printf ("FAIL: " fmt "\n", __VA_ARGS__); _exit (1); } while (0) - -#define FAIL_ERR(fmt, ...) \ - do { printf ("FAIL: " fmt ": %m\n", __VA_ARGS__); _exit (1); } while (0) - -/* True if x is not a successful return code from pthread_barrier_wait. */ -static inline bool -is_invalid_barrier_ret (int x) -{ - return x != 0 && x != PTHREAD_BARRIER_SERIAL_THREAD; -} - -static void * -thread_func (void *ctx __attribute__ ((unused))) -{ - int ret = pthread_barrier_wait (&barrier1); - if (is_invalid_barrier_ret (ret)) - FAIL ("pthread_barrier_wait (barrier1) (on thread): %d", ret); - ret = pthread_barrier_wait (&barrier2); - if (is_invalid_barrier_ret (ret)) - FAIL ("pthread_barrier_wait (barrier2) (on thread): %d", ret); - return NULL; -} - -static void -setuid_failure (int phase) -{ - int ret = setuid (0); - switch (ret) - { - case 0: - FAIL ("setuid succeeded unexpectedly in phase %d", phase); - case -1: - if (errno != EPERM) - FAIL_ERR ("setuid phase %d", phase); - break; - default: - FAIL ("invalid setuid return value in phase %d: %d", phase, ret); - } -} - -static int -do_test (void) -{ - if (getuid () == 0) - if (setuid (test_uid) != 0) - FAIL_ERR ("setuid (%u)", (unsigned) test_uid); - if (setuid (getuid ())) - FAIL_ERR ("setuid (%s)", "getuid ()"); - setuid_failure (1); - - int ret = pthread_barrier_init (&barrier1, NULL, 2); - if (ret != 0) - FAIL ("pthread_barrier_init (barrier1): %d", ret); - ret = pthread_barrier_init (&barrier2, NULL, 2); - if (ret != 0) - FAIL ("pthread_barrier_init (barrier2): %d", ret); - - pthread_t thread; - ret = pthread_create (&thread, NULL, thread_func, NULL); - if (ret != 0) - FAIL ("pthread_create: %d", ret); - - /* Ensure that the thread is running properly. */ - ret = pthread_barrier_wait (&barrier1); - if (is_invalid_barrier_ret (ret)) - FAIL ("pthread_barrier_wait (barrier1): %d", ret); - - setuid_failure (2); - - /* Check success case. */ - if (setuid (getuid ()) != 0) - FAIL_ERR ("setuid (%s)", "getuid ()"); - - /* Shutdown. */ - ret = pthread_barrier_wait (&barrier2); - if (is_invalid_barrier_ret (ret)) - FAIL ("pthread_barrier_wait (barrier2): %d", ret); - - ret = pthread_join (thread, NULL); - if (ret != 0) - FAIL ("pthread_join: %d", ret); - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-signal4.c b/nptl/tst-signal4.c deleted file mode 100644 index e6e837a912..0000000000 --- a/nptl/tst-signal4.c +++ /dev/null @@ -1,59 +0,0 @@ -/* Copyright (C) 2003-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> - -static int -do_test (void) -{ - sigset_t ss; - - sigemptyset (&ss); - - int i; - for (i = 0; i < 10000; ++i) - { - long int r = random (); - - if (r != SIG_BLOCK && r != SIG_SETMASK && r != SIG_UNBLOCK) - { - int e = pthread_sigmask (r, &ss, NULL); - - if (e == 0) - { - printf ("pthread_sigmask succeeded for how = %ld\n", r); - exit (1); - } - - if (e != EINVAL) - { - puts ("pthread_sigmask didn't return EINVAL"); - exit (1); - } - } - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-signal5.c b/nptl/tst-signal5.c deleted file mode 100644 index 114bf060bc..0000000000 --- a/nptl/tst-signal5.c +++ /dev/null @@ -1,110 +0,0 @@ -/* Copyright (C) 2003-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/mman.h> -#include <sys/wait.h> - - -static sigset_t ss; - - -static void * -tf (void *arg) -{ - sigset_t ss2; - if (pthread_sigmask (SIG_SETMASK, NULL, &ss2) != 0) - { - puts ("child: sigmask failed"); - exit (1); - } - - int i; - for (i = 1; i < 32; ++i) - if (sigismember (&ss, i) && ! sigismember (&ss2, i)) - { - printf ("signal %d set in parent mask, but not in child\n", i); - exit (1); - } - else if (! sigismember (&ss, i) && sigismember (&ss2, i)) - { - printf ("signal %d set in child mask, but not in parent\n", i); - exit (1); - } - - return NULL; -} - - -static int -do_test (void) -{ - sigemptyset (&ss); - sigaddset (&ss, SIGUSR1); - if (pthread_sigmask (SIG_SETMASK, &ss, NULL) != 0) - { - puts ("1st sigmask failed"); - exit (1); - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("1st create failed"); - exit (1); - } - - void *r; - if (pthread_join (th, &r) != 0) - { - puts ("1st join failed"); - exit (1); - } - - sigemptyset (&ss); - sigaddset (&ss, SIGUSR2); - sigaddset (&ss, SIGFPE); - if (pthread_sigmask (SIG_SETMASK, &ss, NULL) != 0) - { - puts ("2nd sigmask failed"); - exit (1); - } - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("2nd create failed"); - exit (1); - } - - if (pthread_join (th, &r) != 0) - { - puts ("2nd join failed"); - exit (1); - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-signal6.c b/nptl/tst-signal6.c deleted file mode 100644 index fcf703127b..0000000000 --- a/nptl/tst-signal6.c +++ /dev/null @@ -1,197 +0,0 @@ -/* Copyright (C) 2003-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <signal.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -#ifdef SIGRTMIN - -# define N 2 -static pthread_barrier_t bar; -static struct -{ - void *p; - pthread_t s; -} ti[N]; -static int sig1; - - -static void -handler (int sig) -{ - pthread_t self = pthread_self (); - size_t i; - - for (i = 0; i < N; ++i) - if (ti[i].s == self) - { - if ((uintptr_t) ti[i].p <= (uintptr_t) &self - && (uintptr_t) ti[i].p + 2 * MINSIGSTKSZ > (uintptr_t) &self) - { - puts ("alt stack not used"); - exit (1); - } - - printf ("thread %zu used alt stack for signal %d\n", i, sig); - - return; - } - - puts ("handler: thread not found"); - exit (1); -} - - -static void * -tf (void *arg) -{ - size_t nr = (uintptr_t) arg; - if (nr >= N) - { - puts ("wrong nr parameter"); - exit (1); - } - - sigset_t ss; - sigemptyset (&ss); - size_t i; - for (i = 0; i < N; ++i) - if (i != nr) - if (sigaddset (&ss, sig1 + i) != 0) - { - puts ("tf: sigaddset failed"); - exit (1); - } - if (pthread_sigmask (SIG_BLOCK, &ss, NULL) != 0) - { - puts ("tf: sigmask failed"); - exit (1); - } - - void *p = malloc (2 * MINSIGSTKSZ); - if (p == NULL) - { - puts ("tf: malloc failed"); - exit (1); - } - - stack_t s; - s.ss_sp = p; - s.ss_size = 2 * MINSIGSTKSZ; - s.ss_flags = 0; - if (sigaltstack (&s, NULL) != 0) - { - puts ("tf: sigaltstack failed"); - exit (1); - } - - ti[nr].p = p; - ti[nr].s = pthread_self (); - - pthread_barrier_wait (&bar); - - pthread_barrier_wait (&bar); - - return NULL; -} - - -static int -do_test (void) -{ - sig1 = SIGRTMIN; - if (sig1 + N > SIGRTMAX) - { - puts ("too few RT signals"); - return 0; - } - - struct sigaction sa; - sa.sa_handler = handler; - sa.sa_flags = 0; - sigemptyset (&sa.sa_mask); - - if (sigaction (sig1, &sa, NULL) != 0 - || sigaction (sig1 + 1, &sa, NULL) != 0 - || sigaction (sig1 + 2, &sa, NULL) != 0) - { - puts ("sigaction failed"); - return 1; - } - - if (pthread_barrier_init (&bar, NULL, 1 + N) != 0) - { - puts ("barrier_init failed"); - return 1; - } - - pthread_t th[N]; - size_t i; - for (i = 0; i < N; ++i) - if (pthread_create (&th[i], NULL, tf, (void *) (long int) i) != 0) - { - puts ("create failed"); - return 1; - } - - /* Block the three signals. */ - sigset_t ss; - sigemptyset (&ss); - for (i = 0; i <= N; ++i) - sigaddset (&ss, sig1 + i); - if (pthread_sigmask (SIG_BLOCK, &ss, NULL) != 0) - { - puts ("main: sigmask failed"); - return 1; - } - - pthread_barrier_wait (&bar); - - /* Send some signals. */ - pid_t me = getpid (); - kill (me, sig1 + N); - for (i = 0; i < N; ++i) - kill (me, sig1 + i); - kill (me, sig1 + N); - - /* Give the signals a chance to be worked on. */ - sleep (1); - - pthread_barrier_wait (&bar); - - for (i = 0; i < N; ++i) - if (pthread_join (th[i], NULL) != 0) - { - puts ("join failed"); - return 1; - } - - return 0; -} - -# define TEST_FUNCTION do_test () - -#else -# define TEST_FUNCTION 0 -#endif -#include "../test-skeleton.c" diff --git a/nptl/tst-signal8.c b/nptl/tst-signal8.c deleted file mode 100644 index 9da7e5ef07..0000000000 --- a/nptl/tst-signal8.c +++ /dev/null @@ -1,62 +0,0 @@ -/* Tests for sigisemptyset and pthread_sigmask. - Copyright (C) 2020 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 - <https://www.gnu.org/licenses/>. */ - -#include <signal.h> - -#include <support/check.h> -#include <support/xthread.h> - -static void * -tf (void *arg) -{ - { - sigset_t set; - sigemptyset (&set); - TEST_COMPARE (pthread_sigmask (SIG_BLOCK, 0, &set), 0); - TEST_COMPARE (sigisemptyset (&set), 1); - } - - { - sigset_t set; - sigfillset (&set); - TEST_COMPARE (pthread_sigmask (SIG_BLOCK, 0, &set), 0); - TEST_COMPARE (sigisemptyset (&set), 1); - } - - return NULL; -} - -static int -do_test (void) -{ - /* Ensure current SIG_BLOCK mask empty. */ - { - sigset_t set; - sigemptyset (&set); - TEST_COMPARE (sigprocmask (SIG_BLOCK, &set, 0), 0); - } - - { - pthread_t thr = xpthread_create (NULL, tf, NULL); - xpthread_join (thr); - } - - return 0; -} - -#include <support/test-driver.c> diff --git a/nptl/tst-stack1.c b/nptl/tst-stack1.c deleted file mode 100644 index e9d795c71f..0000000000 --- a/nptl/tst-stack1.c +++ /dev/null @@ -1,145 +0,0 @@ -/* Copyright (C) 2002-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <limits.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <sys/param.h> -#include <unistd.h> - - -static void *stack; -static size_t size; - - -static void * -tf (void *a) -{ - int result = 0; - - puts ("child start"); - - pthread_attr_t attr; - if (pthread_getattr_np (pthread_self (), &attr) != 0) - { - puts ("getattr_np failed"); - exit (1); - } - - size_t test_size; - void *test_stack; - if (pthread_attr_getstack (&attr, &test_stack, &test_size) != 0) - { - puts ("attr_getstack failed"); - exit (1); - } - - if (test_size != size) - { - printf ("child: reported size differs: is %zu, expected %zu\n", - test_size, size); - result = 1; - } - - if (test_stack != stack) - { - printf ("child: reported stack address differs: is %p, expected %p\n", - test_stack, stack); - result = 1; - } - - puts ("child OK"); - - return result ? (void *) 1l : NULL; -} - - -int -do_test (void) -{ - int result = 0; - - size = MAX (4 * getpagesize (), PTHREAD_STACK_MIN); - if (posix_memalign (&stack, getpagesize (), size) != 0) - { - puts ("out of memory while allocating the stack memory"); - exit (1); - } - - pthread_attr_t attr; - if (pthread_attr_init (&attr) != 0) - { - puts ("attr_init failed"); - exit (1); - } - - puts ("attr_setstack"); - if (pthread_attr_setstack (&attr, stack, size) != 0) - { - puts ("attr_setstack failed"); - exit (1); - } - - size_t test_size; - void *test_stack; - puts ("attr_getstack"); - if (pthread_attr_getstack (&attr, &test_stack, &test_size) != 0) - { - puts ("attr_getstack failed"); - exit (1); - } - - if (test_size != size) - { - printf ("reported size differs: is %zu, expected %zu\n", - test_size, size); - result = 1; - } - - if (test_stack != stack) - { - printf ("reported stack address differs: is %p, expected %p\n", - test_stack, stack); - result = 1; - } - - puts ("create"); - - pthread_t th; - if (pthread_create (&th, &attr, tf, NULL) != 0) - { - puts ("failed to create thread"); - exit (1); - } - - void *status; - if (pthread_join (th, &status) != 0) - { - puts ("join failed"); - exit (1); - } - - result |= status != NULL; - - return result; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-stdio1.c b/nptl/tst-stdio1.c deleted file mode 100644 index 66696a92ee..0000000000 --- a/nptl/tst-stdio1.c +++ /dev/null @@ -1,56 +0,0 @@ -/* Copyright (C) 2002-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <unistd.h> - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" - -static void *tf (void *a) -{ - flockfile (stdout); - /* This call should never return. */ - return a; -} - - -int -do_test (void) -{ - pthread_t th; - - flockfile (stdout); - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - write_message ("create failed\n"); - _exit (1); - } - - delayed_exit (1); - xpthread_join (th); - - puts ("join returned"); - - return 1; -} diff --git a/nptl/tst-stdio2.c b/nptl/tst-stdio2.c deleted file mode 100644 index 343b34ce83..0000000000 --- a/nptl/tst-stdio2.c +++ /dev/null @@ -1,82 +0,0 @@ -/* Copyright (C) 2002-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" - -static void *tf (void *a) -{ - puts ("start tf"); - - /* Multiple locking, implicitly or explicitly, must be possible. */ - flockfile (stdout); - - puts ("after first flockfile"); - - flockfile (stdout); - - puts ("foo"); - - funlockfile (stdout); - - puts ("after first funlockfile"); - - funlockfile (stdout); - - puts ("all done"); - - return a; -} - - -int -do_test (void) -{ - pthread_t th; - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - write_message ("create failed\n"); - _exit (1); - } - - void *result; - if (pthread_join (th, &result) != 0) - { - puts ("join failed"); - exit (1); - } - else if (result != NULL) - { - printf ("wrong return value: %p, expected %p\n", result, NULL); - exit (1); - } - - puts ("join returned succsefully"); - - return 0; -} diff --git a/nptl/tst-sysconf.c b/nptl/tst-sysconf.c deleted file mode 100644 index 6c5305b420..0000000000 --- a/nptl/tst-sysconf.c +++ /dev/null @@ -1,47 +0,0 @@ -/* Copyright (C) 2002-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <unistd.h> - - -static int -do_test (void) -{ - puts ("We expect no limits"); - /* We have no fixed limit on the number of threads. Make sure the - headers tell the right story. */ -#ifdef PTHREAD_THREADS_MAX - printf ("Header report maximum number of threads = %lu\n", - (unsigned long int) PTHREAD_THREADS_MAX); - return 1; -#else - long int r = sysconf (_SC_THREAD_THREADS_MAX); - if (r != -1) - { - printf ("sysconf(_SC_THREAD_THREADS_MAX) return %ld\n", r); - return 1; - } -#endif - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-tls1.c b/nptl/tst-tls1.c deleted file mode 100644 index 727610bc0a..0000000000 --- a/nptl/tst-tls1.c +++ /dev/null @@ -1,119 +0,0 @@ -/* Copyright (C) 2003-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <stdint.h> -#include <inttypes.h> -#include <support/support.h> -#include <support/check.h> -#include <support/xthread.h> - -struct test_s -{ - __attribute__ ((aligned(0x20))) int a; - __attribute__ ((aligned(0x200))) int b; -}; - -#define INIT_A 1 -#define INIT_B 42 -/* Deliberately not static. */ -__thread struct test_s s __attribute__ ((tls_model ("initial-exec"))) = -{ - .a = INIT_A, - .b = INIT_B -}; - -/* Use noinline in combination with not static to ensure that the - alignment check is really done. Otherwise it was optimized out! */ -__attribute__ ((noinline)) void -check_alignment (const char *thr_name, const char *ptr_name, - int *ptr, int alignment) -{ - uintptr_t offset_aligment = ((uintptr_t) ptr) & (alignment - 1); - if (offset_aligment) - { - FAIL_EXIT1 ("%s (%p) is not 0x%x-byte aligned in %s thread\n", - ptr_name, ptr, alignment, thr_name); - } -} - -static void -check_s (const char *thr_name) -{ - if (s.a != INIT_A || s.b != INIT_B) - FAIL_EXIT1 ("initial value of s in %s thread wrong\n", thr_name); - - check_alignment (thr_name, "s.a", &s.a, 0x20); - check_alignment (thr_name, "s.b", &s.b, 0x200); -} - -static void * -tf (void *arg) -{ - check_s ("child"); - - ++s.a; - - return NULL; -} - - -int -do_test (void) -{ - check_s ("main"); - - pthread_attr_t a; - - xpthread_attr_init (&a); - -#define STACK_SIZE (1 * 1024 * 1024) - xpthread_attr_setstacksize (&a, STACK_SIZE); - -#define N 10 - int i; - for (i = 0; i < N; ++i) - { -#define M 10 - pthread_t th[M]; - int j; - for (j = 0; j < M; ++j, ++s.a) - th[j] = xpthread_create (&a, tf, NULL); - - for (j = 0; j < M; ++j) - xpthread_join (th[j]); - } - - /* Also check the alignment of the tls variables if a misaligned stack is - specified. */ - pthread_t th; - void *thr_stack = NULL; - thr_stack = xposix_memalign (0x200, STACK_SIZE + 1); - xpthread_attr_setstack (&a, thr_stack + 1, STACK_SIZE); - th = xpthread_create (&a, tf, NULL); - xpthread_join (th); - free (thr_stack); - - xpthread_attr_destroy (&a); - - return 0; -} - -#include <support/test-driver.c> diff --git a/nptl/tst-tls2.c b/nptl/tst-tls2.c deleted file mode 100644 index f319707f86..0000000000 --- a/nptl/tst-tls2.c +++ /dev/null @@ -1,206 +0,0 @@ -/* Copyright (C) 2003-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <signal.h> -#include <semaphore.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -#define N 10 -static pthread_t th[N]; - - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" - -#define CB(n) \ -static void \ -cb##n (void) \ -{ \ - if (th[n] != pthread_self ()) \ - { \ - write_message ("wrong callback\n"); \ - _exit (1); \ - } \ -} -CB (0) -CB (1) -CB (2) -CB (3) -CB (4) -CB (5) -CB (6) -CB (7) -CB (8) -CB (9) -static void (*cbs[]) (void) = -{ - cb0, cb1, cb2, cb3, cb4, cb5, cb6, cb7, cb8, cb9 -}; - - -static __thread void (*fp) (void) __attribute__ ((tls_model ("local-exec"))); - - -static sem_t s; - - -#define THE_SIG SIGUSR1 -static void -handler (int sig) -{ - if (sig != THE_SIG) - { - write_message ("wrong signal\n"); - _exit (1); - } - - fp (); - - if (sem_post (&s) != 0) - { - write_message ("sem_post failed\n"); - _exit (1); - } -} - - -static pthread_barrier_t b; - -#define TOTAL_SIGS 1000 -static int nsigs; - - -static void * -tf (void *arg) -{ - fp = arg; - - pthread_barrier_wait (&b); - - pthread_barrier_wait (&b); - - if (nsigs != TOTAL_SIGS) - { - puts ("barrier_wait prematurely returns"); - exit (1); - } - - return NULL; -} - - -int -do_test (void) -{ - if (pthread_barrier_init (&b, NULL, N + 1) != 0) - { - puts ("barrier_init failed"); - exit (1); - } - - if (sem_init (&s, 0, 0) != 0) - { - puts ("sem_init failed"); - exit (1); - } - - struct sigaction sa; - sa.sa_handler = handler; - sigemptyset (&sa.sa_mask); - sa.sa_flags = 0; - if (sigaction (THE_SIG, &sa, NULL) != 0) - { - puts ("sigaction failed"); - exit (1); - } - - pthread_attr_t a; - - if (pthread_attr_init (&a) != 0) - { - puts ("attr_init failed"); - exit (1); - } - - if (pthread_attr_setstacksize (&a, 1 * 1024 * 1024) != 0) - { - puts ("attr_setstacksize failed"); - return 1; - } - - int i; - for (i = 0; i < N; ++i) - if (pthread_create (&th[i], &a, tf, cbs[i]) != 0) - { - puts ("pthread_create failed"); - exit (1); - } - - if (pthread_attr_destroy (&a) != 0) - { - puts ("attr_destroy failed"); - exit (1); - } - - pthread_barrier_wait (&b); - - sigset_t ss; - sigemptyset (&ss); - sigaddset (&ss, THE_SIG); - if (pthread_sigmask (SIG_BLOCK, &ss, NULL) != 0) - { - puts ("pthread_sigmask failed"); - exit (1); - } - - /* Start sending signals. */ - for (i = 0; i < TOTAL_SIGS; ++i) - { - if (kill (getpid (), THE_SIG) != 0) - { - puts ("kill failed"); - exit (1); - } - - if (TEMP_FAILURE_RETRY (sem_wait (&s)) != 0) - { - puts ("sem_wait failed"); - exit (1); - } - - ++nsigs; - } - - pthread_barrier_wait (&b); - - for (i = 0; i < N; ++i) - if (pthread_join (th[i], NULL) != 0) - { - puts ("join failed"); - exit (1); - } - - return 0; -} diff --git a/nptl/tst-tsd1.c b/nptl/tst-tsd1.c deleted file mode 100644 index 3e97dea078..0000000000 --- a/nptl/tst-tsd1.c +++ /dev/null @@ -1,117 +0,0 @@ -/* Copyright (C) 2002-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <string.h> - - -static int -do_test (void) -{ - pthread_key_t key1; - pthread_key_t key2; - void *value; - int result = 0; - int err; - - err = pthread_key_create (&key1, NULL); - if (err != 0) - { - printf ("1st key_create failed: %s\n", strerror (err)); - return 1; - } - - /* Initial value must be NULL. */ - value = pthread_getspecific (key1); - if (value != NULL) - { - puts ("1st getspecific != NULL"); - result = 1; - } - - err = pthread_setspecific (key1, (void *) -2l); - if (err != 0) - { - printf ("1st setspecific failed: %s\n", strerror (err)); - return 1; - } - - value = pthread_getspecific (key1); - if (value == NULL) - { - puts ("2nd getspecific == NULL\n"); - result = 1; - } - else if (value != (void *) -2l) - { - puts ("2nd getspecific != -2l\n"); - result = 1; - } - - err = pthread_setspecific (key1, (void *) -3l); - if (err != 0) - { - printf ("2nd setspecific failed: %s\n", strerror (err)); - return 1; - } - - value = pthread_getspecific (key1); - if (value == NULL) - { - puts ("3rd getspecific == NULL\n"); - result = 1; - } - else if (value != (void *) -3l) - { - puts ("3rd getspecific != -2l\n"); - result = 1; - } - - err = pthread_key_delete (key1); - if (err != 0) - { - printf ("key_delete failed: %s\n", strerror (err)); - result = 1; - } - - - err = pthread_key_create (&key2, NULL); - if (err != 0) - { - printf ("2nd key_create failed: %s\n", strerror (err)); - return 1; - } - - if (key1 != key2) - puts ("key1 != key2; no more tests performed"); - else - { - value = pthread_getspecific (key2); - if (value != NULL) - { - puts ("4th getspecific != NULL"); - result = 1; - } - } - - return result; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-tsd2.c b/nptl/tst-tsd2.c deleted file mode 100644 index f72da40c84..0000000000 --- a/nptl/tst-tsd2.c +++ /dev/null @@ -1,96 +0,0 @@ -/* Copyright (C) 2002-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <string.h> - - -static int result; - - -static void -destr (void *arg) -{ - if (arg != (void *) -2l) - result = 2; - else - result = 0; -} - - -static void * -tf (void *arg) -{ - pthread_key_t key = (pthread_key_t) (long int) arg; - int err; - - err = pthread_setspecific (key, (void *) -2l); - if (err != 0) - result = 3; - - return NULL; -} - - -static int -do_test (void) -{ - pthread_key_t key; - pthread_t th; - int err; - - err = pthread_key_create (&key, destr); - if (err != 0) - { - printf ("key_create failed: %s\n", strerror (err)); - return 1; - } - - result = 1; - - err = pthread_create (&th, NULL, tf, (void *) (long int) key); - if (err != 0) - { - printf ("create failed: %s\n", strerror (err)); - return 1; - } - - /* Wait for the thread to terminate. */ - err = pthread_join (th, NULL); - if (err != 0) - { - printf ("join failed: %s\n", strerror (err)); - return 1; - } - - if (result == 1) - puts ("destructor not called"); - else if (result == 2) - puts ("destructor got passed a wrong value"); - else if (result == 3) - puts ("setspecific in child failed"); - else if (result != 0) - puts ("result != 0"); - - return result; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-tsd5.c b/nptl/tst-tsd5.c deleted file mode 100644 index e439588329..0000000000 --- a/nptl/tst-tsd5.c +++ /dev/null @@ -1,80 +0,0 @@ -/* Copyright (C) 2004-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2004. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> - - -static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; - - -static void -cl (void *p) -{ - pthread_mutex_unlock (&m); -} - - -static void * -tf (void *arg) -{ - if (pthread_mutex_lock (&m) != 0) - { - puts ("2nd mutex_lock failed"); - exit (1); - } - - exit (0); -} - - -static int -do_test (void) -{ - pthread_key_t k; - if (pthread_key_create (&k, cl) != 0) - { - puts ("key_create failed"); - return 1; - } - if (pthread_setspecific (k, (void *) 1) != 0) - { - puts ("setspecific failed"); - return 1; - } - - if (pthread_mutex_lock (&m) != 0) - { - puts ("1st mutex_lock failed"); - return 1; - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("create failed"); - return 1; - } - - pthread_exit (NULL); -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-tsd6.c b/nptl/tst-tsd6.c deleted file mode 100644 index debb1dd367..0000000000 --- a/nptl/tst-tsd6.c +++ /dev/null @@ -1,89 +0,0 @@ -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/wait.h> - -#define NKEYS 100 -static pthread_key_t keys[NKEYS]; -static pthread_barrier_t b; - - -static void * -tf (void *arg) -{ - void *res = NULL; - for (int i = 0; i < NKEYS; ++i) - { - void *p = pthread_getspecific (keys[i]); - pthread_setspecific (keys[i], (void *) 7); - if (p != NULL) - res = p; - } - if (arg != NULL) - { - pthread_barrier_wait (arg); - pthread_barrier_wait (arg); - } - return res; -} - - -static int -do_test (void) -{ - pthread_barrier_init (&b, NULL, 2); - - for (int i = 0; i < NKEYS; ++i) - if (pthread_key_create (&keys[i], NULL) != 0) - { - puts ("cannot create keys"); - return 1; - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, &b) != 0) - { - puts ("cannot create thread in parent"); - return 1; - } - - pthread_barrier_wait (&b); - - pid_t pid = fork (); - if (pid == 0) - { - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("cannot create thread in child"); - exit (1); - } - - void *res; - pthread_join (th, &res); - - exit (res != NULL); - } - else if (pid == -1) - { - puts ("cannot create child process"); - return 1; - } - - int s; - if (TEMP_FAILURE_RETRY (waitpid (pid, &s, 0)) != pid) - { - puts ("failing to wait for child process"); - return 1; - } - - pthread_barrier_wait (&b); - pthread_join (th, NULL); - - return !WIFEXITED (s) ? 2 : WEXITSTATUS (s); -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-umask1.c b/nptl/tst-umask1.c deleted file mode 100644 index 46ff89b9fd..0000000000 --- a/nptl/tst-umask1.c +++ /dev/null @@ -1,136 +0,0 @@ -/* Copyright (C) 2003-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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 - <https://www.gnu.org/licenses/>. */ - -#include <fcntl.h> -#include <pthread.h> -#include <stdbool.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/stat.h> - - -static struct -{ - int (*fp) (const char *, mode_t); - const char *name; - bool is_fd; -} fcts[] = -{ - { creat, "creat", true }, - { mkdir, "mkdir", false }, - { mkfifo, "mkfifo", false }, -}; -#define nfcts (sizeof (fcts) / sizeof (fcts[0])) - - -static int -work (const char *fname, int mask) -{ - int result = 0; - size_t i; - for (i = 0; i < nfcts; ++i) - { - remove (fname); - int fd = fcts[i].fp (fname, 0777); - if (fd == -1) - { - printf ("cannot %s %s: %m\n", fcts[i].name, fname); - exit (1); - } - if (fcts[i].is_fd) - close (fd); - struct stat64 st; - if (stat64 (fname, &st) == -1) - { - printf ("cannot stat %s after %s: %m\n", fname, fcts[i].name); - exit (1); - } - - if ((st.st_mode & mask) != 0) - { - printf ("mask not successful after %s: %x still set\n", - fcts[i].name, (unsigned int) (st.st_mode & mask)); - result = 1; - } - } - - return result; -} - - -static pthread_barrier_t bar; - - -static void * -tf (void *arg) -{ - pthread_barrier_wait (&bar); - - int result = work (arg, 022); - - pthread_barrier_wait (&bar); - - pthread_barrier_wait (&bar); - - return (work (arg, 0) | result) ? (void *) -1l : NULL; -} - - -static int -do_test (const char *fname) -{ - int result = 0; - - umask (0); - result |= work (fname, 0); - - pthread_barrier_init (&bar, NULL, 2); - - pthread_t th; - if (pthread_create (&th, NULL, tf, (void *) fname) != 0) - { - puts ("cannot create thread"); - exit (1); - } - - umask (022); - result |= work (fname, 022); - - pthread_barrier_wait (&bar); - - pthread_barrier_wait (&bar); - - umask (0); - - pthread_barrier_wait (&bar); - - void *res; - if (pthread_join (th, &res) != 0) - { - puts ("join failed"); - exit (1); - } - - remove (fname); - - return result || res != NULL; -} - -#define TEST_FUNCTION do_test (argc < 2 ? "/tmp/tst-umask.tmp" : argv[1]) -#include "../test-skeleton.c" diff --git a/nptl/tst-unload.c b/nptl/tst-unload.c deleted file mode 100644 index b29745c9c1..0000000000 --- a/nptl/tst-unload.c +++ /dev/null @@ -1,47 +0,0 @@ -/* Tests for non-unloading of libpthread. - Copyright (C) 2000-2020 Free Software Foundation, Inc. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2000. - - 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; see the file COPYING.LIB. If - not, see <https://www.gnu.org/licenses/>. */ - -#include <dlfcn.h> -#include <stdio.h> -#include <stdlib.h> -#include <gnu/lib-names.h> - -static int -do_test (void) -{ - void *p = dlopen (LIBPTHREAD_SO, RTLD_LAZY); - - if (p == NULL) - { - puts ("failed to load " LIBPTHREAD_SO); - return 1; - } - - if (dlclose (p) != 0) - { - puts ("dlclose (" LIBPTHREAD_SO ") failed"); - return 1; - } - - puts ("seems to work"); - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-unwind-thread.c b/nptl/tst-unwind-thread.c deleted file mode 100644 index d5c38e3709..0000000000 --- a/nptl/tst-unwind-thread.c +++ /dev/null @@ -1,2 +0,0 @@ -#define USE_PTHREADS 1 -#include "../elf/tst-unwind-main.c" diff --git a/nptl/tst-vfork1.c b/nptl/tst-vfork1.c deleted file mode 100644 index f409ec49b3..0000000000 --- a/nptl/tst-vfork1.c +++ /dev/null @@ -1 +0,0 @@ -#include <posix/tst-vfork1.c> diff --git a/nptl/tst-vfork1x.c b/nptl/tst-vfork1x.c deleted file mode 100644 index f409ec49b3..0000000000 --- a/nptl/tst-vfork1x.c +++ /dev/null @@ -1 +0,0 @@ -#include <posix/tst-vfork1.c> diff --git a/nptl/tst-vfork2.c b/nptl/tst-vfork2.c deleted file mode 100644 index 5356e83115..0000000000 --- a/nptl/tst-vfork2.c +++ /dev/null @@ -1 +0,0 @@ -#include <posix/tst-vfork2.c> diff --git a/nptl/tst-vfork2x.c b/nptl/tst-vfork2x.c deleted file mode 100644 index 5356e83115..0000000000 --- a/nptl/tst-vfork2x.c +++ /dev/null @@ -1 +0,0 @@ -#include <posix/tst-vfork2.c> |