aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2019-04-04 16:57:11 -0600
committerTom Tromey <tromey@adacore.com>2019-04-09 12:03:25 -0600
commitb0319eaaf9d1f4e730c532058f2fff0b4e5ce682 (patch)
tree5232bf0ddc163b3a58e536e74f514c1c7f574f92
parent9ab8741a48294e19d514721c710c81bba46db7f2 (diff)
downloadfsf-binutils-gdb-b0319eaaf9d1f4e730c532058f2fff0b4e5ce682.zip
fsf-binutils-gdb-b0319eaaf9d1f4e730c532058f2fff0b4e5ce682.tar.gz
fsf-binutils-gdb-b0319eaaf9d1f4e730c532058f2fff0b4e5ce682.tar.bz2
Use find_thread_in_random in select_event_lwp
I noticed that find_thread_in_random duplicates the code in find_thread_in_random, so this patch changes the latter to use the former. There are two other spots in gdb that do this, but to unify all of them would require switching some code from using the "iterate over" idiom to using iterators. Another possible improvement is that find_thread_in_random could be made single-pass using reservoir sampling. Tested by the buildbot. gdb/gdbserver/ChangeLog 2019-04-09 Tom Tromey <tromey@adacore.com> * linux-low.c (select_event_lwp): Use find_thread_in_random.
-rw-r--r--gdb/gdbserver/ChangeLog4
-rw-r--r--gdb/gdbserver/linux-low.c35
2 files changed, 8 insertions, 31 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index e82e901..1618e2c 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,3 +1,7 @@
+2019-04-09 Tom Tromey <tromey@adacore.com>
+
+ * linux-low.c (select_event_lwp): Use find_thread_in_random.
+
2019-04-08 Tom Tromey <tom@tromey.com>
* linux-low.c (linux_detach_one_lwp): Replace throw_exception with
diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c
index 94af240..168f4b2 100644
--- a/gdb/gdbserver/linux-low.c
+++ b/gdb/gdbserver/linux-low.c
@@ -2828,7 +2828,6 @@ linux_wait_for_event (ptid_t ptid, int *wstatp, int options)
static void
select_event_lwp (struct lwp_info **orig_lp)
{
- int random_selector;
struct thread_info *event_thread = NULL;
/* In all-stop, give preference to the LWP that is being
@@ -2862,39 +2861,13 @@ select_event_lwp (struct lwp_info **orig_lp)
/* No single-stepping LWP. Select one at random, out of those
which have had events. */
- /* First see how many events we have. */
- 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
- events. */
- random_selector = (int)
- ((num_events * (double) rand ()) / (RAND_MAX + 1.0));
-
- if (debug_threads && num_events > 1)
- debug_printf ("SEL: Found %d SIGTRAP events, selecting #%d\n",
- num_events, random_selector);
-
- event_thread = find_thread ([&] (thread_info *thread)
+ event_thread = find_thread_in_random ([&] (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;
+ /* Only resumed LWPs that have an event pending. */
+ return (thread->last_status.kind == TARGET_WAITKIND_IGNORE
+ && lp->status_pending_p);
});
}