gdb: optimize all_matching_threads_iterator
all_matching_threads_iterator is used extensively in some pretty fast
paths, often under the all_non_exited_threads function.
If a filter target and thread-specific ptid are given, it iterates on
all threads of all inferiors of that target, to ultimately yield exactly
on thread. And this happens quite often, which means we unnecessarily
spend time iterating on threads to find the one we are looking for. The
same thing happens if an inferior-specific ptid is given, although there
the iterator yields all the threads of that inferior.
In those cases, the callers of all_non_exited_threads could have
different behaviors depending on the kind of ptid, to avoid this
inefficiency, but that would be very tedious. Using
all_non_exited_threads has the advantage that one simple implementation
can work seamlessly on multiple threads or on one specific thread, just
by playing with the ptid.
Instead, optimize all_matching_threads_iterator directly to detect these
different cases and limiting what we iterate on to just what we need.
- if filter_ptid is minus_one_ptid, do as we do now: filter inferiors
based on filter_target, iterate on all of the matching inferiors'
threads
- if filter_ptid is a pid-only ptid (then a filter_target must
necessarily be given), look up that inferior and iterate on all its
threads
- otherwise, filter_ptid is a thread-specific ptid, so look up that
specific thread and "iterate" only on it
For the last case, what was an iteration on all threads of the filter
target now becomes a call to find_thread_ptid, which is quite efficient
now thanks to inferior::ptid_thread_map.
gdb/ChangeLog:
* thread-iter.h (class all_matching_threads_iterator)
<all_matching_threads_iterator>: Use default.
<enum class mode>: New.
<m_inf, m_thr>: Initialize.
<m_filter_ptid>: Remove.
* thread-iter.c (all_matching_threads_iterator::m_inf_matches):
Don't filter on m_filter_ptid.
(all_matching_threads_iterator::all_matching_threads_iterator):
Choose path based on filter_ptid (all threads, all threads of
inferior, single thread).
(all_matching_threads_iterator::advance): Likewise.
Change-Id: Ic6a19845f5f760fa1b8eac8145793c0ff431bbc9