1 /* This testcase is part of GDB, the GNU debugger.
2 
3    Copyright 2015-2020 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 <assert.h>
19 #include <pthread.h>
20 #include <unistd.h>
21 
22 /* Number of threads.  Each thread continuously steps over a
23    breakpoint.  */
24 #define NTHREADS 10
25 
26 pthread_t threads[NTHREADS];
27 
28 pthread_barrier_t barrier;
29 
30 /* Used to create a conditional breakpoint that always fails.  */
31 volatile int zero;
32 
33 static void *
thread_func(void * arg)34 thread_func (void *arg)
35 {
36   pthread_barrier_wait (&barrier);
37 
38   while (1)
39     {
40       usleep (1); /* set break here */
41     }
42 
43   return NULL;
44 }
45 
46 int
main(void)47 main (void)
48 {
49   int ret;
50   int i;
51 
52   /* Don't run forever.  */
53   alarm (180);
54 
55   pthread_barrier_init (&barrier, NULL, NTHREADS + 1);
56 
57   /* Start the threads that constantly hits a conditional breakpoint
58      that needs to be stepped over.  */
59   for (i = 0; i < NTHREADS; i++)
60     {
61       ret = pthread_create (&threads[i], NULL, thread_func, NULL);
62       assert (ret == 0);
63     }
64 
65   /* Wait until all threads are up and running.  */
66   pthread_barrier_wait (&barrier);
67 
68   /* Let them start hitting the breakpoint.  */
69   usleep (100);
70 
71   /* Exit abruptly.  */
72   return 0;
73 }
74