Get pending events in random
authorYao Qi <yao.qi@linaro.org>
Thu, 27 Oct 2016 15:05:06 +0000 (16:05 +0100)
committerYao Qi <yao.qi@linaro.org>
Thu, 27 Oct 2016 15:05:06 +0000 (16:05 +0100)
commit89342618773b64db3e67701c0cd9dd89cdbbc18a
treee7a7b8dd281ece32061593580d7c8b6cf382cfa5
parente3652c8460a6247f50e24deaca1c1c1c0e2a2573
Get pending events in random

Nowadays, we select events to be reported to GDB in random, however
that is not enough when many GDBserver internal events (not reported
to GDB) are generated.

GDBserver pulls all events out of kernel via waitpid, and leave them
pending.  When goes through threads which have pending events,
GDBserver uses find_inferior to find the first thread which has
pending event, and consumes it.  Note that find_inferior always
iterate threads in a fixed order.  If multiple threads keep hitting
GDBserver breakpoints, range stepping with single-step breakpoint for
example, threads in the head of the thread list are more likely to be
processed and threads in the tail are starved.  This causes some timeout
fails in gdb.threads/non-stop-fair-events.exp when range stepping is
enabled on arm-linux.

This patch fixes this issue by randomly selecting pending events.  It
adds a new function find_inferior_in_random, which iterates threads
which have pending events randomly.

gdb/gdbserver:

2016-10-27  Yao Qi  <yao.qi@linaro.org>

* inferiors.c (find_inferior_in_random): New function.
* inferiors.h (find_inferior_in_random): Declare.
* linux-low.c (linux_wait_for_event_filtered): Call
find_inferior_in_random instead of find_inferior.
gdb/gdbserver/ChangeLog
gdb/gdbserver/inferiors.c
gdb/gdbserver/inferiors.h
gdb/gdbserver/linux-low.c