/* This testcase is part of GDB, the GNU debugger. Copyright 2015-2023 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #define _GNU_SOURCE #include #include #include #include #define NUM_THREADS 3 struct thread_data { const char *name; pthread_barrier_t *barrier; }; static void * thread_func (void *varg) { struct thread_data *arg = (struct thread_data *) varg; int res; res = pthread_setname_np (pthread_self (), arg->name); assert (res == 0); pthread_barrier_wait (arg->barrier); pthread_barrier_wait (arg->barrier); return NULL; } static void all_threads_ready (void) { } int main (int argc, char **argv) { pthread_t threads[NUM_THREADS]; struct thread_data args[NUM_THREADS]; pthread_barrier_t barrier; int i, res; const char *names[] = { "carrot", "potato", "celery" }; alarm (20); /* Make sure that NAMES contains NUM_THREADS elements. */ assert (sizeof (names) / sizeof (names[0]) == NUM_THREADS); res = pthread_barrier_init (&barrier, NULL, NUM_THREADS + 1); assert (res == 0);; res = pthread_setname_np (pthread_self (), "main"); assert (res == 0); for (i = 0; i < NUM_THREADS; i++) { struct thread_data *arg = &args[i]; arg->name = names[i]; arg->barrier = &barrier; res = pthread_create (&threads[i], NULL, thread_func, arg); assert (res == 0); } pthread_barrier_wait (&barrier); all_threads_ready (); pthread_barrier_wait (&barrier); for (i = 0; i < NUM_THREADS; i++) { res = pthread_join (threads[i], NULL); assert (res == 0); } return 0; }