aboutsummaryrefslogtreecommitdiff
path: root/gdb/cli/cli-script.h
diff options
context:
space:
mode:
authorPedro Alves <pedro@palves.net>2020-07-10 23:39:34 +0100
committerPedro Alves <palves@redhat.com>2020-07-10 23:39:34 +0100
commit96118d114e3c53aadaf3fe5b5cf94979dbf56d87 (patch)
tree3353dc8f58455ff61922c7b2ff1f266dbd954f9d /gdb/cli/cli-script.h
parent54904d818b4d6b71101d4eec4bfab6342617ea5e (diff)
downloadgdb-96118d114e3c53aadaf3fe5b5cf94979dbf56d87.zip
gdb-96118d114e3c53aadaf3fe5b5cf94979dbf56d87.tar.gz
gdb-96118d114e3c53aadaf3fe5b5cf94979dbf56d87.tar.bz2
Fix spurious unhandled remote %Stop notifications
In non-stop mode, remote targets mark an async event source whose callback is supposed to result in calling remote_target::wait_ns to either process the event queue, or acknowledge an incoming %Stop notification. The callback in question is remote_async_inferior_event_handler, where we call inferior_event_handler, to end up in fetch_inferior_event -> target_wait -> remote_target::wait -> remote_target::wait_ns. A problem here however is that when debugging multiple targets, fetch_inferior_event can pull events out of any target picked at random, for event fairness. This means that when remote_async_inferior_event_handler returns, remote_target::wait may have not been called at all, and thus pending notifications may have not been acked. Because async event sources auto-clear, when remote_async_inferior_event_handler returns the async event handler is no longer marked, so the event loop won't automatically call remote_async_inferior_event_handler again to try to process the pending remote notifications/queue. The result is that stop events may end up not processed, e.g., "interrupt -a" seemingly not managing to stop all threads. Fix this by making remote_async_inferior_event_handler mark the event handler again before returning, if necessary. Maybe a better fix would be to make async event handlers not auto-clear themselves, make that the responsibility of the callback, so that the event loop would keep calling the callback automatically. Or, we could try making so that fetch_inferior_event would optionally handle events only for the target that it got passed down via parameter. However, I don't think now just before branching is the time to try to do any such change. gdb/ChangeLog: PR gdb/26199 * remote.c (remote_target::open_1): Pass remote target pointer as data to create_async_event_handler. (remote_async_inferior_event_handler): Mark async event handler before returning if the remote target still has either pending events or unacknowledged notifications.
Diffstat (limited to 'gdb/cli/cli-script.h')
0 files changed, 0 insertions, 0 deletions