gdb: add assert in remote_target::wait relating to async being off
authorAndrew Burgess <aburgess@redhat.com>
Mon, 22 Nov 2021 12:30:36 +0000 (12:30 +0000)
committerAndrew Burgess <aburgess@redhat.com>
Thu, 25 Nov 2021 10:00:40 +0000 (10:00 +0000)
While working on another patch I ended up in a situation where I had
async mode disabled (with 'maint set target-async off'), but the async
event token got marked anyway.

In this situation GDB was continually calling into
remote_target::wait, however, the async token would never become
unmarked as the unmarking is guarded by target_is_async_p.

We could just unconditionally unmark the token, but that would feel
like just ignoring a bug, so, instead, lets assert that if
!target_is_async_p, then the async token should not be marked.

This assertion would have caught my earlier mistake.

There should be no user visible changes with this commit.

gdb/remote.c

index 25a4d3cab6ecf81992bc6e82f388d3730b6a597d..da8ed81ba7840a5840501ce4e41e3ab51f124664 100644 (file)
@@ -8309,9 +8309,13 @@ remote_target::wait (ptid_t ptid, struct target_waitstatus *status,
   remote_state *rs = get_remote_state ();
 
   /* Start by clearing the flag that asks for our wait method to be called,
-     we'll mark it again at the end if needed.  */
+     we'll mark it again at the end if needed.  If the target is not in
+     async mode then the async token should not be marked.  */
   if (target_is_async_p ())
     clear_async_event_handler (rs->remote_async_inferior_event_token);
+  else
+    gdb_assert (!async_event_handler_marked
+               (rs->remote_async_inferior_event_token));
 
   ptid_t event_ptid;