old-cross-binutils/gdb/testsuite/gdb.threads/fork-thread-pending.c
Pedro Alves e58b0e63bb gdb/
* gdbthread.h (struct thread_info): New `pending_follow' field.
	* thread.c (new_thread): New function.
	(add_thread_silent): Use it.
	* breakpoint.c (internal_breakpoint_number): New global, moved
	from inside...
	(create_internal_breakpoint): ... this.
	(clone_momentary_breakpoint): New.
	* breakpoint.h (clone_momentary_breakpoint): Declare.
	* infrun.c (nullify_last_target_wait_ptid): Move declaration
	higher.
	(pending_follow): Delete.
	(follow_fork): Handle pending follow fork event here.  Moved the
	preserving of thread stepping state here.
	(resume): Don't handle pending follow fork events here.  Only
	install the inferior's terminal modes if we're about to resume it.
	(proceed): Handle possible pending follow fork events here.
	(init_wait_for_inferior): No need to clear pending_follow anymore,
	it's gone.
	(handle_inferior_event): Adjust to per-thread `pending_follow'.
	Call `follow_fork' to handle following the fork.  If the
	follow-fork is cancelled, stop stepping.
	* linux-nat.c (linux_child_follow_fork): Adjust to per-thread
	`pending_follow' events.  Remove code that handled preserving the
	thread stepping state.
	* inf-ptrace.c (inf_ptrace_follow_fork): Ditto.
	* inf-ttrace.c (inf_ttrace_follow_fork): Ditto.

gdb/testsuite/
	* gdb.threads/fork-thread-pending.c: New.
	* gdb.threads/fork-thread-pending.exp: New.
2009-05-24 18:00:08 +00:00

109 lines
2.2 KiB
C

/* This testcase is part of GDB, the GNU debugger.
Copyright 2008, 2009 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 <http://www.gnu.org/licenses/>. */
#include <pthread.h>
#include <assert.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#define NUMTHREADS 10
volatile int done = 0;
static void *
start (void *arg)
{
while (!done)
usleep (100);
assert (0);
return arg;
}
void *
thread_function (void *arg)
{
int x = * (int *) arg;
printf ("Thread <%d> executing\n", x);
while (!done)
usleep (100);
return NULL;
}
void *
thread_forker (void *arg)
{
int x = * (int *) arg;
pid_t pid;
int rv;
int i;
pthread_t thread;
printf ("Thread forker <%d> executing\n", x);
switch ((pid = fork ()))
{
case -1:
assert (0);
default:
wait (&rv);
done = 1;
break;
case 0:
i = pthread_create (&thread, NULL, start, NULL);
assert (i == 0);
i = pthread_join (thread, NULL);
assert (i == 0);
assert (0);
}
return NULL;
}
int
main (void)
{
pthread_t threads[NUMTHREADS];
int args[NUMTHREADS];
int i, j;
/* Create a few threads that do mostly nothing, and then one that
forks. */
for (j = 0; j < NUMTHREADS - 1; ++j)
{
args[j] = j;
pthread_create (&threads[j], NULL, thread_function, &args[j]);
}
args[j] = j;
pthread_create (&threads[j], NULL, thread_forker, &args[j]);
for (j = 0; j < NUMTHREADS; ++j)
{
pthread_join (threads[j], NULL);
}
return 0;
}