]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Windows gdb: Change serial_event management
authorPedro Alves <pedro@palves.net>
Mon, 22 May 2023 10:29:44 +0000 (11:29 +0100)
committerPedro Alves <pedro@palves.net>
Fri, 24 Apr 2026 20:28:44 +0000 (21:28 +0100)
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 a later 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.

Approved-By: Tom Tromey <tom@tromey.com>
Change-Id: I44e1682721aa4866f1dbb052b3cfb4870fb13579
commit-id:669a42f6

gdb/windows-nat.c

index e0589c4de970b20ef3ed6ba1ae526d9e879a794e..b21424694748cd666a734835acf4ff6633c57051 100644 (file)
@@ -251,7 +251,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);
@@ -1190,6 +1189,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
@@ -1238,6 +1242,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