From 4a07fbb689eeec30e7d71a0d144c26e0d1e424ac Mon Sep 17 00:00:00 2001 From: Wilco Dijkstra Date: Thu, 22 Sep 2022 15:40:37 +0100 Subject: Use C11 atomics instead of atomic_decrement_and_test Replace atomic_decrement_and_test with atomic_fetch_add_relaxed. These are simple counters which do not protect any shared data from concurrent accesses. Also remove the unused file cond-perf.c. Passes regress on AArch64. Reviewed-by: Adhemerval Zanella --- nptl/cond-perf.c | 103 -------------------------------------------------- nptl/pthread_create.c | 2 +- 2 files changed, 1 insertion(+), 104 deletions(-) delete mode 100644 nptl/cond-perf.c (limited to 'nptl') diff --git a/nptl/cond-perf.c b/nptl/cond-perf.c deleted file mode 100644 index 9c9488e274..0000000000 --- a/nptl/cond-perf.c +++ /dev/null @@ -1,103 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -static pthread_cond_t cond1 = PTHREAD_COND_INITIALIZER; -static pthread_mutex_t mut1 = PTHREAD_MUTEX_INITIALIZER; - -static pthread_cond_t cond2 = PTHREAD_COND_INITIALIZER; -static pthread_mutex_t mut2 = PTHREAD_MUTEX_INITIALIZER; - -static bool last_round; -static int ntogo; -static bool alldone; - - -static void * -cons (void *arg) -{ - pthread_mutex_lock (&mut1); - - do - { - if (atomic_decrement_and_test (&ntogo)) - { - pthread_mutex_lock (&mut2); - alldone = true; - pthread_cond_signal (&cond2); - pthread_mutex_unlock (&mut2); - } - - pthread_cond_wait (&cond1, &mut1); - } - while (! last_round); - - pthread_mutex_unlock (&mut1); - - return NULL; -} - - -int -main (int argc, char *argv[]) -{ - int opt; - int err; - int nthreads = 10; - int nrounds = 100; - bool keeplock = false; - - while ((opt = getopt (argc, argv, "n:r:k")) != -1) - switch (opt) - { - case 'n': - nthreads = atol (optarg); - break; - case 'r': - nrounds = atol (optarg); - break; - case 'k': - keeplock = true; - break; - } - - ntogo = nthreads; - - pthread_t th[nthreads]; - int i; - for (i = 0; __builtin_expect (i < nthreads, 1); ++i) - if (__glibc_unlikely ((err = pthread_create (&th[i], NULL, cons, (void *) (long) i)) != 0)) - printf ("pthread_create: %s\n", strerror (err)); - - for (i = 0; __builtin_expect (i < nrounds, 1); ++i) - { - pthread_mutex_lock (&mut2); - while (! alldone) - pthread_cond_wait (&cond2, &mut2); - pthread_mutex_unlock (&mut2); - - pthread_mutex_lock (&mut1); - if (! keeplock) - pthread_mutex_unlock (&mut1); - - ntogo = nthreads; - alldone = false; - if (i + 1 >= nrounds) - last_round = true; - - pthread_cond_broadcast (&cond1); - - if (keeplock) - pthread_mutex_unlock (&mut1); - } - - for (i = 0; i < nthreads; ++i) - if ((err = pthread_join (th[i], NULL)) != 0) - printf ("pthread_create: %s\n", strerror (err)); - - return 0; -} diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c index 0df67484e2..54afee5976 100644 --- a/nptl/pthread_create.c +++ b/nptl/pthread_create.c @@ -489,7 +489,7 @@ start_thread (void *arg) the breakpoint reports TD_THR_RUN state rather than TD_THR_ZOMBIE. */ atomic_fetch_or_relaxed (&pd->cancelhandling, EXITING_BITMASK); - if (__glibc_unlikely (atomic_decrement_and_test (&__nptl_nthreads))) + if (__glibc_unlikely (atomic_fetch_add_relaxed (&__nptl_nthreads, -1) == 1)) /* This was the last thread. */ exit (0); -- cgit 1.4.1