From: Pedro Alves Date: Mon, 22 May 2023 10:29:44 +0000 (+0100) Subject: Windows gdb: Change serial_event management X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ad7ecb7741d5c434f5f2e178b84195e46bd39c40;p=thirdparty%2Fbinutils-gdb.git Windows gdb: Change serial_event management windows_nat_target::windows_continue, when it finds a resumed thread that has a pending event, does: /* There's no need to really continue, because there's already another event pending. However, we do need to inform the event loop of this. */ serial_event_set (m_wait_event); return TRUE; If we have more than one pending event ready to be consumed, and, windows_nat_target::wait returns without calling windows_nat_target::windows_continue, which it will with the non-stop support in the following patch, then we will miss waking up the event loop. This patch makes windows-nat.c manage the serial_event similarly to how linux-nat.c does it. Clear it on entry to windows_nat_target::wait, and set it if there may be more events to process. With this, there's no need to set it from windows_nat_target::wait_for_debug_event_main_thread, so the patch also makes us not do it. Change-Id: I44e1682721aa4866f1dbb052b3cfb4870fb13579 --- diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c index cbb66c702f2..c3d2e6fb15f 100644 --- a/gdb/windows-nat.c +++ b/gdb/windows-nat.c @@ -529,7 +529,6 @@ windows_nat_target::wait_for_debug_event_main_thread (DEBUG_EVENT *event) { *event = m_last_debug_event; m_debug_event_pending = false; - serial_event_clear (m_wait_event); } else wait_for_debug_event (event, INFINITE); @@ -1739,6 +1738,11 @@ windows_nat_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus, { int pid = -1; + /* serial_event is a manual-reset event. Clear it first. We'll set + it again if we may need to wake up the event loop to get here + again. */ + serial_event_clear (m_wait_event); + /* We loop when we get a non-standard exception rather than return with a SPURIOUS because resume can try and step or modify things, which needs a current_thread->h. But some of these exceptions mark @@ -1787,6 +1791,10 @@ windows_nat_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus, thr->suspend (); } + /* If something came out, assume there may be more. This is + needed because there may be pending events ready to + consume. */ + serial_event_set (m_wait_event); return result; } else