[1/3] Avoid find_thread_ptid with null_ptid
Commit Message
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
>>>>> "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
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
>>>>> "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
@@ -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 ()
{
@@ -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;
}
@@ -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;
@@ -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 ()
{