/* This testcase is part of GDB, the GNU debugger.
Copyright 2023-2024 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see . */
#include
#include
#include
#include
#include
#include
#include
#include
#define MAX_LOOP_ITER 10000
static char *argv0;
static void*
worker_a (void *pArg)
{
int iter = 0;
char *args[] = {argv0, "self-call", NULL };
while (iter++ < MAX_LOOP_ITER)
{
pid_t pid = FORK_FUNC ();
if (pid == 0)
{
/* child */
if (execvp (args[0], args) == -1)
{
fprintf (stderr, "execvp error: %d\n", errno);
exit (1);
}
}
waitpid (pid, NULL, 0);
usleep (5);
}
return NULL;
}
static void*
worker_b (void *pArg)
{
int iter = 0;
while (iter++ < MAX_LOOP_ITER) /* for loop */
{
usleep (5); /* break here */
usleep (5); /* other line */
}
return NULL;
}
int
main (int argc, char **argv)
{
pthread_t wa_pid;
pthread_t wb_pid;
argv0 = argv[0];
if (argc > 1 && strcmp (argv[1], "self-call") == 0)
exit (0);
pthread_create (&wa_pid, NULL, worker_a, NULL);
pthread_create (&wb_pid, NULL, worker_b, NULL);
pthread_join (wa_pid, NULL);
exit (0);
}