xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/testsuite/gdb.base/watch_thread_num.c (revision 8b657b0747480f8989760d71343d6dd33f8d4cf9)
1 /* This testcase is part of GDB, the GNU debugger.
2 
3    Copyright 2002-2023 Free Software Foundation, Inc.
4 
5    Copyright 1992, 1993, 1994, 1995, 1999, 2002, 2003, 2007, 2008, 2009
6    Free Software Foundation, Inc.
7 
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
12 
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17 
18    You should have received a copy of the GNU General Public License
19    along with this program.  If not, see <http://www.gnu.org/licenses/>.
20 
21    This file is copied from schedlock.c.  */
22 
23 #include <stdio.h>
24 #include <unistd.h>
25 #include <stdlib.h>
26 #include <pthread.h>
27 
28 void *thread_function (void *arg); /* Pointer to function executed by each thread */
29 
30 static pthread_barrier_t threads_started_barrier;
31 
32 static pthread_barrier_t threads_started_barrier2;
33 
34 #define NUM 15
35 
36 static int num_threads = NUM;
37 
38 static unsigned int shared_var = 1;
39 
40 int main () {
41     int res;
42     pthread_t threads[NUM];
43     void *thread_result;
44     long i;
45 
46     alarm (180);
47 
48     pthread_barrier_init (&threads_started_barrier, NULL, NUM + 1);
49 
50     pthread_barrier_init (&threads_started_barrier2, NULL, 2);
51 
52     for (i = 0; i < NUM; i++)
53       {
54         res = pthread_create (&threads[i],
55                              NULL,
56                              thread_function,
57 			     (void *) i);
58       }
59 
60     pthread_barrier_wait (&threads_started_barrier);
61 
62     pthread_barrier_wait (&threads_started_barrier2);  /* all threads started */
63 
64     pthread_join (threads[0], NULL);
65 
66     /* first child thread exited */
67 
68     while (1)
69       sleep (1);
70 
71     exit (EXIT_SUCCESS);
72 }
73 
74 void
75 loop (void)
76 {
77 }
78 
79 void *thread_function (void *arg) {
80     int my_number = (long) arg;
81 
82     pthread_barrier_wait (&threads_started_barrier);
83 
84     if (my_number > 0)
85       {
86 	/* Don't run forever.  Run just short of it :)  */
87 	while (shared_var > 0)
88 	  {
89 	    shared_var++;
90 	    usleep (1); /* Loop increment.  */
91 	    loop ();
92 	  }
93       }
94     else
95       pthread_barrier_wait (&threads_started_barrier2);
96 
97     pthread_exit (NULL);
98 }
99 
100