[PATCH v4 27/44] gdb, linux-nat: use current_inferior()->pid in mourn_inferior()

Markus Metzger <[email protected]>
Newsgroups gmane.comp.gdb.patches
Message-ID <[email protected]>
In infrun.c:handle_process_exited(), we switch to either the eventing
thread or the eventing process depending on the ptid we get for the event:

    static void
    handle_process_exited (execution_control_state *ecs)
    {
      /* Depending on the system, ecs->ptid may point to a thread or to a
         process.  On some targets, target_mourn_inferior may need to have
         access to the just-exited thread.  That is the case of
         GNU/Linux's "checkpoint" support, for example.  Switch context
         appropriately.  */
      thread_info *thr = ecs->target->find_thread (ecs->ptid);
      if (thr != nullptr)
        switch_to_thread (thr);
      else
        {
          inferior *inf = find_inferior_ptid (ecs->target, ecs->ptid);
          switch_to_inferior_no_thread (inf);
        }

While target_mourn_inferior() takes a ptid argument that could be set to
the event ptid, the actual mourn_inferior() target method does not take
any argument.  Almost all targets use current_inferior() to determine
which inferior to mourn.

The linux-nat target, however, uses inferior_ptid.pid(), which is zero
when switching to the event inferior and no thread, so it ended up not
finding the exited inferior's LWPs when the event is delivered with a
process ptid instead of a thread ptid.

Change linux-nat to use current_inferior() like everybody else.

I considered passing the ptid argument of target_mourn_inferior() down to
the target methods to not rely on global state.  To do this right, we'd
need to not rely on current_inferior() inside the targets and instead find
the inferior based on the ptid argument.  Or pass it down since the caller
most likely already has an inferior pointer.

This has been exposed by gdb.multi/multi-exit.exp on a subsequent patch
that introduces inferior events to allow deleting the last thread of an
inferior.
---
 gdb/linux-nat.c | 5 +++--
 gdb/target.c    | 3 ++-
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c
index 8840dbe3f75..9e015b57379 100644
--- a/gdb/linux-nat.c
+++ b/gdb/linux-nat.c
@@ -3732,13 +3732,14 @@ linux_nat_target::mourn_inferior ()
 {
   LINUX_NAT_SCOPED_DEBUG_ENTER_EXIT;
 
-  int pid = inferior_ptid.pid ();
+  inferior *inf = current_inferior ();
+  int pid = inf->pid;
 
   purge_lwp_list (pid);
 
   close_proc_mem_file (pid);
 
-  if (! forks_exist_p (current_inferior ()))
+  if (! forks_exist_p (inf))
     /* Normal case, no other forks available.  */
     inf_ptrace_target::mourn_inferior ();
   else
diff --git a/gdb/target.c b/gdb/target.c
index a41735ef888..35d39161495 100644
--- a/gdb/target.c
+++ b/gdb/target.c
@@ -2767,7 +2767,8 @@ default_mourn_inferior (struct target_ops *self)
 void
 target_mourn_inferior (ptid_t ptid)
 {
-  gdb_assert (ptid.pid () == inferior_ptid.pid ());
+  gdb_assert (ptid == null_ptid || ptid.pid () == current_inferior ()->pid);
+  gdb_assert (ptid == null_ptid || ptid.pid () == inferior_ptid.pid ());
   current_inferior ()->top_target ()->mourn_inferior ();
 }
 
-- 
2.43.0

________________________________________
Intel Deutschland GmbH 

Registered Address: Dornacher Strasse 1, 85622 Feldkirchen, Germany 

Tel: +49 (89) 99143-0 

www.intel.de 

Managing Directors: Candice Moore, Jeffrey Schneiderman, Ramachandran Sitaraman

Chairperson of the Supervisory Board: Sonja Pierer

Registered Seat: Munich Commercial Register B: Amtsgericht Munich HRB 186928

This e-mail and any attachments may contain confidential material for
the sole use of the intended recipient(s). Any review or distribution
by others is strictly prohibited. If you are not the intended
recipient, please contact the sender and delete all copies.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.