From 4d3bb80e5db40cd2308157db3c446f35ae97a915 Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Sat, 21 Oct 2017 12:20:21 -0400 Subject: [PATCH] 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. --- gdb/gdbserver/ChangeLog | 7 +++++++ gdb/gdbserver/gdbthread.h | 25 +++++++++++++++++++++++++ gdb/gdbserver/inferiors.c | 15 +++------------ gdb/gdbserver/linux-low.c | 6 +++--- 4 files changed, 38 insertions(+), 15 deletions(-) diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 350843e65f..757265daf3 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,10 @@ +2017-10-21 Simon Marchi + + * 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 * Makefile.in: Remove one rule. diff --git a/gdb/gdbserver/gdbthread.h b/gdb/gdbserver/gdbthread.h index 8ace051036..b82d5b0e72 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 +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 @@ -128,6 +140,19 @@ for_each_thread (Func func) } } +/* Like the above, but only consider threads with pid PID. */ + +template +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 564121fdd9..a0ece4d351 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 0b93fa20c0..b367e535a9 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; } -- 2.34.1