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