Remove usages of find_inferior in select_event_lwp

Replace with find_thread/for_each_thread.  I inlined the callbacks,
because they are relatively simple.

gdb/gdbserver/ChangeLog:

	* linux-low.c (select_singlestep_lwp_callback): Remove.
	(count_events_callback): Remove.
	(select_event_lwp_callback): Remove.
	(select_event_lwp): Use find_thread/for_each_thread.
This commit is contained in:
Simon Marchi 2017-12-02 20:36:40 -05:00
parent a1385b7b88
commit 39a64da5fc
2 changed files with 38 additions and 62 deletions

View File

@ -1,3 +1,10 @@
2017-12-02 Simon Marchi <simon.marchi@polymtl.ca>
* linux-low.c (select_singlestep_lwp_callback): Remove.
(count_events_callback): Remove.
(select_event_lwp_callback): Remove.
(select_event_lwp): Use find_thread/for_each_thread.
2017-12-02 Simon Marchi <simon.marchi@polymtl.ca>
* linux-low.c (not_stopped_callback): Return bool, take filter

View File

@ -2818,64 +2818,11 @@ linux_wait_for_event (ptid_t ptid, int *wstatp, int options)
return linux_wait_for_event_filtered (ptid, ptid, wstatp, options);
}
/* Count the LWP's that have had events. */
static int
count_events_callback (thread_info *thread, void *data)
{
struct lwp_info *lp = get_thread_lwp (thread);
int *count = (int *) data;
gdb_assert (count != NULL);
/* Count only resumed LWPs that have an event pending. */
if (thread->last_status.kind == TARGET_WAITKIND_IGNORE
&& lp->status_pending_p)
(*count)++;
return 0;
}
/* Select the LWP (if any) that is currently being single-stepped. */
static int
select_singlestep_lwp_callback (thread_info *thread, void *data)
{
struct lwp_info *lp = get_thread_lwp (thread);
if (thread->last_status.kind == TARGET_WAITKIND_IGNORE
&& thread->last_resume_kind == resume_step
&& lp->status_pending_p)
return 1;
else
return 0;
}
/* Select the Nth LWP that has had an event. */
static int
select_event_lwp_callback (thread_info *thread, void *data)
{
struct lwp_info *lp = get_thread_lwp (thread);
int *selector = (int *) data;
gdb_assert (selector != NULL);
/* Select only resumed LWPs that have an event pending. */
if (thread->last_status.kind == TARGET_WAITKIND_IGNORE
&& lp->status_pending_p)
if ((*selector)-- == 0)
return 1;
return 0;
}
/* Select one LWP out of those that have events pending. */
static void
select_event_lwp (struct lwp_info **orig_lp)
{
int num_events = 0;
int random_selector;
struct thread_info *event_thread = NULL;
@ -2889,10 +2836,15 @@ select_event_lwp (struct lwp_info **orig_lp)
would report it to the user as a random signal. */
if (!non_stop)
{
event_thread
= (struct thread_info *) find_inferior (&all_threads,
select_singlestep_lwp_callback,
NULL);
event_thread = find_thread ([] (thread_info *thread)
{
lwp_info *lp = get_thread_lwp (thread);
return (thread->last_status.kind == TARGET_WAITKIND_IGNORE
&& thread->last_resume_kind == resume_step
&& lp->status_pending_p);
});
if (event_thread != NULL)
{
if (debug_threads)
@ -2906,7 +2858,16 @@ select_event_lwp (struct lwp_info **orig_lp)
which have had events. */
/* First see how many events we have. */
find_inferior (&all_threads, count_events_callback, &num_events);
int num_events = 0;
for_each_thread ([&] (thread_info *thread)
{
lwp_info *lp = get_thread_lwp (thread);
/* Count only resumed LWPs that have an event pending. */
if (thread->last_status.kind == TARGET_WAITKIND_IGNORE
&& lp->status_pending_p)
num_events++;
});
gdb_assert (num_events > 0);
/* Now randomly pick a LWP out of those that have had
@ -2918,10 +2879,18 @@ select_event_lwp (struct lwp_info **orig_lp)
debug_printf ("SEL: Found %d SIGTRAP events, selecting #%d\n",
num_events, random_selector);
event_thread
= (struct thread_info *) find_inferior (&all_threads,
select_event_lwp_callback,
&random_selector);
event_thread = find_thread ([&] (thread_info *thread)
{
lwp_info *lp = get_thread_lwp (thread);
/* Select only resumed LWPs that have an event pending. */
if (thread->last_status.kind == TARGET_WAITKIND_IGNORE
&& lp->status_pending_p)
if (random_selector-- == 0)
return true;
return false;
});
}
if (event_thread != NULL)