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

@ -1,3 +1,10 @@
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.
2020-04-08 Tom Tromey <tromey@adacore.com>
* windows-nat.c (windows_continue): Use matching_pending_stop and

View File

@ -343,6 +343,34 @@ matching_pending_stop (bool debug_events)
/* See nat/windows-nat.h. */
gdb::optional<pending_stop>
fetch_pending_stop (bool debug_events)
{
gdb::optional<pending_stop> result;
for (auto iter = pending_stops.begin ();
iter != pending_stops.end ();
++iter)
{
if (desired_stop_thread_id == -1
|| desired_stop_thread_id == iter->thread_id)
{
result = *iter;
current_event = iter->event;
DEBUG_EVENTS (("get_windows_debug_event - "
"pending stop found in 0x%x (desired=0x%x)\n",
iter->thread_id, desired_stop_thread_id));
pending_stops.erase (iter);
break;
}
}
return result;
}
/* See nat/windows-nat.h. */
BOOL
continue_last_debug_event (DWORD continue_status, bool debug_events)
{

View File

@ -22,6 +22,7 @@
#include <windows.h>
#include <vector>
#include "gdbsupport/gdb_optional.h"
#include "target/waitstatus.h"
namespace windows_nat
@ -231,6 +232,12 @@ extern handle_exception_result handle_exception
extern bool matching_pending_stop (bool debug_events);
/* See if a pending stop matches DESIRED_STOP_THREAD_ID. If so,
remove it from the list of pending stops, set 'current_event', and
return it. Otherwise, return an empty optional. */
extern gdb::optional<pending_stop> fetch_pending_stop (bool debug_events);
/* A simple wrapper for ContinueDebugEvent that continues the last
waited-for event. If DEBUG_EVENTS is true, logging will be
enabled. */

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;