* breakpoint.c (breakpoint_thread_match break_command_1):

Thread-specific breakpoint support.
* breakpoint.h (struct breakpoint):  Add thread id field.
* fork-child.c (fork_inferior):  Move call to init_thread_list()
back a bit so that init_trace_fun can do thread functions.
* hppa-tdep.c (restore_pc_queue):  Add pid to call to target_wait.
* hppab-nat.c (child_resume):  Handle default pid.
* hppah-nat.c (child_resume):  Handle default pid.
* i386lynx-nat.c (child_wait):  New arg pid.
* inflow.c (kill_command):  Reset thread list.
* infptrace.c (child_resume):  Handle default pid.
* infrun.c:  Thread-specific breakpoint support.
* inftarg.c (child_wait):  Add pid arg.
* osfsolib.c (solib_create_inferior_hook):  Add pid to call to
target_resume.
* procfs.c:  Multi-thread support.
* remote-bug.c (bug_wait):  Add pid arg.
* remote-hms.c (hms_wait):  Add pid arg.
* remote-mips.c (mips_wait):  Add pid arg.
* remote-mon.c (monitor_wait):  Add pid arg.
* remote-nindy.c (nindy_wait):  Add pid arg.
* remote-sim.c (gdbsim_wait):  Add pid arg.
* remote-udi.c (udi_wait):  Add pid arg.
* remote-vx.c (vx_wait):  Add pid arg.
* remote-z8k.c (sim_wait):  Add pid arg.
* remote.c (remote_wait):  Add pid arg.
* solib.c (solib_create_inferior_hook):  Add pid to call to
target_resume.
* target.h (struct target_ops):  Add pid arg to to_wait and
to_notice_signals.
* thread.c (valid_thread_id):  New func to validate thread #s.
* (pid_to_thread_id):  New func to do the obvious.
* thread.h:  Prototypes for above.

* coff-solib.c (coff_solib_add):  Use nameoffset field to locate
filename.
This commit is contained in:
Stu Grossman 1993-10-16 06:42:02 +00:00
parent 9bc3153e82
commit de43d7d005
22 changed files with 863 additions and 519 deletions

View file

@ -1,3 +1,42 @@
Fri Oct 15 22:46:07 1993 Stu Grossman (grossman at cygnus.com)
* breakpoint.c (breakpoint_thread_match break_command_1):
Thread-specific breakpoint support.
* breakpoint.h (struct breakpoint): Add thread id field.
* fork-child.c (fork_inferior): Move call to init_thread_list()
back a bit so that init_trace_fun can do thread functions.
* hppa-tdep.c (restore_pc_queue): Add pid to call to target_wait.
* hppab-nat.c (child_resume): Handle default pid.
* hppah-nat.c (child_resume): Handle default pid.
* i386lynx-nat.c (child_wait): New arg pid.
* inflow.c (kill_command): Reset thread list.
* infptrace.c (child_resume): Handle default pid.
* infrun.c: Thread-specific breakpoint support.
* inftarg.c (child_wait): Add pid arg.
* osfsolib.c (solib_create_inferior_hook): Add pid to call to
target_resume.
* procfs.c: Multi-thread support.
* remote-bug.c (bug_wait): Add pid arg.
* remote-hms.c (hms_wait): Add pid arg.
* remote-mips.c (mips_wait): Add pid arg.
* remote-mon.c (monitor_wait): Add pid arg.
* remote-nindy.c (nindy_wait): Add pid arg.
* remote-sim.c (gdbsim_wait): Add pid arg.
* remote-udi.c (udi_wait): Add pid arg.
* remote-vx.c (vx_wait): Add pid arg.
* remote-z8k.c (sim_wait): Add pid arg.
* remote.c (remote_wait): Add pid arg.
* solib.c (solib_create_inferior_hook): Add pid to call to
target_resume.
* target.h (struct target_ops): Add pid arg to to_wait and
to_notice_signals.
* thread.c (valid_thread_id): New func to validate thread #s.
* (pid_to_thread_id): New func to do the obvious.
* thread.h: Prototypes for above.
* coff-solib.c (coff_solib_add): Use nameoffset field to locate
filename.
Fri Oct 15 21:29:40 1993 Jim Kingdon (kingdon@lioth.cygnus.com)
* h8300-tdep.c, h8500-tdep.c: Define sim_load only, but not

View file

@ -62,8 +62,7 @@ coff_solib_add (arg_string, from_tty, target)
struct libent
{
bfd_byte len[4];
bfd_byte unk[4];
char filename[1];
bfd_byte nameoffset[4];
};
libsize = bfd_section_size (exec_bfd, libsect);
@ -76,16 +75,21 @@ coff_solib_add (arg_string, from_tty, target)
{
struct libent *ent;
struct objfile *objfile;
int len;
int len, nameoffset;
char *filename;
ent = (struct libent *)lib;
len = bfd_get_32 (exec_bfd, ent->len);
nameoffset = bfd_get_32 (exec_bfd, ent->nameoffset);
if (len <= 0)
break;
objfile = symbol_file_add (ent->filename, from_tty,
filename = (char *)ent + nameoffset * 4;
objfile = symbol_file_add (filename, from_tty,
0, /* addr */
0, /* not mainline */
0, /* not mapped */

View file

@ -238,11 +238,15 @@ fork_inferior (exec_file, allargs, env, traceme_fun, init_trace_fun)
/* Restore our environment in case a vforked child clob'd it. */
environ = save_our_env;
init_thread_list();
/* Now that we have a child process, make it our target, and
initialize anything target-vector-specific that needs initializing. */
(*init_trace_fun)(pid);
init_thread_list();
#ifdef CREATE_INFERIOR_HOOK
CREATE_INFERIOR_HOOK (pid);
#endif
/* The process was started by the fork that created it,
but it will have stopped one instruction after execing the shell.

View file

@ -869,7 +869,7 @@ restore_pc_queue (fsr)
for (insn_count = 0; insn_count < 3; insn_count++)
{
resume (1, 0);
target_wait(&w);
target_wait(inferior_pid, &w);
if (!WIFSTOPPED (w))
{

View file

@ -261,6 +261,9 @@ child_resume (pid, step, signal)
{
errno = 0;
if (pid == -1)
pid = inferior_pid;
/* An address of (PTRACE_ARG3_TYPE) 1 tells ptrace to continue from where
it was. (If GDB wanted it to start some other way, we have already
written a new PC value to the child.) */

View file

@ -212,6 +212,9 @@ child_resume (pid, step, signal)
{
errno = 0;
if (pid == -1)
pid = inferior_pid;
/* An address of (PTRACE_ARG3_TYPE) 1 tells ptrace to continue from where
it was. (If GDB wanted it to start some other way, we have already
written a new PC value to the child.) */

View file

@ -187,10 +187,10 @@ store_inferior_registers (regno)
of error; store status through argument pointer STATUS. */
int
child_wait (status)
child_wait (pid, status)
int pid;
int *status;
{
int pid;
int save_errno;
int thread;

View file

@ -306,7 +306,7 @@ resume (step, sig)
/* Install inferior's terminal modes. */
target_terminal_inferior ();
target_resume (inferior_pid, step, sig);
target_resume (-1, step, sig);
discard_cleanups (old_cleanups);
}
@ -503,7 +503,7 @@ wait_for_inferior ()
flush_cached_frames ();
registers_changed ();
pid = target_wait (&w);
pid = target_wait (-1, &w);
#ifdef SIGTRAP_STOP_AFTER_LOAD
@ -559,7 +559,41 @@ wait_for_inferior ()
#endif
break;
}
stop_signal = WSTOPSIG (w);
if (pid != inferior_pid)
{
int save_pid = inferior_pid;
inferior_pid = pid; /* Setup for target memory/regs */
registers_changed ();
stop_pc = read_pc ();
inferior_pid = save_pid;
registers_changed ();
}
else
stop_pc = read_pc ();
if (stop_signal == SIGTRAP
&& breakpoint_here_p (stop_pc - DECR_PC_AFTER_BREAK))
if (!breakpoint_thread_match (stop_pc - DECR_PC_AFTER_BREAK, pid))
{
/* Saw a breakpoint, but it was hit by the wrong thread. Just continue. */
if (breakpoints_inserted)
{
remove_breakpoints ();
target_resume (pid, 1, 0); /* Single step */
target_wait (pid, NULL);
insert_breakpoints ();
}
target_resume (-1, 0, 0);
continue;
}
else
if (pid != inferior_pid)
goto switch_thread;
if (pid != inferior_pid)
{
int printed = 0;
@ -569,13 +603,11 @@ wait_for_inferior ()
fprintf (stderr, "[New %s]\n", target_pid_to_str (pid));
add_thread (pid);
target_resume (pid, 0, 0);
target_resume (-1, 0, 0);
continue;
}
else
{
stop_signal = WSTOPSIG (w);
if (stop_signal >= NSIG || signal_print[stop_signal])
{
char *signame;
@ -593,8 +625,11 @@ wait_for_inferior ()
fflush (stdout);
}
if (stop_signal >= NSIG || signal_stop[stop_signal])
if (stop_signal == SIGTRAP
|| stop_signal >= NSIG
|| signal_stop[stop_signal])
{
switch_thread:
inferior_pid = pid;
printf_filtered ("[Switching to %s]\n", target_pid_to_str (pid));
@ -624,12 +659,14 @@ wait_for_inferior ()
if (signal_program[stop_signal] == 0)
stop_signal = 0;
target_resume (pid, 0, stop_signal);
target_resume (-1, 0, stop_signal);
continue;
}
}
}
same_pid:
#ifdef NO_SINGLE_STEP
if (one_stepped)
single_step (0); /* This actually cleans up the ss */
@ -644,7 +681,6 @@ wait_for_inferior ()
continue;
}
stop_pc = read_pc ();
set_current_frame ( create_new_frame (read_fp (), stop_pc));
stop_frame_address = FRAME_FP (get_current_frame ());
@ -674,8 +710,6 @@ wait_for_inferior ()
3) set random_signal to 1, and the decision between 1 and 2
will be made according to the signal handling tables. */
stop_signal = WSTOPSIG (w);
/* First, distinguish signals caused by the debugger from signals
that have to do with the program's own actions.
Note that breakpoint insns may cause SIGTRAP or SIGILL
@ -1598,7 +1632,7 @@ handle_command (args, from_tty)
argv++;
}
target_notice_signals();
target_notice_signals(inferior_pid);
if (from_tty)
{

View file

@ -24,23 +24,16 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "target.h"
#include "wait.h"
#include "gdbcore.h"
#include "ieee-float.h" /* Required by REGISTER_CONVERT_TO_XXX */
#include "terminal.h" /* For #ifdef TIOCGPGRP and new_tty */
#include <signal.h>
#ifdef SET_STACK_LIMIT_HUGE
#include <sys/time.h>
#include <sys/resource.h>
extern int original_stack_limit;
#endif /* SET_STACK_LIMIT_HUGE */
static void
child_prepare_to_store PARAMS ((void));
#ifndef CHILD_WAIT
static int
child_wait PARAMS ((int *));
#endif /* CHILD_WAIT */
static void
child_open PARAMS ((char *, int));
@ -54,6 +47,12 @@ child_detach PARAMS ((char *, int));
static void
child_attach PARAMS ((char *, int));
static void
ptrace_me PARAMS ((void));
static void
ptrace_him PARAMS ((int));
static void
child_create_inferior PARAMS ((char *, char *, char **));
@ -68,31 +67,41 @@ extern char **environ;
/* Forward declaration */
extern struct target_ops child_ops;
#ifndef CHILD_WAIT
/* Wait for child to do something. Return pid of child, or -1 in case
of error; store status through argument pointer STATUS. */
static int
child_wait (status)
child_wait (pid, status)
int pid;
int *status;
{
int pid;
int save_errno;
do {
#ifdef USE_PROC_FS
pid = proc_wait (status);
#else
if (attach_flag)
set_sigint_trap(); /* Causes SIGINT to be passed on to the
attached process. */
pid = wait (status);
#endif
if (pid == -1) /* No more children to wait for */
save_errno = errno;
if (attach_flag)
clear_sigint_trap();
if (pid == -1)
{
fprintf (stderr, "Child process unexpectedly missing.\n");
if (save_errno == EINTR)
continue;
fprintf (stderr, "Child process unexpectedly missing: %s.\n",
safe_strerror (save_errno));
*status = 42; /* Claim it exited with signal 42 */
return -1;
}
} while (pid != inferior_pid); /* Some other child died or stopped */
return pid;
}
#endif /* CHILD_WAIT */
/* Attach to process PID, then initialize for debugging it. */
@ -120,9 +129,9 @@ child_attach (args, from_tty)
exec_file = (char *) get_exec_file (0);
if (exec_file)
printf ("Attaching program `%s', pid %d\n", exec_file, pid);
printf ("Attaching to program `%s', %s\n", exec_file, target_pid_to_str (pid));
else
printf ("Attaching pid %d\n", pid);
printf ("Attaching to %s\n", target_pid_to_str (pid));
fflush (stdout);
}
@ -155,8 +164,8 @@ child_detach (args, from_tty)
char *exec_file = get_exec_file (0);
if (exec_file == 0)
exec_file = "";
printf ("Detaching program: %s pid %d\n",
exec_file, inferior_pid);
printf ("Detaching from program: %s %s\n", exec_file,
target_pid_to_str (inferior_pid));
fflush (stdout);
}
if (args)
@ -190,8 +199,8 @@ static void
child_files_info (ignore)
struct target_ops *ignore;
{
printf ("\tUsing the running image of %s process %d.\n",
attach_flag? "attached": "child", inferior_pid);
printf ("\tUsing the running image of %s %s.\n",
attach_flag? "attached": "child", target_pid_to_str (inferior_pid));
}
/* ARGSUSED */
@ -203,224 +212,40 @@ child_open (arg, from_tty)
error ("Use the \"run\" command to start a Unix child process.");
}
/* Stub function which causes the inferior that runs it, to be ptrace-able
by its parent process. */
static void
ptrace_me ()
{
/* "Trace me, Dr. Memory!" */
call_ptrace (0, 0, (PTRACE_ARG3_TYPE) 0, 0);
}
/* Stub function which causes the GDB that runs it, to start ptrace-ing
the child process. */
static void
ptrace_him (pid)
int pid;
{
push_target (&child_ops);
}
/* Start an inferior Unix child process and sets inferior_pid to its pid.
EXEC_FILE is the file to run.
ALLARGS is a string containing the arguments to the program.
ENV is the environment vector to pass. Errors reported with error(). */
#ifndef SHELL_FILE
#define SHELL_FILE "/bin/sh"
#endif
static void
child_create_inferior (exec_file, allargs, env)
char *exec_file;
char *allargs;
char **env;
{
int pid;
char *shell_command;
char *shell_file;
static char default_shell_file[] = SHELL_FILE;
int len;
int pending_execs;
/* Set debug_fork then attach to the child while it sleeps, to debug. */
static int debug_fork = 0;
/* This is set to the result of setpgrp, which if vforked, will be visible
to you in the parent process. It's only used by humans for debugging. */
static int debug_setpgrp = 657473;
char **save_our_env;
/* If no exec file handed to us, get it from the exec-file command -- with
a good, common error message if none is specified. */
if (exec_file == 0)
exec_file = get_exec_file(1);
/* The user might want tilde-expansion, and in general probably wants
the program to behave the same way as if run from
his/her favorite shell. So we let the shell run it for us.
FIXME, this should probably search the local environment (as
modified by the setenv command), not the env gdb inherited. */
shell_file = getenv ("SHELL");
if (shell_file == NULL)
shell_file = default_shell_file;
len = 5 + strlen (exec_file) + 1 + strlen (allargs) + 1 + /*slop*/ 10;
/* If desired, concat something onto the front of ALLARGS.
SHELL_COMMAND is the result. */
#ifdef SHELL_COMMAND_CONCAT
shell_command = (char *) alloca (strlen (SHELL_COMMAND_CONCAT) + len);
strcpy (shell_command, SHELL_COMMAND_CONCAT);
#else
shell_command = (char *) alloca (len);
shell_command[0] = '\0';
#endif
strcat (shell_command, "exec ");
strcat (shell_command, exec_file);
strcat (shell_command, " ");
strcat (shell_command, allargs);
/* exec is said to fail if the executable is open. */
close_exec_file ();
/* Retain a copy of our environment variables, since the child will
replace the value of environ and if we're vforked, we have to
restore it. */
save_our_env = environ;
/* Tell the terminal handling subsystem what tty we plan to run on;
it will just record the information for later. */
new_tty_prefork (inferior_io_terminal);
/* It is generally good practice to flush any possible pending stdio
output prior to doing a fork, to avoid the possibility of both the
parent and child flushing the same data after the fork. */
fflush (stdout);
fflush (stderr);
#if defined(USG) && !defined(HAVE_VFORK)
pid = fork ();
#else
if (debug_fork)
pid = fork ();
else
pid = vfork ();
#endif
if (pid < 0)
perror_with_name ("vfork");
if (pid == 0)
{
if (debug_fork)
sleep (debug_fork);
#ifdef TIOCGPGRP
/* Run inferior in a separate process group. */
#ifdef NEED_POSIX_SETPGID
debug_setpgrp = setpgid (0, 0);
#else
#if defined(USG) && !defined(SETPGRP_ARGS)
debug_setpgrp = setpgrp ();
#else
debug_setpgrp = setpgrp (getpid (), getpid ());
#endif /* USG */
#endif /* NEED_POSIX_SETPGID */
if (debug_setpgrp == -1)
perror("setpgrp failed in child");
#endif /* TIOCGPGRP */
#ifdef SET_STACK_LIMIT_HUGE
/* Reset the stack limit back to what it was. */
{
struct rlimit rlim;
getrlimit (RLIMIT_STACK, &rlim);
rlim.rlim_cur = original_stack_limit;
setrlimit (RLIMIT_STACK, &rlim);
}
#endif /* SET_STACK_LIMIT_HUGE */
/* Ask the tty subsystem to switch to the one we specified earlier
(or to share the current terminal, if none was specified). */
new_tty ();
/* Changing the signal handlers for the inferior after
a vfork can also change them for the superior, so we don't mess
with signals here. See comments in
initialize_signals for how we get the right signal handlers
for the inferior. */
#ifdef USE_PROC_FS
/* Use SVR4 /proc interface */
proc_set_exec_trap ();
#else
/* "Trace me, Dr. Memory!" */
call_ptrace (0, 0, (PTRACE_ARG3_TYPE) 0, 0);
#endif
/* There is no execlpe call, so we have to set the environment
for our child in the global variable. If we've vforked, this
clobbers the parent, but environ is restored a few lines down
in the parent. By the way, yes we do need to look down the
path to find $SHELL. Rich Pixley says so, and I agree. */
environ = env;
execlp (shell_file, shell_file, "-c", shell_command, (char *)0);
fprintf (stderr, "Cannot exec %s: %s.\n", shell_file,
safe_strerror (errno));
fflush (stderr);
_exit (0177);
}
/* Restore our environment in case a vforked child clob'd it. */
environ = save_our_env;
/* Now that we have a child process, make it our target. */
push_target (&child_ops);
#ifdef CREATE_INFERIOR_HOOK
CREATE_INFERIOR_HOOK (pid);
#endif
/* The process was started by the fork that created it,
but it will have stopped one instruction after execing the shell.
Here we must get it up to actual execution of the real program. */
inferior_pid = pid; /* Needed for wait_for_inferior stuff below */
clear_proceed_status ();
/* We will get a trace trap after one instruction.
Continue it automatically. Eventually (after shell does an exec)
it will get another trace trap. Then insert breakpoints and continue. */
#ifdef START_INFERIOR_TRAPS_EXPECTED
pending_execs = START_INFERIOR_TRAPS_EXPECTED;
#else
pending_execs = 2;
#endif
init_wait_for_inferior ();
/* Set up the "saved terminal modes" of the inferior
based on what modes we are starting it with. */
target_terminal_init ();
/* Install inferior's terminal modes. */
target_terminal_inferior ();
while (1)
{
stop_soon_quietly = 1; /* Make wait_for_inferior be quiet */
wait_for_inferior ();
if (stop_signal != SIGTRAP)
{
/* Let shell child handle its own signals in its own way */
/* FIXME, what if child has exit()ed? Must exit loop somehow */
resume (0, stop_signal);
}
else
{
/* We handle SIGTRAP, however; it means child did an exec. */
if (0 == --pending_execs)
break;
resume (0, 0); /* Just make it go on */
}
}
stop_soon_quietly = 0;
/* We are now in the child process of interest, having exec'd the
correct program, and are poised at the first instruction of the
new program. */
#ifdef SOLIB_CREATE_INFERIOR_HOOK
SOLIB_CREATE_INFERIOR_HOOK (pid);
#endif
/* Pedal to the metal. Away we go. */
fork_inferior (exec_file, allargs, env, ptrace_me, ptrace_him);
/* We are at the first instruction we care about. */
/* Pedal to the metal... */
proceed ((CORE_ADDR) -1, 0, 0);
}
@ -465,6 +290,7 @@ struct target_ops child_ops = {
child_create_inferior, /* to_create_inferior */
child_mourn_inferior, /* to_mourn_inferior */
child_can_run, /* to_can_run */
0, /* to_notice_signals */
process_stratum, /* to_stratum */
0, /* to_next */
1, /* to_has_all_memory */

View file

@ -742,7 +742,7 @@ solib_create_inferior_hook()
stop_signal = 0;
do
{
target_resume (inferior_pid, 0, stop_signal);
target_resume (-1, 0, stop_signal);
wait_for_inferior ();
}
while (stop_signal != SIGTRAP);

File diff suppressed because it is too large Load diff

View file

@ -273,7 +273,8 @@ static char *wait_strings[] = {
};
int
bug_wait (status)
bug_wait (pid, status)
int pid;
WAITTYPE *status;
{
int old_timeout = sr_get_timeout();

View file

@ -664,7 +664,8 @@ hms_resume (pid, step, sig)
storing status in STATUS just as `wait' would. */
int
hms_wait (status)
hms_wait (pid, status)
int pid;
WAITTYPE *status;
{
/* Strings to look for. '?' means match any single character.

View file

@ -75,7 +75,7 @@ static void
mips_resume PARAMS ((int pid, int step, int siggnal));
static int
mips_wait PARAMS ((WAITTYPE *status));
mips_wait PARAMS ((int pid, WAITTYPE *status));
static int
mips_map_regno PARAMS ((int regno));

View file

@ -461,7 +461,8 @@ monitor_resume (pid, step, sig)
*/
static int
monitor_wait (status)
monitor_wait (pid, status)
int pid;
WAITTYPE *status;
{
int old_timeout = timeout;

View file

@ -299,7 +299,8 @@ You may need to reset the 80960 and/or reload your program.\n");
*/
static int
nindy_wait( status )
nindy_wait( pid, status )
int pid;
WAITTYPE *status;
{
fd_set fds;

View file

@ -345,7 +345,8 @@ gdbsim_resume (pid, step, siggnal)
just as `wait' would. */
static int
gdbsim_wait (status)
gdbsim_wait (pid, status)
int pid;
WAITTYPE *status;
{
if (sr_get_debug ())

View file

@ -406,7 +406,8 @@ udi_resume (pid, step, sig)
storing status in STATUS just as `wait' would. */
static int
udi_wait (status)
udi_wait (pid, status)
int pid;
WAITTYPE *status;
{
UDIInt32 MaxTime;

View file

@ -583,6 +583,9 @@ vx_resume (pid, step, siggnal)
Rptrace ptrace_in;
Ptrace_return ptrace_out;
if (pid == -1)
pid = inferior_pid;
if (siggnal != 0 && siggnal != stop_signal)
error ("Cannot send signals to VxWorks processes");
@ -855,7 +858,8 @@ sleep_ms (ms)
*/
static int
vx_wait (status)
vx_wait (pid, status)
int pid;
int *status;
{
register int pid;

View file

@ -210,7 +210,8 @@ sim_detach (args, from_tty)
storing status in STATUS just as `wait' would. */
int
sim_wait (status)
sim_wait (pid, status)
int pid;
WAITTYPE *status;
{
*status = sim_stop_signal ();

View file

@ -51,6 +51,8 @@ static void prune_threads PARAMS ((void));
static void thread_switch PARAMS ((int pid));
static struct thread_info * find_thread_id PARAMS ((int num));
void
init_thread_list ()
{
@ -96,6 +98,32 @@ find_thread_id (num)
return NULL;
}
int
valid_thread_id (num)
int num;
{
struct thread_info *tp;
for (tp = thread_list; tp; tp = tp->next)
if (tp->num == num)
return 1;
return 0;
}
int
pid_to_thread_id (pid)
int pid;
{
struct thread_info *tp;
for (tp = thread_list; tp; tp = tp->next)
if (tp->pid == pid)
return tp->num;
return 0;
}
int
in_thread_list (pid)
int pid;

View file

@ -25,8 +25,12 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
extern void init_thread_list PARAMS ((void));
extern void add_thread PARAMS ((int));
extern void add_thread PARAMS ((int pid));
extern int in_thread_list PARAMS ((int));
extern int in_thread_list PARAMS ((int pid));
extern int pid_to_thread_id PARAMS ((int pid));
extern int valid_thread_id PARAMS ((int thread));
#endif /* THREAD_H */