diff mbox

Consolidate target_mourn_inferior between GDB and gdbserver

Message ID 1473655918-2101-1-git-send-email-sergiodj@redhat.com
State New
Headers show

Commit Message

Sergio Durigan Junior Sept. 12, 2016, 4:51 a.m. UTC
This patch consolidates the API of target_mourn_inferior between GDB
and gdbserver, in my continuing efforts to make sharing the
fork_inferior function possible between both.

GDB's version of the function did not care about the inferior's ptid
being mourned, but gdbserver's needed to know this information.  Since
it actually makes sense to pass the ptid as an argument, instead of
depending on a global value directly (which GDB's version did), I
decided to make the generic API to accept it.  I then went on and
extended all calls being made on GDB to include a ptid argument (which
ended up being inferior_ptid most of the times, anyway), and now we
have a more sane interface.

On GDB's side, after talking to Pedro a bit about it, we decided that
just an assertion to make sure that the ptid being passed is equal to
inferior_ptid would be enough for now, on the GDB side.  We can remove
the assertion and perform more operations later if we ever pass
anything different than inferior_ptid.

Regression tested on our BuildBot, everything OK.

I'd appreciate a special look at gdb/windows-nat.c's modification
because I wasn't really sure what to do there.  It seemed to me that
maybe I should build a ptid out of the process information there, but
then I am almost sure the assertion on GDB's side would trigger.

gdb/ChangeLog:
2016-09-11  Sergio Durigan Junior  <sergiodj@redhat.com>

	* darwin-nat.c (darwin_kill_inferior): Adjusting call to
	target_mourn_inferior to include ptid_t argument.
	* fork-child.c (startup_inferior): Likewise.
	* gnu-nat.c (gnu_kill_inferior): Likewise.
	* inf-ptrace.c (inf_ptrace_kill): Likewise.
	* infrun.c (handle_inferior_event_1): Likewise.
	* linux-nat.c (linux_nat_attach): Likewise.
	(linux_nat_kill): Likewise.
	* nto-procfs.c (interrupt_query): Likewise.
	(procfs_interrupt): Likewise.
	(procfs_kill_inferior): Likewise.
	* procfs.c (procfs_kill_inferior): Likewise.
	* record.c (record_mourn_inferior): Likewise.
	* remote-sim.c (gdbsim_kill): Likewise.
	* remote.c (remote_detach_1): Likewise.
	(remote_kill): Likewise.
	* target.c (target_mourn_inferior): Change declaration to accept
	new ptid_t argument; use gdb_assert on it.
	* target.h (target_mourn_inferior): Move function prototype from
	here...
	* target/target.h (target_mourn_inferior): ... to here.  Adjust it
	to accept new ptid_t argument.
	* windows-nat.c (get_windows_debug_event): Adjusting call to
	target_mourn_inferior to include ptid_t argument.

gdb/gdbserver/ChangeLog:
2016-09-11  Sergio Durigan Junior  <sergiodj@redhat.com>

	* server.c (start_inferior): Call target_mourn_inferior instead of
	mourn_inferior; pass ptid_t argument to it.
	(resume): Likewise.
	(handle_target_event): Likewise.
	* target.c (target_mourn_inferior): New function.
	* target.h (mourn_inferior): Delete macro.
---
 gdb/darwin-nat.c       | 2 +-
 gdb/fork-child.c       | 4 ++--
 gdb/gdbserver/server.c | 6 +++---
 gdb/gdbserver/target.c | 8 ++++++++
 gdb/gdbserver/target.h | 3 ---
 gdb/gnu-nat.c          | 2 +-
 gdb/inf-ptrace.c       | 2 +-
 gdb/infrun.c           | 2 +-
 gdb/linux-nat.c        | 6 +++---
 gdb/nto-procfs.c       | 4 ++--
 gdb/procfs.c           | 2 +-
 gdb/record.c           | 2 +-
 gdb/remote-sim.c       | 2 +-
 gdb/remote.c           | 6 +++---
 gdb/target.c           | 3 ++-
 gdb/target.h           | 4 +---
 gdb/target/target.h    | 4 ++++
 gdb/windows-nat.c      | 2 +-
 18 files changed, 36 insertions(+), 28 deletions(-)

Comments

Pedro Alves Sept. 15, 2016, 3:51 p.m. UTC | #1
On 09/12/2016 05:51 AM, Sergio Durigan Junior wrote:
> This patch consolidates the API of target_mourn_inferior between GDB
> and gdbserver, in my continuing efforts to make sharing the
> fork_inferior function possible between both.
> 
> GDB's version of the function did not care about the inferior's ptid
> being mourned, but gdbserver's needed to know this information.  Since
> it actually makes sense to pass the ptid as an argument, instead of
> depending on a global value directly (which GDB's version did), I
> decided to make the generic API to accept it.  I then went on and
> extended all calls being made on GDB to include a ptid argument (which
> ended up being inferior_ptid most of the times, anyway), and now we
> have a more sane interface.
> 
> On GDB's side, after talking to Pedro a bit about it, we decided that
> just an assertion to make sure that the ptid being passed is equal to
> inferior_ptid would be enough for now, on the GDB side.  We can remove
> the assertion and perform more operations later if we ever pass
> anything different than inferior_ptid.
> 
> Regression tested on our BuildBot, everything OK.
> 

Thanks, patch is OK.

> I'd appreciate a special look at gdb/windows-nat.c's modification
> because I wasn't really sure what to do there.  It seemed to me that
> maybe I should build a ptid out of the process information there, but
> then I am almost sure the assertion on GDB's side would trigger.

Just leave it passing inferior_ptid like all other places, which is
a no-op.  We're certain the assertion does not fail this way.

Thanks,
Pedro Alves
Sergio Durigan Junior Sept. 19, 2016, 4:19 a.m. UTC | #2
On Thursday, September 15 2016, Pedro Alves wrote:

> On 09/12/2016 05:51 AM, Sergio Durigan Junior wrote:
>> This patch consolidates the API of target_mourn_inferior between GDB
>> and gdbserver, in my continuing efforts to make sharing the
>> fork_inferior function possible between both.
>> 
>> GDB's version of the function did not care about the inferior's ptid
>> being mourned, but gdbserver's needed to know this information.  Since
>> it actually makes sense to pass the ptid as an argument, instead of
>> depending on a global value directly (which GDB's version did), I
>> decided to make the generic API to accept it.  I then went on and
>> extended all calls being made on GDB to include a ptid argument (which
>> ended up being inferior_ptid most of the times, anyway), and now we
>> have a more sane interface.
>> 
>> On GDB's side, after talking to Pedro a bit about it, we decided that
>> just an assertion to make sure that the ptid being passed is equal to
>> inferior_ptid would be enough for now, on the GDB side.  We can remove
>> the assertion and perform more operations later if we ever pass
>> anything different than inferior_ptid.
>> 
>> Regression tested on our BuildBot, everything OK.
>> 
>
> Thanks, patch is OK.
>
>> I'd appreciate a special look at gdb/windows-nat.c's modification
>> because I wasn't really sure what to do there.  It seemed to me that
>> maybe I should build a ptid out of the process information there, but
>> then I am almost sure the assertion on GDB's side would trigger.
>
> Just leave it passing inferior_ptid like all other places, which is
> a no-op.  We're certain the assertion does not fail this way.

Thanks, pushed.

  bc1e6c81d5b77d78282c47f6fd7f697e564a6eb6
Pedro Alves Sept. 19, 2016, 2:39 p.m. UTC | #3
On 09/19/2016 05:19 AM, Sergio Durigan Junior wrote:
> 
> Thanks, pushed.
> 
>   bc1e6c81d5b77d78282c47f6fd7f697e564a6eb6
> 

I'm seeing a regression in mi-exec-run.exp:

-exec-run --start
=breakpoint-created,bkpt={number="1",type="breakpoint",disp="del",enabled="y",addr="0x000000000040059a",func="main",file="/home/pedro/gdb/mygit/src/gdb/testsuite/gdb.mi/mi-
start.c",fullname="/home/pedro/brno/pedro/gdb/mygit/src/gdb/testsuite/gdb.mi/mi-start.c",line="21",thread-groups=["i1"],times="0",original-location="main"}
&"Cannot exec /home/pedro/brno/pedro/gdb/mygit/build/gdb/testsuite/outputs/gdb.mi/mi-exec-run/mi-exec-run.nox.\n"
&"Error: Permission denied\n"
=thread-group-started,id="i1",pid="11317"
=thread-created,id="1",group-id="i1"
~"/home/pedro/gdb/mygit/src/gdb/target.c:2382: internal-error: void target_mourn_inferior(ptid_t): Assertion `ptid_equal (ptid, inferior_ptid)' failed.\nA problem internal 
to GDB has been detected,\nfurther debugging may prove unreliable.\nQuit this debugging session? (y or n) "
saw mi error
FAIL: gdb.mi/mi-exec-run.exp: inferior-tty=main: mi=main: force-fail=1: run failure detected (timeout)


Do you see it too?  Can you take a look?

Thanks,
Pedro Alves
Sergio Durigan Junior Sept. 19, 2016, 5:07 p.m. UTC | #4
On Monday, September 19 2016, Pedro Alves wrote:

> On 09/19/2016 05:19 AM, Sergio Durigan Junior wrote:
>> 
>> Thanks, pushed.
>> 
>>   bc1e6c81d5b77d78282c47f6fd7f697e564a6eb6
>> 
>
> I'm seeing a regression in mi-exec-run.exp:
>
> -exec-run --start
> =breakpoint-created,bkpt={number="1",type="breakpoint",disp="del",enabled="y",addr="0x000000000040059a",func="main",file="/home/pedro/gdb/mygit/src/gdb/testsuite/gdb.mi/mi-
> start.c",fullname="/home/pedro/brno/pedro/gdb/mygit/src/gdb/testsuite/gdb.mi/mi-start.c",line="21",thread-groups=["i1"],times="0",original-location="main"}
> &"Cannot exec /home/pedro/brno/pedro/gdb/mygit/build/gdb/testsuite/outputs/gdb.mi/mi-exec-run/mi-exec-run.nox.\n"
> &"Error: Permission denied\n"
> =thread-group-started,id="i1",pid="11317"
> =thread-created,id="1",group-id="i1"
> ~"/home/pedro/gdb/mygit/src/gdb/target.c:2382: internal-error: void target_mourn_inferior(ptid_t): Assertion `ptid_equal (ptid, inferior_ptid)' failed.\nA problem internal 
> to GDB has been detected,\nfurther debugging may prove unreliable.\nQuit this debugging session? (y or n) "
> saw mi error
> FAIL: gdb.mi/mi-exec-run.exp: inferior-tty=main: mi=main: force-fail=1: run failure detected (timeout)
>
>
> Do you see it too?  Can you take a look?

Hm, that's strange, BuildBot did not catch it...  Anyway, I'll
investigate this right away, thanks for letting me know!
diff mbox

Patch

diff --git a/gdb/darwin-nat.c b/gdb/darwin-nat.c
index 590c2ad..3f54a76 100644
--- a/gdb/darwin-nat.c
+++ b/gdb/darwin-nat.c
@@ -1381,7 +1381,7 @@  darwin_kill_inferior (struct target_ops *ops)
     warning (_("Failed to kill inferior: kill (%d, 9) returned [%s]"),
 	     inf->pid, safe_strerror (errno));
 
-  target_mourn_inferior ();
+  target_mourn_inferior (inferior_ptid);
 }
 
 static void
diff --git a/gdb/fork-child.c b/gdb/fork-child.c
index 3e29a1f..f367507 100644
--- a/gdb/fork-child.c
+++ b/gdb/fork-child.c
@@ -482,7 +482,7 @@  startup_inferior (int ntraps)
 
 	  case TARGET_WAITKIND_SIGNALLED:
 	    target_terminal_ours ();
-	    target_mourn_inferior ();
+	    target_mourn_inferior (resume_ptid);
 	    error (_("During startup program terminated with signal %s, %s."),
 		   gdb_signal_to_name (ws.value.sig),
 		   gdb_signal_to_string (ws.value.sig));
@@ -490,7 +490,7 @@  startup_inferior (int ntraps)
 
 	  case TARGET_WAITKIND_EXITED:
 	    target_terminal_ours ();
-	    target_mourn_inferior ();
+	    target_mourn_inferior (resume_ptid);
 	    if (ws.value.integer)
 	      error (_("During startup program exited with code %d."),
 		     ws.value.integer);
diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index 9c06443..52a38e8 100644
--- a/gdb/gdbserver/server.c
+++ b/gdb/gdbserver/server.c
@@ -294,7 +294,7 @@  start_inferior (char **argv)
       current_thread->last_status = last_status;
     }
   else
-    mourn_inferior (find_process_pid (ptid_get_pid (last_ptid)));
+    target_mourn_inferior (last_ptid);
 
   return signal_pid;
 }
@@ -2776,7 +2776,7 @@  resume (struct thread_resume *actions, size_t num_actions)
 
       if (last_status.kind == TARGET_WAITKIND_EXITED
           || last_status.kind == TARGET_WAITKIND_SIGNALLED)
-        mourn_inferior (find_process_pid (ptid_get_pid (last_ptid)));
+        target_mourn_inferior (last_ptid);
     }
 }
 
@@ -4389,7 +4389,7 @@  handle_target_event (int err, gdb_client_data client_data)
 	  || last_status.kind == TARGET_WAITKIND_SIGNALLED)
 	{
 	  mark_breakpoints_out (process);
-	  mourn_inferior (process);
+	  target_mourn_inferior (last_ptid);
 	}
       else if (last_status.kind == TARGET_WAITKIND_THREAD_EXITED)
 	;
diff --git a/gdb/gdbserver/target.c b/gdb/gdbserver/target.c
index 053629c..cf3da47 100644
--- a/gdb/gdbserver/target.c
+++ b/gdb/gdbserver/target.c
@@ -267,6 +267,14 @@  target_wait (ptid_t ptid, struct target_waitstatus *status, int options)
 /* See target/target.h.  */
 
 void
+target_mourn_inferior (ptid_t ptid)
+{
+  (*the_target->mourn) (find_process_pid (ptid_get_pid (ptid)));
+}
+
+/* See target/target.h.  */
+
+void
 target_continue_no_signal (ptid_t ptid)
 {
   struct thread_resume resume_info;
diff --git a/gdb/gdbserver/target.h b/gdb/gdbserver/target.h
index 4c14c20..26f7422 100644
--- a/gdb/gdbserver/target.h
+++ b/gdb/gdbserver/target.h
@@ -517,9 +517,6 @@  int kill_inferior (int);
 #define detach_inferior(pid) \
   (*the_target->detach) (pid)
 
-#define mourn_inferior(PROC) \
-  (*the_target->mourn) (PROC)
-
 #define mythread_alive(pid) \
   (*the_target->thread_alive) (pid)
 
diff --git a/gdb/gnu-nat.c b/gdb/gnu-nat.c
index c268732..927ee5c 100644
--- a/gdb/gnu-nat.c
+++ b/gdb/gnu-nat.c
@@ -2074,7 +2074,7 @@  gnu_kill_inferior (struct target_ops *ops)
       task_terminate (task->port);
       inf_set_pid (gnu_current_inf, -1);
     }
-  target_mourn_inferior ();
+  target_mourn_inferior (inferior_ptid);
 }
 
 /* Clean up after the inferior dies.  */
diff --git a/gdb/inf-ptrace.c b/gdb/inf-ptrace.c
index 0896cff..64aaabe 100644
--- a/gdb/inf-ptrace.c
+++ b/gdb/inf-ptrace.c
@@ -287,7 +287,7 @@  inf_ptrace_kill (struct target_ops *ops)
   ptrace (PT_KILL, pid, (PTRACE_TYPE_ARG3)0, 0);
   waitpid (pid, &status, 0);
 
-  target_mourn_inferior ();
+  target_mourn_inferior (inferior_ptid);
 }
 
 /* Interrupt the inferior.  */
diff --git a/gdb/infrun.c b/gdb/infrun.c
index 70d7a09..4bd91aa 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -5132,7 +5132,7 @@  Cannot fill $_exitsignal with the correct signal number.\n"));
 	}
 
       gdb_flush (gdb_stdout);
-      target_mourn_inferior ();
+      target_mourn_inferior (inferior_ptid);
       stop_print_frame = 0;
       stop_waiting (ecs);
       return;
diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c
index 7410f8e..a382745 100644
--- a/gdb/linux-nat.c
+++ b/gdb/linux-nat.c
@@ -1245,7 +1245,7 @@  linux_nat_attach (struct target_ops *ops, const char *args, int from_tty)
 	  int exit_code = WEXITSTATUS (status);
 
 	  target_terminal_ours ();
-	  target_mourn_inferior ();
+	  target_mourn_inferior (inferior_ptid);
 	  if (exit_code == 0)
 	    error (_("Unable to attach: program exited normally."));
 	  else
@@ -1257,7 +1257,7 @@  linux_nat_attach (struct target_ops *ops, const char *args, int from_tty)
 	  enum gdb_signal signo;
 
 	  target_terminal_ours ();
-	  target_mourn_inferior ();
+	  target_mourn_inferior (inferior_ptid);
 
 	  signo = gdb_signal_from_host (WTERMSIG (status));
 	  error (_("Unable to attach: program terminated with signal "
@@ -3776,7 +3776,7 @@  linux_nat_kill (struct target_ops *ops)
       iterate_over_lwps (ptid, kill_wait_callback, NULL);
     }
 
-  target_mourn_inferior ();
+  target_mourn_inferior (inferior_ptid);
 }
 
 static void
diff --git a/gdb/nto-procfs.c b/gdb/nto-procfs.c
index f358528..25a9997 100644
--- a/gdb/nto-procfs.c
+++ b/gdb/nto-procfs.c
@@ -726,7 +726,7 @@  interrupt_query (void)
   if (query (_("Interrupted while waiting for the program.\n\
 Give up (and stop debugging it)? ")))
     {
-      target_mourn_inferior ();
+      target_mourn_inferior (inferior_ptid);
       quit ();
     }
 }
@@ -1300,7 +1300,7 @@  procfs_interrupt (struct target_ops *self, ptid_t ptid)
 static void
 procfs_kill_inferior (struct target_ops *ops)
 {
-  target_mourn_inferior ();
+  target_mourn_inferior (inferior_ptid);
 }
 
 /* Fill buf with regset and return devctl cmd to do the setting.  Return
diff --git a/gdb/procfs.c b/gdb/procfs.c
index 0e0641e..fab15ed 100644
--- a/gdb/procfs.c
+++ b/gdb/procfs.c
@@ -4273,7 +4273,7 @@  procfs_kill_inferior (struct target_ops *ops)
 
       if (pi)
 	unconditionally_kill_inferior (pi);
-      target_mourn_inferior ();
+      target_mourn_inferior (inferior_ptid);
     }
 }
 
diff --git a/gdb/record.c b/gdb/record.c
index 1af134f..34ebd1b 100644
--- a/gdb/record.c
+++ b/gdb/record.c
@@ -170,7 +170,7 @@  record_mourn_inferior (struct target_ops *t)
      threads are discarded.  */
   record_unpush (t);
 
-  target_mourn_inferior ();
+  target_mourn_inferior (inferior_ptid);
 }
 
 /* See record.h.  */
diff --git a/gdb/remote-sim.c b/gdb/remote-sim.c
index 11d36eb..6219000 100644
--- a/gdb/remote-sim.c
+++ b/gdb/remote-sim.c
@@ -554,7 +554,7 @@  gdbsim_kill (struct target_ops *ops)
 
   /* There is no need to `kill' running simulator - the simulator is
      not running.  Mourning it is enough.  */
-  target_mourn_inferior ();
+  target_mourn_inferior (inferior_ptid);
 }
 
 /* Load an executable file into the target process.  This is expected to
diff --git a/gdb/remote.c b/gdb/remote.c
index 13258b9e..f3931dc 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -5158,7 +5158,7 @@  remote_detach_1 (const char *args, int from_tty)
   /* If doing detach-on-fork, we don't mourn, because that will delete
      breakpoints that should be available for the followed inferior.  */
   if (!is_fork_parent)
-    target_mourn_inferior ();
+    target_mourn_inferior (inferior_ptid);
   else
     {
       inferior_ptid = null_ptid;
@@ -8903,7 +8903,7 @@  remote_kill (struct target_ops *ops)
       res = remote_vkill (pid, rs);
       if (res == 0)
 	{
-	  target_mourn_inferior ();
+	  target_mourn_inferior (inferior_ptid);
 	  return;
 	}
     }
@@ -8920,7 +8920,7 @@  remote_kill (struct target_ops *ops)
 	 not in extended mode, mourning the inferior also unpushes
 	 remote_ops from the target stack, which closes the remote
 	 connection.  */
-      target_mourn_inferior ();
+      target_mourn_inferior (inferior_ptid);
 
       return;
     }
diff --git a/gdb/target.c b/gdb/target.c
index bca25bd..27de2e8 100644
--- a/gdb/target.c
+++ b/gdb/target.c
@@ -2376,8 +2376,9 @@  default_mourn_inferior (struct target_ops *self)
 }
 
 void
-target_mourn_inferior (void)
+target_mourn_inferior (ptid_t ptid)
 {
+  gdb_assert (ptid_equal (ptid, inferior_ptid));
   current_target.to_mourn_inferior (&current_target);
 
   /* We no longer need to keep handles on any of the object files.
diff --git a/gdb/target.h b/gdb/target.h
index 493a613..b458970 100644
--- a/gdb/target.h
+++ b/gdb/target.h
@@ -1660,9 +1660,7 @@  void target_follow_exec (struct inferior *inf, char *execd_pathname);
    be defined by those targets that require the debugger to perform
    cleanup or internal state changes in response to the process event.  */
 
-/* The inferior process has died.  Do what is right.  */
-
-void target_mourn_inferior (void);
+/* For target_mourn_inferior see target/target.h.  */
 
 /* Does target have enough data to do a run or attach command? */
 
diff --git a/gdb/target/target.h b/gdb/target/target.h
index 972bcb7..be41fa7 100644
--- a/gdb/target/target.h
+++ b/gdb/target/target.h
@@ -86,4 +86,8 @@  extern void target_continue (ptid_t ptid, enum gdb_signal signal);
 extern ptid_t target_wait (ptid_t ptid, struct target_waitstatus *status,
 			   int options);
 
+/* The inferior process has died.  Do what is right.  */
+
+extern void target_mourn_inferior (ptid_t ptid);
+
 #endif /* TARGET_COMMON_H */
diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c
index 0470f31..31a9ecb 100644
--- a/gdb/windows-nat.c
+++ b/gdb/windows-nat.c
@@ -1517,7 +1517,7 @@  get_windows_debug_event (struct target_ops *ops,
       if (!windows_initialization_done)
 	{
 	  target_terminal_ours ();
-	  target_mourn_inferior ();
+	  target_mourn_inferior (inferior_ptid);
 	  error (_("During startup program exited with code 0x%x."),
 		 (unsigned int) current_event.u.ExitProcess.dwExitCode);
 	}