gdb: make remote target clear its handler in remote_target::wait
authorSimon Marchi <simon.marchi@efficios.com>
Thu, 4 Feb 2021 18:34:11 +0000 (13:34 -0500)
committerSimon Marchi <simon.marchi@polymtl.ca>
Thu, 4 Feb 2021 18:34:11 +0000 (13:34 -0500)
commitbaa8575b29fe83e158e203485d4d019621c0d245
treefe69f9841fe4b890d4a27d9c33b478356584d5bd
parent6b36ddeb1edbdc3039075e4e220a108579b82121
gdb: make remote target clear its handler in remote_target::wait

The remote target's remote_async_inferior_event_token is a flag that
tells when it wants the infrun loop to call its wait method.  The flag
is cleared in the async_event_handler's callback
(remote_async_inferior_event_handler), just before calling
inferior_event_handler.  However, since inferior_event_handler may
actually call another target's wait method, there needs to be code that
checks if we need to re-raise the flag.

It would be simpler instead for remote_target::wait to clear the flag
when it returns an event and there are no more to report after that.  If
another target's wait method gets called by inferior_event_handler, the
remote target's flag will stay naturally stay marked.

Note that this is already partially implemented in remote_target::wait,
since the remote target may have multiple events to report (and it can
only report one at the time):

  if (target_is_async_p ())
    {
      remote_state *rs = get_remote_state ();

      /* If there are are events left in the queue tell the event loop
 to return here.  */
      if (!rs->stop_reply_queue.empty ())
mark_async_event_handler (rs->remote_async_inferior_event_token);
    }

The code in remote_async_inferior_event_handler also checks for pending
events as well, in addition to the stop reply queue, so I've made
remote_target::wait check for that as well.  I'm not completely sure
this is ok, since I don't understand very well how the pending events
mechanism works.  But I figured it was safer to do this, worst case it
just leads to unnecessary calls to remote_target::wait.

gdb/ChangeLog:

* remote.c (remote_target::wait): Clear async event handler at
beginning, mark if needed at the end.
(remote_async_inferior_event_handler): Don't set or clear async
event handler.

Change-Id: I20117f5b5acc8a9972c90f16280249b766c1bf37
gdb/ChangeLog
gdb/remote.c