This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [RFA 02/08] multi-process support: all targets manage inferior list
On Thursday 18 September 2008 23:51:18, Daniel Jacobowitz wrote:
> On Fri, Sep 12, 2008 at 04:38:18PM +0100, Pedro Alves wrote:
> > @@ -662,6 +662,9 @@ go32_create_inferior (char *exec_file, c
> > #endif
> >
> > inferior_ptid = pid_to_ptid (SOME_PID);
> > + add_inferior (SOME_PID);
> > + add_thread_silent (inferior_ptid);
> > +
> > push_target (&go32_ops);
> >
> > add_thread_silent (inferior_ptid);
>
> Is the new add_thread_silent a typo, or did you mean to remove the
> second call?
Just a typo. Thanks. Fixed.
> This looks otherwise OK (though I don't understand when you use
> add_inferior vs add_inferior_silent).
Hmmm, the initial thought was somewhat similar to the
use of add_thread_silent in targets that didn't add the main thread
to the list because they don't support multi-threads. (monitor,
remote-sim). As in, don't emit a CLI note notification if
the target pid was made up by GDB and thus should not be visible
to the user, and emit if otherwise. This one seems to have been
missed by that logic.
But I agree that this sounds somewhat bogus. It should be the
the target that should decide what to print... I'll need
to do a few further adjustments for that to be possible
though. These CLI notifications are off by default, so we
can either get rid of add_inferior_silent, or make
go32-nat.c also use it. Any preference? The attached does
the latter.
--
Pedro Alves
2008-09-19 Pedro Alves <pedro@codesourcery.com>
* gnu-nat.c (gnu_attach): Add process to inferiors table.
(gnu_detach): Remove it.
* go32-nat.c (go32_create_inferior): Add process to gdb's inferior
table.
* inf-ptrace.c (inf_ptrace_follow_fork): Delete and add inferiors
to inferior table accordingly.
(inf_ptrace_attach): Add new process to inferior table.
(inf_ptrace_detach): Remove it.
* inf-ttrace.c (inf_ttrace_follow_fork): Delete and add inferiors
to inferior table accordingly.
(inf_ttrace_attach): Add process to inferior table.
(inf_ttrace_detach): Remove it.
* linux-fork.c (init_fork_list): Delete any left over inferior.
(linux_fork_mourn_inferior, detach_fork_command): Also delete
processes from inferior list.
* monitor.c (monitor_open): Add process to inferior list.
(monitor_close): Remove it.
* nto-procfs.c (procfs_attach): Add process to inferior list.
Find threads after pushing the target.
(procfs_detach): Remove process from inferior list.
(procfs_create_inferior): Add process to inferior list.
* procfs.c (procfs_detach): Remove process from inferior list.
(do_attach): Add process to inferior list.
* remote-sim.c (sim_create_inferior): Add process to inferior list.
(gdbsim_close): Remove it.
* target.c (generic_mourn_inferior): If inferior_ptid is not
null_ptid, remove the corresponding inferior from inferior list.
* win32-nat.c (do_initial_win32_stuff): Add process to inferior list.
(win32_detach): Remove it.
* linux-nat.c (linux_child_follow_fork): Delete and add inferiors
to inferior list accordingly.
* fork-child.c (fork_inferior): Add process to inferior list.
* corelow.c (CORELOW_PID): Define.
(core_close): Remove core from inferior list.
(core_open): Add it.
---
gdb/corelow.c | 9 +++++++--
gdb/fork-child.c | 2 ++
gdb/gnu-nat.c | 7 +++++++
gdb/go32-nat.c | 2 ++
gdb/inf-ptrace.c | 11 +++++++++--
gdb/inf-ttrace.c | 10 ++++++++--
gdb/linux-fork.c | 7 +++++++
gdb/linux-nat.c | 10 +++++++++-
gdb/monitor.c | 2 ++
gdb/nto-procfs.c | 13 +++++++++++--
gdb/procfs.c | 4 +++-
gdb/remote-sim.c | 2 ++
gdb/target.c | 9 +++++++++
gdb/win32-nat.c | 5 +++++
14 files changed, 83 insertions(+), 10 deletions(-)
Index: src/gdb/gnu-nat.c
===================================================================
--- src.orig/gdb/gnu-nat.c 2008-09-19 13:57:04.000000000 +0100
+++ src/gdb/gnu-nat.c 2008-09-19 14:35:03.000000000 +0100
@@ -2173,6 +2173,8 @@ gnu_attach (char *args, int from_tty)
push_target (&gnu_ops);
+ add_inferior (pid);
+
inf_update_procs (inf);
inferior_ptid = ptid_build (pid, 0, inf_pick_first_thread ());
@@ -2206,6 +2208,8 @@ gnu_attach (char *args, int from_tty)
static void
gnu_detach (char *args, int from_tty)
{
+ int pid;
+
if (from_tty)
{
char *exec_file = get_exec_file (0);
@@ -2217,9 +2221,12 @@ gnu_detach (char *args, int from_tty)
gdb_flush (gdb_stdout);
}
+ pid = current_inferior->pid;
+
inf_detach (current_inferior);
inferior_ptid = null_ptid;
+ detach_inferior (pid);
unpush_target (&gnu_ops); /* Pop out of handling an inferior */
}
Index: src/gdb/go32-nat.c
===================================================================
--- src.orig/gdb/go32-nat.c 2008-09-19 13:57:04.000000000 +0100
+++ src/gdb/go32-nat.c 2008-09-19 14:55:15.000000000 +0100
@@ -662,6 +662,8 @@ go32_create_inferior (char *exec_file, c
#endif
inferior_ptid = pid_to_ptid (SOME_PID);
+ add_inferior_silent (SOME_PID);
+
push_target (&go32_ops);
add_thread_silent (inferior_ptid);
Index: src/gdb/inf-ptrace.c
===================================================================
--- src.orig/gdb/inf-ptrace.c 2008-09-19 13:57:04.000000000 +0100
+++ src/gdb/inf-ptrace.c 2008-09-19 14:35:03.000000000 +0100
@@ -89,11 +89,14 @@ inf_ptrace_follow_fork (struct target_op
if (ptrace (PT_DETACH, pid, (PTRACE_TYPE_ARG3)1, 0) == -1)
perror_with_name (("ptrace"));
+ /* Switch inferior_ptid out of the parent's way. */
+ inferior_ptid = pid_to_ptid (fpid);
+
/* Delete the parent. */
- delete_thread_silent (last_tp->ptid);
+ detach_inferior (pid);
/* Add the child. */
- inferior_ptid = pid_to_ptid (fpid);
+ add_inferior (fpid);
tp = add_thread_silent (inferior_ptid);
tp->step_resume_breakpoint = step_resume_breakpoint;
@@ -111,6 +114,7 @@ inf_ptrace_follow_fork (struct target_op
if (ptrace (PT_DETACH, fpid, (PTRACE_TYPE_ARG3)1, 0) == -1)
perror_with_name (("ptrace"));
+ detach_inferior (pid);
}
return 0;
@@ -247,6 +251,8 @@ inf_ptrace_attach (char *args, int from_
inferior_ptid = pid_to_ptid (pid);
+ add_inferior (pid);
+
/* Always add a main thread. If some target extends the ptrace
target, it should decorate the ptid later with more info. */
add_thread_silent (inferior_ptid);
@@ -307,6 +313,7 @@ inf_ptrace_detach (char *args, int from_
#endif
inferior_ptid = null_ptid;
+ detach_inferior (pid);
unpush_target (ptrace_ops_hack);
}
Index: src/gdb/inf-ttrace.c
===================================================================
--- src.orig/gdb/inf-ttrace.c 2008-09-19 13:57:04.000000000 +0100
+++ src/gdb/inf-ttrace.c 2008-09-19 14:35:03.000000000 +0100
@@ -468,6 +468,7 @@ inf_ttrace_follow_fork (struct target_op
last_tp->step_resume_breakpoint = NULL;
inferior_ptid = ptid_build (fpid, flwpid, 0);
+ add_inferior (fpid);
detach_breakpoints (pid);
target_terminal_ours ();
@@ -537,8 +538,9 @@ Detaching after fork from child process
/* Delete parent. */
delete_thread_silent (ptid_build (pid, lwpid, 0));
+ detach_inferior (pid);
- /* Add child. inferior_ptid was already set above. */
+ /* Add child thread. inferior_ptid was already set above. */
ti = add_thread_silent (inferior_ptid);
ti->private =
xmalloc (sizeof (struct inf_ttrace_private_thread_info));
@@ -742,6 +744,8 @@ inf_ttrace_attach (char *args, int from_
perror_with_name (("ttrace"));
attach_flag = 1;
+ add_inferior (pid);
+
/* Set the initial event mask. */
memset (&tte, 0, sizeof (tte));
tte.tte_events |= TTEVT_EXEC | TTEVT_EXIT | TTEVT_FORK | TTEVT_VFORK;
@@ -796,8 +800,10 @@ inf_ttrace_detach (char *args, int from_
inf_ttrace_num_lwps = 0;
inf_ttrace_num_lwps_in_syscall = 0;
- unpush_target (ttrace_ops_hack);
inferior_ptid = null_ptid;
+ detach_inferior (pid);
+
+ unpush_target (ttrace_ops_hack);
}
static void
Index: src/gdb/linux-fork.c
===================================================================
--- src.orig/gdb/linux-fork.c 2008-09-19 13:57:04.000000000 +0100
+++ src/gdb/linux-fork.c 2008-09-19 14:35:03.000000000 +0100
@@ -210,6 +210,7 @@ init_fork_list (void)
for (fp = fork_list; fp; fp = fpnext)
{
fpnext = fp->next;
+ delete_inferior (ptid_get_pid (fp->ptid));
free_fork (fp);
}
@@ -369,6 +370,8 @@ linux_fork_mourn_inferior (void)
We need to delete that one from the fork_list, and switch
to the next available fork. */
delete_fork (inferior_ptid);
+ /* Delete process from GDB's inferior list. */
+ delete_inferior (ptid_get_pid (inferior_ptid));
/* There should still be a fork - if there's only one left,
delete_fork won't remove it, because we haven't updated
@@ -408,6 +411,8 @@ delete_fork_command (char *args, int fro
printf_filtered (_("Killed %s\n"), target_pid_to_str (ptid));
delete_fork (ptid);
+ /* Delete process from GDB's inferior list. */
+ delete_inferior (ptid_get_pid (ptid));
}
static void
@@ -432,6 +437,8 @@ detach_fork_command (char *args, int fro
printf_filtered (_("Detached %s\n"), target_pid_to_str (ptid));
delete_fork (ptid);
+ /* Delete process from GDB's process table. */
+ detach_inferior (ptid_get_pid (ptid));
}
/* Print information about currently known forks. */
Index: src/gdb/monitor.c
===================================================================
--- src.orig/gdb/monitor.c 2008-09-19 13:57:04.000000000 +0100
+++ src/gdb/monitor.c 2008-09-19 14:35:03.000000000 +0100
@@ -817,6 +817,7 @@ monitor_open (char *args, struct monitor
/* Make run command think we are busy... */
inferior_ptid = monitor_ptid;
+ add_inferior_silent (ptid_get_pid (inferior_ptid));
add_thread_silent (inferior_ptid);
/* Give monitor_wait something to read */
@@ -845,6 +846,7 @@ monitor_close (int quitting)
monitor_desc = NULL;
delete_thread_silent (monitor_ptid);
+ delete_inferior_silent (ptid_get_pid (monitor_ptid));
}
/* Terminate the open connection to the remote debugger. Use this
Index: src/gdb/nto-procfs.c
===================================================================
--- src.orig/gdb/nto-procfs.c 2008-09-19 13:57:04.000000000 +0100
+++ src/gdb/nto-procfs.c 2008-09-19 14:42:10.000000000 +0100
@@ -535,8 +535,11 @@ procfs_attach (char *args, int from_tty)
gdb_flush (gdb_stdout);
}
inferior_ptid = do_attach (pid_to_ptid (pid));
- procfs_find_new_threads ();
+ add_inferior (pid);
+
push_target (&procfs_ops);
+
+ procfs_find_new_threads ();
}
static void
@@ -770,6 +773,7 @@ static void
procfs_detach (char *args, int from_tty)
{
int siggnal = 0;
+ int pid;
if (from_tty)
{
@@ -788,9 +792,12 @@ procfs_detach (char *args, int from_tty)
close (ctl_fd);
ctl_fd = -1;
- init_thread_list ();
+
+ pid = ptid_get_pid (inferior_ptid);
inferior_ptid = null_ptid;
attach_flag = 0;
+ detach_inferior (pid);
+ init_thread_list ();
unpush_target (&procfs_ops); /* Pop out of handling an inferior. */
}
@@ -1077,7 +1084,9 @@ procfs_create_inferior (char *exec_file,
inferior_ptid = do_attach (pid_to_ptid (pid));
+ add_inferior (pid);
attach_flag = 0;
+
flags = _DEBUG_FLAG_KLC; /* Kill-on-Last-Close flag. */
errn = devctl (ctl_fd, DCMD_PROC_SET_FLAG, &flags, sizeof (flags), 0);
if (errn != EOK)
Index: src/gdb/procfs.c
===================================================================
--- src.orig/gdb/procfs.c 2008-09-19 13:57:04.000000000 +0100
+++ src/gdb/procfs.c 2008-09-19 14:35:03.000000000 +0100
@@ -3634,13 +3634,13 @@ static void
procfs_detach (char *args, int from_tty)
{
int sig = 0;
+ int pid = PIDGET (inferior_ptid);
if (args)
sig = atoi (args);
if (from_tty)
{
- int pid = PIDGET (inferior_ptid);
char *exec_file;
exec_file = get_exec_file (0);
@@ -3655,6 +3655,7 @@ procfs_detach (char *args, int from_tty)
do_detach (sig);
inferior_ptid = null_ptid;
+ detach_inferior (pid);
unpush_target (&procfs_ops);
}
@@ -3711,6 +3712,7 @@ do_attach (ptid_t ptid)
if ((fail = procfs_debug_inferior (pi)) != 0)
dead_procinfo (pi, "do_attach: failed in procfs_debug_inferior", NOKILL);
+ add_inferior (pi->pid);
/* Let GDB know that the inferior was attached. */
attach_flag = 1;
Index: src/gdb/remote-sim.c
===================================================================
--- src.orig/gdb/remote-sim.c 2008-09-19 13:57:04.000000000 +0100
+++ src/gdb/remote-sim.c 2008-09-19 14:35:03.000000000 +0100
@@ -480,6 +480,7 @@ gdbsim_create_inferior (char *exec_file,
sim_create_inferior (gdbsim_desc, exec_bfd, argv, env);
inferior_ptid = remote_sim_ptid;
+ add_inferior_silent (ptid_get_pid (inferior_ptid);
add_thread_silent (inferior_ptid);
target_mark_running (&gdbsim_ops);
@@ -591,6 +592,7 @@ gdbsim_close (int quitting)
end_callbacks ();
generic_mourn_inferior ();
delete_thread_silent (remote_sim_ptid);
+ delete_inferior_silent (ptid_get_pid (remote_sim_ptid));
}
/* Takes a program previously attached to and detaches it.
Index: src/gdb/target.c
===================================================================
--- src.orig/gdb/target.c 2008-09-19 13:57:04.000000000 +0100
+++ src/gdb/target.c 2008-09-19 14:35:03.000000000 +0100
@@ -2338,8 +2338,17 @@ void
generic_mourn_inferior (void)
{
extern int show_breakpoint_hit_counts;
+ ptid_t ptid;
+ ptid = inferior_ptid;
inferior_ptid = null_ptid;
+
+ if (!ptid_equal (ptid, null_ptid))
+ {
+ int pid = ptid_get_pid (ptid);
+ delete_inferior (pid);
+ }
+
attach_flag = 0;
breakpoint_init_inferior (inf_exited);
registers_changed ();
Index: src/gdb/win32-nat.c
===================================================================
--- src.orig/gdb/win32-nat.c 2008-09-19 13:57:04.000000000 +0100
+++ src/gdb/win32-nat.c 2008-09-19 14:35:03.000000000 +0100
@@ -1544,6 +1544,8 @@ do_initial_win32_stuff (DWORD pid)
clear_proceed_status ();
init_wait_for_inferior ();
+ add_inferior (pid);
+
terminal_init_inferior_with_pgrp (pid);
target_terminal_inferior ();
@@ -1756,7 +1758,10 @@ win32_detach (char *args, int from_tty)
current_event.dwProcessId);
gdb_flush (gdb_stdout);
}
+
inferior_ptid = null_ptid;
+ detach_inferior (current_event.dwProcessId);
+
unpush_target (&win32_ops);
}
Index: src/gdb/linux-nat.c
===================================================================
--- src.orig/gdb/linux-nat.c 2008-09-19 13:57:04.000000000 +0100
+++ src/gdb/linux-nat.c 2008-09-19 14:42:05.000000000 +0100
@@ -711,6 +711,10 @@ linux_child_follow_fork (struct target_o
else
{
struct fork_info *fp;
+
+ /* Add process to GDB's tables. */
+ add_inferior (child_pid);
+
/* Retain child fork in ptrace (stopped) state. */
fp = find_fork_pid (child_pid);
if (!fp)
@@ -822,7 +826,10 @@ linux_child_follow_fork (struct target_o
safely resume it. */
if (has_vforked)
- linux_parent_pid = parent_pid;
+ {
+ linux_parent_pid = parent_pid;
+ detach_inferior (parent_pid);
+ }
else if (!detach_fork)
{
struct fork_info *fp;
@@ -836,6 +843,7 @@ linux_child_follow_fork (struct target_o
target_detach (NULL, 0);
inferior_ptid = ptid_build (child_pid, child_pid, 0);
+ add_inferior (child_pid);
/* Reinstall ourselves, since we might have been removed in
target_detach (which does other necessary cleanup). */
Index: src/gdb/fork-child.c
===================================================================
--- src.orig/gdb/fork-child.c 2008-09-19 13:57:04.000000000 +0100
+++ src/gdb/fork-child.c 2008-09-19 14:35:03.000000000 +0100
@@ -394,6 +394,8 @@ fork_inferior (char *exec_file_arg, char
init_thread_list ();
+ add_inferior (pid);
+
/* Needed for wait_for_inferior stuff below. */
inferior_ptid = pid_to_ptid (pid);
Index: src/gdb/corelow.c
===================================================================
--- src.orig/gdb/corelow.c 2008-09-19 13:57:04.000000000 +0100
+++ src/gdb/corelow.c 2008-09-19 14:35:03.000000000 +0100
@@ -93,6 +93,9 @@ void _initialize_corelow (void);
struct target_ops core_ops;
+/* An arbitrary identifier for the core inferior. */
+#define CORELOW_PID 1
+
/* Link a new core_fns into the global core_file_fns list. Called on gdb
startup by the _initialize routine in each core file register reader, to
register information about each format the the reader is prepared to
@@ -197,6 +200,7 @@ core_close (int quitting)
if (core_bfd)
{
inferior_ptid = null_ptid; /* Avoid confusion from thread stuff */
+ delete_inferior_silent (CORELOW_PID);
/* Clear out solib state while the bfd is still open. See
comments in clear_solib in solib.c. */
@@ -270,8 +274,7 @@ core_open (char *filename, int from_tty)
bfd *temp_bfd;
int scratch_chan;
int flags;
- /* An arbitrary identifier for the core inferior. */
- int corelow_pid = 1;
+ int corelow_pid = CORELOW_PID;
target_preopen (from_tty);
if (!filename)
@@ -355,6 +358,8 @@ core_open (char *filename, int from_tty)
push_target (&core_ops);
discard_cleanups (old_chain);
+ add_inferior_silent (corelow_pid);
+
/* Do this before acknowledging the inferior, so if
post_create_inferior throws (can happen easilly if you're loading
a core file with the wrong exec), we aren't left with threads