diff options
author | Simon Marchi <simon.marchi@ericsson.com> | 2017-10-21 12:20:21 -0400 |
---|---|---|
committer | Simon Marchi <simon.marchi@polymtl.ca> | 2017-10-21 12:20:21 -0400 |
commit | 4d3bb80e5db40cd2308157db3c446f35ae97a915 (patch) | |
tree | 886f563e207d3cedc783d48de60126f045dd8c94 | |
parent | a664f67e50eff30198097d51cec0ec4690abb2a1 (diff) | |
download | gdb-4d3bb80e5db40cd2308157db3c446f35ae97a915.zip gdb-4d3bb80e5db40cd2308157db3c446f35ae97a915.tar.gz gdb-4d3bb80e5db40cd2308157db3c446f35ae97a915.tar.bz2 |
Add overloads of for_each_thread/find_thread that filter on pid
It happens often that we want to iterate or find threads restricted to a
given pid. I think it's worth having an overload to help with this.
Right now there is a single user of each of the find_thread and
for_each_thread overload, but as we replace the usages of find_inferior
with for_each_thread/find_thread, more usages will pop up.
gdb/gdbserver/ChangeLog:
* gdbthread.h (find_thread, for_each_thread): New functions.
* inferiors.c (thread_of_pid): Remove.
(find_any_thread_of_pid): Use find_thread.
* linux-low.c (num_lwps): Use for_each_thread.
-rw-r--r-- | gdb/gdbserver/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/gdbserver/gdbthread.h | 25 | ||||
-rw-r--r-- | gdb/gdbserver/inferiors.c | 15 | ||||
-rw-r--r-- | gdb/gdbserver/linux-low.c | 6 |
4 files changed, 38 insertions, 15 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 350843e..757265d 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,10 @@ +2017-10-21 Simon Marchi <simon.marchi@ericsson.com> + + * gdbthread.h (find_thread, for_each_thread): New functions. + * inferiors.c (thread_of_pid): Remove. + (find_any_thread_of_pid): Use find_thread. + * linux-low.c (num_lwps): Use for_each_thread. + 2017-10-17 Yao Qi <yao.qi@linaro.org> * Makefile.in: Remove one rule. diff --git a/gdb/gdbserver/gdbthread.h b/gdb/gdbserver/gdbthread.h index 8ace051..b82d5b0 100644 --- a/gdb/gdbserver/gdbthread.h +++ b/gdb/gdbserver/gdbthread.h @@ -111,6 +111,18 @@ find_thread (Func func) return NULL; } +/* Like the above, but only consider threads with pid PID. */ + +template <typename Func> +static thread_info * +find_thread (int pid, Func func) +{ + return find_thread ([&] (thread_info *thread) + { + return thread->id.pid () == pid && func (thread); + }); +} + /* Invoke FUNC for each thread. */ template <typename Func> @@ -128,6 +140,19 @@ for_each_thread (Func func) } } +/* Like the above, but only consider threads with pid PID. */ + +template <typename Func> +static void +for_each_thread (int pid, Func func) +{ + for_each_thread ([&] (thread_info *thread) + { + if (pid == thread->id.pid ()) + func (thread); + }); +} + /* Find the a random thread for which FUNC (THREAD) returns true. If no entry is found then return NULL. */ diff --git a/gdb/gdbserver/inferiors.c b/gdb/gdbserver/inferiors.c index 564121f..a0ece4d 100644 --- a/gdb/gdbserver/inferiors.c +++ b/gdb/gdbserver/inferiors.c @@ -132,23 +132,14 @@ find_thread_process (const struct process_info *const process) return find_any_thread_of_pid (process->pid); } -/* Helper for find_any_thread_of_pid. Returns true if a thread - matches a PID. */ - -static int -thread_of_pid (thread_info *entry, void *pid_p) -{ - int pid = *(int *) pid_p; - - return (ptid_get_pid (entry->id) == pid); -} - /* See gdbthread.h. */ struct thread_info * find_any_thread_of_pid (int pid) { - return find_inferior (&all_threads, thread_of_pid, &pid); + return find_thread (pid, [] (thread_info *thread) { + return true; + }); } static void diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index 0b93fa2..b367e53 100644 --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -1869,10 +1869,10 @@ num_lwps (int pid) { int count = 0; - for_each_thread ([&] (thread_info *thread) { - if (thread->id.pid () == pid) + for_each_thread (pid, [&] (thread_info *thread) + { count++; - }); + }); return count; } |