[binutils-gdb] Windows gdb: Introduce continue_last_debug_event_main_thread
Pedro Alves via Gdb-cvs <[email protected]>
| Newsgroups | gmane.comp.gdb.cvs |
|---|---|
| Message-ID | <[email protected]> |
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=e476c9ab2583547786134619590348ea82207879 commit e476c9ab2583547786134619590348ea82207879 Author: Pedro Alves <[email protected]> Date: Thu Oct 21 18:16:58 2021 +0100 Windows gdb: Introduce continue_last_debug_event_main_thread We have code using do_synchronously to call continue_last_debug_event, and later patches in the series would need to add the same code in few more places. Factor it out to a continue_last_debug_event_main_thread function so these other places in future patches can just call it. Approved-By: Tom Tromey <[email protected]> Change-Id: I945e668d2b3daeb9de968219925a7b3c7c7ce9ed commit-id:ee04461a Diff: --- gdb/windows-nat.c | 43 ++++++++++++++++++++++++++----------------- gdb/windows-nat.h | 6 ++++++ 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c index 468f451595d..174b54eda78 100644 --- a/gdb/windows-nat.c +++ b/gdb/windows-nat.c @@ -261,6 +261,28 @@ windows_nat_target::wait_for_debug_event_main_thread (DEBUG_EVENT *event) m_continued = false; } +void +windows_nat_target::continue_last_debug_event_main_thread + (const char *context_str, DWORD continue_status, bool last_call) +{ + std::optional<unsigned> err; + do_synchronously ([&] () + { + if (!continue_last_debug_event (continue_status, debug_events)) + err = (unsigned) GetLastError (); + + /* On the last call, do not block waiting for an event that will + never come. */ + return !last_call; + }); + if (err.has_value ()) + throw_winerror_with_name (string_printf (_("ContinueDebugEvent failed: %s"), + context_str).c_str (), + *err); + + m_continued = !last_call; +} + /* See nat/windows-nat.h. */ windows_thread_info * @@ -711,22 +733,9 @@ windows_nat_target::windows_continue (DWORD continue_status, int id, th->resume (); } - std::optional<unsigned> err; - do_synchronously ([&] () - { - if (!continue_last_debug_event (continue_status, debug_events)) - err = (unsigned) GetLastError (); - /* On the last call, do not block waiting for an event that will - never come. */ - return !last_call; - }); - - if (err.has_value ()) - throw_winerror_with_name (_("Failed to resume program execution" - " - ContinueDebugEvent failed"), - *err); - - m_continued = !last_call; + continue_last_debug_event_main_thread + (_("Failed to resume program execution"), continue_status, + last_call); return TRUE; } @@ -1188,7 +1197,7 @@ windows_nat_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus, /* All-stop, suspend all threads until they are explicitly resumed. */ - for (auto &thr : windows_process.thread_list) + for (auto &thr : windows_process->thread_list) thr->suspend (); } diff --git a/gdb/windows-nat.h b/gdb/windows-nat.h index 2907d97d655..8866408567c 100644 --- a/gdb/windows-nat.h +++ b/gdb/windows-nat.h @@ -249,6 +249,12 @@ private: needed. */ void wait_for_debug_event_main_thread (DEBUG_EVENT *event); + /* This continues the last debug event, dispatching to the worker + thread as needed. */ + void continue_last_debug_event_main_thread (const char *context_str, + DWORD continue_status, + bool last_call = false); + /* Force the process_thread thread to return from WaitForDebugEvent. PROCESS_ALIVE is set to false if the inferior process exits while we're trying to break out the process_thread thread. This can