1/* This testcase is part of GDB, the GNU debugger. 2 3 Copyright 2014-2023 Free Software Foundation, Inc. 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 3 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 17 18#include <pthread.h> 19#include <assert.h> 20#include <unistd.h> 21#include <stdlib.h> 22 23pthread_barrier_t barrier; 24 25volatile int second_child; 26 27void 28breakpoint_function (void) 29{ 30 /* GDB sets a breakpoint in this function. */ 31} 32 33void * 34child_function_0 (void *arg) 35{ 36 volatile unsigned int counter = 1; 37 38 pthread_barrier_wait (&barrier); 39 40 while (counter > 0) 41 { 42 counter++; 43 usleep (1); 44 45 if (second_child) 46 continue; 47 48 breakpoint_function (); 49 } 50 51 pthread_exit (NULL); 52} 53 54void * 55child_function_1 (void *arg) 56{ 57 volatile unsigned int counter = 1; 58 59 pthread_barrier_wait (&barrier); 60 61 while (counter > 0) 62 { 63 counter++; 64 usleep (1); 65 66 if (!second_child) 67 continue; 68 69 breakpoint_function (); 70 } 71 72 pthread_exit (NULL); 73} 74 75static int 76wait_threads (void) 77{ 78 return 1; /* in wait_threads */ 79} 80 81int 82main (void) 83{ 84 pthread_t child_thread[2]; 85 int res; 86 87 pthread_barrier_init (&barrier, NULL, 3); 88 89 res = pthread_create (&child_thread[0], NULL, child_function_0, NULL); 90 assert (res == 0); 91 res = pthread_create (&child_thread[1], NULL, child_function_1, NULL); 92 assert (res == 0); 93 94 pthread_barrier_wait (&barrier); 95 wait_threads (); /* set wait-thread breakpoint here */ 96 97 pthread_join (child_thread[0], NULL); 98 pthread_join (child_thread[1], NULL); 99 100 exit (EXIT_SUCCESS); 101} 102