]> Git Repo - binutils.git/blob - gdb/testsuite/gdb.threads/fork-plus-threads.c
Automatic date update in version.in
[binutils.git] / gdb / testsuite / gdb.threads / fork-plus-threads.c
1 /* This testcase is part of GDB, the GNU debugger.
2
3    Copyright 2015-2022 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 #include <stdio.h>
22 #include <sys/types.h>
23 #include <sys/wait.h>
24
25
26 /* Number of times the main process forks.  */
27 #define NFORKS 10
28
29 /* Number of threads by each fork child.  */
30 #define NTHREADS 10
31
32 static void *
33 thread_func (void *arg)
34 {
35   /* Empty.  */
36   return NULL;
37 }
38
39 static void
40 fork_child (void)
41 {
42   pthread_t threads[NTHREADS];
43   int i;
44   int ret;
45
46   for (i = 0; i < NTHREADS; i++)
47     {
48       ret = pthread_create (&threads[i], NULL, thread_func, NULL);
49       assert (ret == 0);
50     }
51
52   for (i = 0; i < NTHREADS; i++)
53     {
54       ret = pthread_join (threads[i], NULL);
55       assert (ret == 0);
56     }
57 }
58
59 int
60 main (void)
61 {
62   pid_t childs[NFORKS];
63   int i;
64   int status;
65   int num_exited = 0;
66
67   /* Don't run forever if the wait loop below gets stuck.  */
68   alarm (180);
69
70   for (i = 0; i < NFORKS; i++)
71     {
72       pid_t pid;
73
74       pid = fork ();
75
76       if (pid > 0)
77         {
78           /* Parent.  */
79           childs[i] = pid;
80         }
81       else if (pid == 0)
82         {
83           /* Child.  */
84           fork_child ();
85           return 0;
86         }
87       else
88         {
89           perror ("fork");
90           return 1;
91         }
92     }
93
94   while (num_exited != NFORKS)
95     {
96       pid_t pid = wait (&status);
97
98       if (pid == -1)
99         {
100           perror ("wait");
101           return 1;
102         }
103
104       if (WIFEXITED (status))
105         {
106           num_exited++;
107         }
108       else
109         {
110           printf ("Hmm, unexpected wait status 0x%x from child %d\n", status,
111                   pid);
112         }
113     }
114
115   return 0;
116 }
This page took 0.030223 seconds and 4 git commands to generate.