Introduce fetch_pending_stop

This introduces a new "fetch_pending_stop" function and changes gdb to
use it.  This function removes the first matching pending stop from
the list of such stops.

gdb/ChangeLog
2020-04-08  Tom Tromey  <tromey@adacore.com>

	* windows-nat.c (get_windows_debug_event): Use
	fetch_pending_stop.
	* nat/windows-nat.h (fetch_pending_stop): Declare.
	* nat/windows-nat.c (fetch_pending_stop): New function.
This commit is contained in:
Tom Tromey
2020-04-08 14:33:35 -06:00
parent e758e19c59
commit d2977bc425
4 changed files with 51 additions and 20 deletions

View File

@ -1522,29 +1522,18 @@ windows_nat_target::get_windows_debug_event (int pid,
/* If there is a relevant pending stop, report it now. See the
comment by the definition of "pending_stops" for details on why
this is needed. */
for (auto iter = pending_stops.begin ();
iter != pending_stops.end ();
++iter)
gdb::optional<pending_stop> stop = fetch_pending_stop (debug_events);
if (stop.has_value ())
{
if (desired_stop_thread_id == -1
|| desired_stop_thread_id == iter->thread_id)
{
thread_id = iter->thread_id;
*ourstatus = iter->status;
current_event = iter->event;
thread_id = stop->thread_id;
*ourstatus = stop->status;
inferior_ptid = ptid_t (current_event.dwProcessId, thread_id, 0);
current_windows_thread = thread_rec (inferior_ptid,
INVALIDATE_CONTEXT);
current_windows_thread->reload_context = 1;
inferior_ptid = ptid_t (current_event.dwProcessId, thread_id, 0);
current_windows_thread = thread_rec (inferior_ptid,
INVALIDATE_CONTEXT);
current_windows_thread->reload_context = 1;
DEBUG_EVENTS (("get_windows_debug_event - "
"pending stop found in 0x%x (desired=0x%x)\n",
thread_id, desired_stop_thread_id));
pending_stops.erase (iter);
return thread_id;
}
return thread_id;
}
last_sig = GDB_SIGNAL_0;