[gdb/symtab] Fix gdb.base/fission-macro.exp with unix/-m32
[binutils-gdb.git] / gdb / testsuite / gdb.threads / next-fork-exec-other-thread.c
blob7694a894befa4e952525c7a05dbd5b54594825f1
1 /* This testcase is part of GDB, the GNU debugger.
3 Copyright 2023-2024 Free Software Foundation, Inc.
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.
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.
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/>. */
18 #include <stdio.h>
19 #include <stdlib.h>
20 #include <string.h>
21 #include <fcntl.h>
22 #include <errno.h>
23 #include <unistd.h>
24 #include <pthread.h>
25 #include <sys/wait.h>
27 #define MAX_LOOP_ITER 10000
29 static char *argv0;
31 static void*
32 worker_a (void *pArg)
34 int iter = 0;
35 char *args[] = {argv0, "self-call", NULL };
37 while (iter++ < MAX_LOOP_ITER)
39 pid_t pid = FORK_FUNC ();
40 if (pid == 0)
42 /* child */
43 if (execvp (args[0], args) == -1)
45 fprintf (stderr, "execvp error: %d\n", errno);
46 exit (1);
50 waitpid (pid, NULL, 0);
51 usleep (5);
54 return NULL;
57 static void*
58 worker_b (void *pArg)
60 int iter = 0;
61 while (iter++ < MAX_LOOP_ITER) /* for loop */
63 usleep (5); /* break here */
64 usleep (5); /* other line */
67 return NULL;
70 int
71 main (int argc, char **argv)
73 pthread_t wa_pid;
74 pthread_t wb_pid;
76 argv0 = argv[0];
78 if (argc > 1 && strcmp (argv[1], "self-call") == 0)
79 exit (0);
81 pthread_create (&wa_pid, NULL, worker_a, NULL);
82 pthread_create (&wb_pid, NULL, worker_b, NULL);
83 pthread_join (wa_pid, NULL);
85 exit (0);