From: Simon Marchi via Gdb-patches <gdb-patches@sourceware.org>
To: Pedro Alves <pedro@palves.net>, gdb-patches@sourceware.org
Subject: Re: [PATCH 07/11] gdb: maintain per-process-target list of resumed threads with pending wait status
Date: Tue, 6 Jul 2021 17:25:47 -0400 [thread overview]
Message-ID: <252f2a84-c7b4-d07a-fecc-c57685a89ee1@polymtl.ca> (raw)
In-Reply-To: <52c8488e-fef2-a1fe-d150-50d510bedbe1@palves.net>
>> In set_thread_exited, we try to remove the thread from the list, because
>> keeping an exited thread in that list would make no sense (especially if
>> the thread is freed). My first implementation assumed that a process
>> stratum target was always present when set_thread_exited is called.
>> That's however, not the case: in some cases, targets unpush themselves
>> from an inferior and then call "exit_inferior", which exits all the
>> threads. If the target is unpushed before set_thread_exited is called
>> on the threads, it means we could mistakenly leave some threads in the
>> list. I tried to see how hard it would be to make it such that targets
>> have to exit all threads before unpushing themselves from the inferior
>> (that would seem logical to me, we don't want threads belonging to an
>> inferior that has no process target). That seem quite difficult and not
>> worth the time. Instead, I changed inferior::unpush_target to remove an
>> threads of that inferior from the list.
>
> "remove an threads" -> "remove all threads" ?
Yes, fixed.
>> @@ -470,6 +469,10 @@ class thread_info : public refcounted_object,
>> linked. */
>> intrusive_list_node<thread_info> step_over_list_node;
>>
>> + /* Node for list of threads that are resumed and have a pending wait
>> + status. */
>
> Maybe mention that all threads in list list belong to the same
> process_stratum_target ?
Sounds good, changed to:
/* Node for list of threads that are resumed and have a pending wait status.
The list head for this is in process_stratum_target, hence all threads in
this list belong to that process target. */
intrusive_list_node<thread_info> resumed_with_pending_wait_status_node;
>> @@ -89,6 +89,25 @@ inferior::inferior (int pid_)
>> m_target_stack.push (get_dummy_target ());
>> }
>>
>> +/* See inferior.h. */
>> +
>> +int
>> +inferior::unpush_target (struct target_ops *t)
>> +{
>> + /* If unpushing the process stratum target while threads exists, ensure that
>
> "threads exists" -> "threads exist"
Done.
>> + we don't leave any threads of this inferior in the target's "resumed with
>> + pending wait status" list. */
>> + if (t->stratum () == process_stratum)
>> + {
>> + process_stratum_target *proc_target = as_process_stratum_target (t);
>> +
>> + for (thread_info *thread : this->non_exited_threads ())
>> + proc_target->maybe_remove_resumed_with_pending_wait_status (thread);
>
> Note the target_pid_to_str call inside maybe_remove_resumed_with_pending_wait_status
> adds back a dependency on current_inferior.
Arggg, we don't want that. Since that is in a process_stratum_target
method, I'll change the message to call the pid_to_str method of the
current object instead:
infrun_debug_printf ("removing from resumed threads with event list: %s",
this->pid_to_str (thread->ptid).c_str ());
Does that sound good?
>> --- a/gdb/process-stratum-target.c
>> +++ b/gdb/process-stratum-target.c
>> @@ -106,6 +106,40 @@ process_stratum_target::follow_exec (inferior *follow_inf, ptid_t ptid,
>>
>> /* See process-stratum-target.h. */
>>
>> +void
>> +process_stratum_target::maybe_add_resumed_with_pending_wait_status
>> + (thread_info *thread)
>> +{
>> + gdb_assert (!thread->resumed_with_pending_wait_status_node.is_linked ());
>> +
>> + if (thread->resumed () && thread->has_pending_waitstatus ())
>> + {
>> + infrun_debug_printf ("adding to resumed threads with event list: %s",
>> + target_pid_to_str (thread->ptid).c_str ());
>
> This here too. Not 100% sure this target call is always done
> with the right target stack selected.
I'd make the same change to use this->pid_to_str here too.
>
>> + m_resumed_with_pending_wait_status.push_back (*thread);
>> + }
>> +}
>> +
>> +/* See process-stratum-target.h. */
>> +
>
>> +
>> +private:
>> + /* List of threads managed by this target which simultaneously are resumed
>> + and have a pending wait status. */
>
> I'd suggest expanding this comment a little to mention this
> is done for optimization reasons, to avoid walking
> thread lists, something like that. Or maybe say that in
> the thread_info node. Or both places.
Done:
/* List of threads managed by this target which simultaneously are resumed
and have a pending wait status.
This is done for optimization reasons, it would be possible to walk the
inferior thread lists to find these threads. But since this is something
we need to do quite frequently in the hot path, maintaining this list
avoids walking the thread lists repeatedly. */
I would prefer to avoid repeating the same thing at two places, because
it's a recipe for the two places getting out of sync. Since the node
comment in thread_info now points to here (says the list head is in
process_stratum_target), people looking for more information about this
list should have no problem finding the comment here.
>
>> + thread_info_resumed_with_pending_wait_status_list
>> + m_resumed_with_pending_wait_status;
>> };
>>
>> /* Downcast TARGET to process_stratum_target. */
>> diff --git a/gdb/thread.c b/gdb/thread.c
>> index 289d33c74c3b..26974e1b8cbc 100644
>> --- a/gdb/thread.c
>> +++ b/gdb/thread.c
>> @@ -188,6 +188,10 @@ set_thread_exited (thread_info *tp, bool silent)
>>
>> if (tp->state != THREAD_EXITED)
>> {
>> + process_stratum_target *proc_target = tp->inf->process_target ();
>> + if (proc_target != nullptr)
>
> I think this check needs a comment.
Done:
/* Some targets unpush themselves from the inferior's target stack before
clearing the inferior's thread list (which marks all threads as exited,
and therefore leads to this function). In this case, the inferior's
process target will be nullptr when we arrive here.
See also the comment in inferior::unpush_target. */
And I also added a cross-reference to here from the comment in
inferior::unpush_target.
>> + /* If we transition from not resumed to resumed, we might need to add
>> + the thread to the resumed threads with pending statuses list. */
>> + if (resumed)
>> + proc_target->maybe_add_resumed_with_pending_wait_status (this);
>
> Longest function name award goes to... ;-)
Indeed! If you have a name that is shorter but just as clear, I'm open
for suggestion. But I prefer names that are non-ambiguous and use the
right terminology over names that are short just for convenience's sake.
Thanks!
Simon
next prev parent reply other threads:[~2021-07-06 21:26 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-22 16:56 [PATCH 00/11] Various thread lists optimizations Simon Marchi via Gdb-patches
2021-06-22 16:56 ` [PATCH 01/11] gdb: introduce iterator_range, remove next_adapter Simon Marchi via Gdb-patches
2021-07-05 15:41 ` Pedro Alves
2021-07-06 19:16 ` Simon Marchi via Gdb-patches
2021-06-22 16:56 ` [PATCH 02/11] gdb: introduce intrusive_list, make thread_info use it Simon Marchi via Gdb-patches
2021-06-22 23:13 ` Lancelot SIX via Gdb-patches
2021-06-23 0:48 ` Simon Marchi via Gdb-patches
2021-07-05 15:44 ` Pedro Alves
2021-07-06 19:38 ` Simon Marchi via Gdb-patches
2021-07-06 20:45 ` Simon Marchi via Gdb-patches
2021-07-06 21:04 ` Pedro Alves
2021-07-06 21:38 ` Simon Marchi via Gdb-patches
2021-07-06 21:02 ` Pedro Alves
2021-07-06 21:45 ` Simon Marchi via Gdb-patches
2021-07-07 11:46 ` Pedro Alves
2021-07-07 13:52 ` Simon Marchi via Gdb-patches
2021-06-22 16:56 ` [PATCH 03/11] gdb: make inferior_list use intrusive_list Simon Marchi via Gdb-patches
2021-07-05 15:44 ` Pedro Alves
2021-07-14 6:34 ` Tom de Vries
2021-07-14 16:11 ` Simon Marchi via Gdb-patches
2021-07-14 20:15 ` [PATCH] gdb: make all_inferiors_safe actually work Simon Marchi via Gdb-patches
2021-07-15 10:15 ` Tom de Vries
2021-07-17 12:54 ` Simon Marchi via Gdb-patches
2021-06-22 16:56 ` [PATCH 04/11] gdb: use intrusive list for step-over chain Simon Marchi via Gdb-patches
2021-07-05 15:45 ` Pedro Alves
2021-07-06 20:59 ` Simon Marchi via Gdb-patches
2021-06-22 16:56 ` [PATCH 05/11] gdb: add setter / getter for thread_info resumed state Simon Marchi via Gdb-patches
2021-07-05 15:45 ` Pedro Alves
2021-06-22 16:56 ` [PATCH 06/11] gdb: make thread_info::suspend private, add getters / setters Simon Marchi via Gdb-patches
2021-07-05 15:45 ` Pedro Alves
2021-06-22 16:57 ` [PATCH 07/11] gdb: maintain per-process-target list of resumed threads with pending wait status Simon Marchi via Gdb-patches
2021-07-05 15:51 ` Pedro Alves
2021-07-06 21:25 ` Simon Marchi via Gdb-patches [this message]
2021-07-07 12:01 ` Pedro Alves
2021-07-12 22:28 ` Simon Marchi via Gdb-patches
2021-07-12 22:34 ` Simon Marchi via Gdb-patches
2021-07-13 12:21 ` Pedro Alves
2021-06-22 16:57 ` [PATCH 08/11] gdb: optimize check for resumed threads with pending wait status in maybe_set_commit_resumed_all_targets Simon Marchi via Gdb-patches
2021-07-05 15:51 ` Pedro Alves
2021-06-22 16:57 ` [PATCH 09/11] gdb: optimize selection of resumed thread with pending event Simon Marchi via Gdb-patches
2021-07-05 15:51 ` Pedro Alves
2021-06-22 16:57 ` [PATCH 10/11] gdb: maintain ptid -> thread map, optimize find_thread_ptid Simon Marchi via Gdb-patches
2021-07-05 15:52 ` Pedro Alves
2021-07-06 21:31 ` Simon Marchi via Gdb-patches
2021-07-07 12:13 ` Pedro Alves
2021-06-22 16:57 ` [PATCH 11/11] gdb: optimize all_matching_threads_iterator Simon Marchi via Gdb-patches
2021-07-05 15:52 ` Pedro Alves
2021-07-14 9:40 ` Tom de Vries
2021-07-13 0:47 ` [PATCH 00/11] Various thread lists optimizations Simon Marchi via Gdb-patches
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=252f2a84-c7b4-d07a-fecc-c57685a89ee1@polymtl.ca \
--to=gdb-patches@sourceware.org \
--cc=pedro@palves.net \
--cc=simon.marchi@polymtl.ca \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox