[1/3] Avoid find_thread_ptid with null_ptid

Message ID 20181001103252.5150-2-palves@redhat.com
State New, archived
Headers

Commit Message

Pedro Alves Oct. 1, 2018, 10:32 a.m. UTC
  With a following patch, find_thread_ptid will first find the inferior
for the passed-in ptid, using find_inferior_pid, and then look for the
thread in that inferior's thread list.  If we pass down null_ptid to
find_thread_ptid then that means we'll end up passing 0 to
find_inferior_pid, which hits this assertion:

>   struct inferior *
>   find_inferior_pid (int pid)
>   {
>     struct inferior *inf;
>
>     /* Looking for inferior pid == 0 is always wrong, and indicative of
>	a bug somewhere else.  There may be more than one with pid == 0,
>	for instance.  */
>     gdb_assert (pid != 0);

This patch prepares for the change, by avoiding passing down null_ptid
to find_thread_ptid or to functions that naturally use it, such as the
target_pid_to_str call in inferior.c:add_inferior.  In that latter
case, the patch changes GDB output,

from:
 (gdb) add-inferior
 [New inferior 2 (process 0)]

to:
 (gdb) add-inferior
 [New inferior 2]

which seems like a good change to me.  It might not even make sense to
talk about "process" for the current target, for example.

The python_on_normal_stop change ends up avoiding looking up the
same thread twice (inferior_thread also does a look up).

gdb/ChangeLog:
yyyy-mm-dd  Pedro Alves  <palves@redhat.com>

	* cli/cli-interp.c (cli_on_user_selected_context_changed): Use
	inferior_thread instead of find_thread_ptid, and only when
	inferior_ptid is not null_ptid.
	* inferior.c (add_inferior): Don't include target_pid_to_str
	output when the inferior is not started.
	* python/py-inferior.c (python_on_normal_stop): Don't use
	find_thread_ptid.
	(tui_on_user_selected_context_changed): Use inferior_thread
	instead of find_thread_ptid, and only when inferior_ptid is not
	null_ptid.
---
 gdb/cli/cli-interp.c     |  4 +---
 gdb/inferior.c           | 11 ++++++++---
 gdb/python/py-inferior.c |  4 ++--
 gdb/tui/tui-interp.c     |  4 +---
 4 files changed, 12 insertions(+), 11 deletions(-)
  

Comments

Tom Tromey Oct. 1, 2018, 3:53 p.m. UTC | #1
>>>>> "Pedro" == Pedro Alves <palves@redhat.com> writes:

Pedro> This patch prepares for the change, by avoiding passing down null_ptid
Pedro> to find_thread_ptid or to functions that naturally use it

Should find_thread_ptid assert this?

Pedro>    if (print_inferior_events)
Pedro> -    printf_unfiltered (_("[New inferior %d (%s)]\n"),
Pedro> -		       inf->num,
Pedro> -		       target_pid_to_str (ptid_t (pid)));
Pedro> +    {
Pedro> +      if (pid != 0)
Pedro> +	printf_unfiltered (_("[New inferior %d (%s)]\n"),
Pedro> +			   inf->num,
Pedro> +			   target_pid_to_str (ptid_t (pid)));
Pedro> +      else
Pedro> +	printf_unfiltered (_("[New inferior %d]\n"), inf->num);

I wonder if it is possible for an RSP implementation to say that the
inferior has PID 0.

Tom
  
Pedro Alves Oct. 2, 2018, 5:08 p.m. UTC | #2
On 10/01/2018 04:53 PM, Tom Tromey wrote:
>>>>>> "Pedro" == Pedro Alves <palves@redhat.com> writes:
> 
> Pedro> This patch prepares for the change, by avoiding passing down null_ptid
> Pedro> to find_thread_ptid or to functions that naturally use it
> 
> Should find_thread_ptid assert this?

I didn't think it's useful, since the code will end up like this:

struct thread_info *
find_thread_ptid (ptid_t ptid)
{
  inferior *inf = find_inferior_ptid (ptid);
  if (inf == NULL)
    return NULL;
  return find_thread_ptid (inf, ptid);
}

and null_ptid hits that assertion in:

struct inferior *
find_inferior_pid (int pid)
{
  /* Looking for inferior pid == 0 is always wrong, and indicative of
     a bug somewhere else.  There may be more than one with pid == 0,
     for instance.  */
  gdb_assert (pid != 0);


But I can add it if you prefer.

> 
> Pedro>    if (print_inferior_events)
> Pedro> -    printf_unfiltered (_("[New inferior %d (%s)]\n"),
> Pedro> -		       inf->num,
> Pedro> -		       target_pid_to_str (ptid_t (pid)));
> Pedro> +    {
> Pedro> +      if (pid != 0)
> Pedro> +	printf_unfiltered (_("[New inferior %d (%s)]\n"),
> Pedro> +			   inf->num,
> Pedro> +			   target_pid_to_str (ptid_t (pid)));
> Pedro> +      else
> Pedro> +	printf_unfiltered (_("[New inferior %d]\n"), inf->num);
> 
> I wonder if it is possible for an RSP implementation to say that the
> inferior has PID 0.

GDB would break down badly.  Throughout we assume pid == 0 means the
inferior/process is not started.

The RSP docs say:

"In addition, the remote protocol supports a multiprocess feature in
which the @var{thread-id} syntax is extended to optionally include both
process and thread ID fields, as @samp{p@var{pid}.@var{tid}}.
The @var{pid} (process) and @var{tid} (thread) components each have the
format described above: a positive number with target-specific
                        ^^^^^^^^^^^^^^^^^
interpretation formatted as a big-endian hex string, literal @samp{-1}
to indicate all processes or threads (respectively), or @samp{0} to
                                                     ^^^^^^^^^^^^^^
indicate an arbitrary process or thread.  Specifying just a process, as
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Thanks,
Pedro Alves
  
Tom Tromey Oct. 2, 2018, 9:13 p.m. UTC | #3
>>>>> "Pedro" == Pedro Alves <palves@redhat.com> writes:

[...]
Pedro> But I can add it if you prefer.

No, that's fine.

>> I wonder if it is possible for an RSP implementation to say that the
>> inferior has PID 0.

Pedro> GDB would break down badly.  Throughout we assume pid == 0 means the
Pedro> inferior/process is not started.

Thanks.

Tom
  

Patch

diff --git a/gdb/cli/cli-interp.c b/gdb/cli/cli-interp.c
index 2aa41d6c8b..2d8482fa49 100644
--- a/gdb/cli/cli-interp.c
+++ b/gdb/cli/cli-interp.c
@@ -251,13 +251,11 @@  cli_on_command_error (void)
 static void
 cli_on_user_selected_context_changed (user_selected_what selection)
 {
-  struct thread_info *tp;
-
   /* This event is suppressed.  */
   if (cli_suppress_notification.user_selected_context)
     return;
 
-  tp = find_thread_ptid (inferior_ptid);
+  thread_info *tp = inferior_ptid != null_ptid ? inferior_thread () : NULL;
 
   SWITCH_THRU_ALL_UIS ()
     {
diff --git a/gdb/inferior.c b/gdb/inferior.c
index 17d28c4cf5..394386a4b7 100644
--- a/gdb/inferior.c
+++ b/gdb/inferior.c
@@ -122,9 +122,14 @@  add_inferior (int pid)
   struct inferior *inf = add_inferior_silent (pid);
 
   if (print_inferior_events)
-    printf_unfiltered (_("[New inferior %d (%s)]\n"),
-		       inf->num,
-		       target_pid_to_str (ptid_t (pid)));
+    {
+      if (pid != 0)
+	printf_unfiltered (_("[New inferior %d (%s)]\n"),
+			   inf->num,
+			   target_pid_to_str (ptid_t (pid)));
+      else
+	printf_unfiltered (_("[New inferior %d]\n"), inf->num);
+    }
 
   return inf;
 }
diff --git a/gdb/python/py-inferior.c b/gdb/python/py-inferior.c
index 5bba676478..7f8644b94b 100644
--- a/gdb/python/py-inferior.c
+++ b/gdb/python/py-inferior.c
@@ -86,8 +86,8 @@  python_on_normal_stop (struct bpstats *bs, int print_frame)
   if (!gdb_python_initialized)
     return;
 
-  if (!find_thread_ptid (inferior_ptid))
-      return;
+  if (inferior_ptid == null_ptid)
+    return;
 
   stop_signal = inferior_thread ()->suspend.stop_signal;
 
diff --git a/gdb/tui/tui-interp.c b/gdb/tui/tui-interp.c
index acc8f0371c..a4f3925198 100644
--- a/gdb/tui/tui-interp.c
+++ b/gdb/tui/tui-interp.c
@@ -210,13 +210,11 @@  tui_on_command_error (void)
 static void
 tui_on_user_selected_context_changed (user_selected_what selection)
 {
-  struct thread_info *tp;
-
   /* This event is suppressed.  */
   if (cli_suppress_notification.user_selected_context)
     return;
 
-  tp = find_thread_ptid (inferior_ptid);
+  thread_info *tp = inferior_ptid != null_ptid ? inferior_thread () : NULL;
 
   SWITCH_THRU_ALL_UIS ()
     {