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>
Sat, 18 Dec 2021 10:19:55 +0000 (10:19 +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 f0f3dcbabb000abe656c12da042f07064c600bc1..1bb6138a7c794d68e41af46a1e9c6c0c88f57cfa 100644 (file)
@@ -8348,9 +8348,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;