a0e3fa759e996b4c91d922803ca9215d70c6e9d9
[external/binutils.git] / gdb / testsuite / gdb.threads / process-dies-while-handling-bp.c
1 /* This testcase is part of GDB, the GNU debugger.
2
3    Copyright 2015-2016 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 *
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
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 }