aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog15
-rw-r--r--gdb/async-event.c1
-rw-r--r--gdb/async-event.h9
-rw-r--r--gdb/infrun.c1
-rw-r--r--gdb/record-btrace.c1
-rw-r--r--gdb/record-full.c1
-rw-r--r--gdb/remote-notif.c4
-rw-r--r--gdb/remote.c5
8 files changed, 33 insertions, 4 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 4ac326b..137f3be 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,18 @@
+2021-02-04 Simon Marchi <simon.marchi@efficios.com>
+
+ * async-event.h (async_event_handler_func): Add documentation.
+ * async-event.c (check_async_event_handlers): Don't clear
+ async_event_handler ready flag.
+ * infrun.c (infrun_async_inferior_event_handler): Clear ready
+ flag.
+ * record-btrace.c (record_btrace_handle_async_inferior_event):
+ Likewise.
+ * record-full.c (record_full_async_inferior_event_handler):
+ Likewise.
+ * remote-notif.c (remote_async_get_pending_events_handler):
+ Likewise.
+ * remote.c (remote_async_inferior_event_handler): Likewise.
+
2021-02-03 Simon Marchi <simon.marchi@polymtl.ca>
* infrun.c (handle_inferior_event): Move stop_soon variable to
diff --git a/gdb/async-event.c b/gdb/async-event.c
index 18dac77..c4ab731 100644
--- a/gdb/async-event.c
+++ b/gdb/async-event.c
@@ -322,7 +322,6 @@ check_async_event_handlers ()
{
if (async_handler_ptr->ready)
{
- async_handler_ptr->ready = 0;
event_loop_debug_printf ("invoking async event handler `%s`",
async_handler_ptr->name);
(*async_handler_ptr->proc) (async_handler_ptr->client_data);
diff --git a/gdb/async-event.h b/gdb/async-event.h
index 0f4c892..9d96235 100644
--- a/gdb/async-event.h
+++ b/gdb/async-event.h
@@ -24,6 +24,15 @@
struct async_signal_handler;
struct async_event_handler;
typedef void (sig_handler_func) (gdb_client_data);
+
+/* Type of async event handler callbacks.
+
+ DATA is the client data originally passed to create_async_event_handler.
+
+ The callback is called when the async event handler is marked. The callback
+ is responsible for clearing the async event handler if it no longer needs
+ to be called. */
+
typedef void (async_event_handler_func) (gdb_client_data);
extern struct async_signal_handler *
diff --git a/gdb/infrun.c b/gdb/infrun.c
index 6ec269a..a271220 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -9212,6 +9212,7 @@ static const struct internalvar_funcs siginfo_funcs =
static void
infrun_async_inferior_event_handler (gdb_client_data data)
{
+ clear_async_event_handler (infrun_async_inferior_event_token);
inferior_event_handler (INF_REG_EVENT);
}
diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c
index 81686ee..ea339b8 100644
--- a/gdb/record-btrace.c
+++ b/gdb/record-btrace.c
@@ -325,6 +325,7 @@ record_btrace_auto_disable (void)
static void
record_btrace_handle_async_inferior_event (gdb_client_data data)
{
+ clear_async_event_handler (record_btrace_async_inferior_event_handler);
inferior_event_handler (INF_REG_EVENT);
}
diff --git a/gdb/record-full.c b/gdb/record-full.c
index 22eaaa4..247573c 100644
--- a/gdb/record-full.c
+++ b/gdb/record-full.c
@@ -903,6 +903,7 @@ static struct async_event_handler *record_full_async_inferior_event_token;
static void
record_full_async_inferior_event_handler (gdb_client_data data)
{
+ clear_async_event_handler (record_full_async_inferior_event_token);
inferior_event_handler (INF_REG_EVENT);
}
diff --git a/gdb/remote-notif.c b/gdb/remote-notif.c
index 035d5f4..5a3e139 100644
--- a/gdb/remote-notif.c
+++ b/gdb/remote-notif.c
@@ -108,8 +108,10 @@ remote_notif_process (struct remote_notif_state *state,
static void
remote_async_get_pending_events_handler (gdb_client_data data)
{
+ remote_notif_state *notif_state = (remote_notif_state *) data;
+ clear_async_event_handler (notif_state->get_pending_events_token);
gdb_assert (target_is_non_stop_p ());
- remote_notif_process ((struct remote_notif_state *) data, NULL);
+ remote_notif_process (notif_state, NULL);
}
/* Remote notification handler. Parse BUF, queue notification and
diff --git a/gdb/remote.c b/gdb/remote.c
index c544fe7..47538fc 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -14259,10 +14259,11 @@ remote_async_serial_handler (struct serial *scb, void *context)
static void
remote_async_inferior_event_handler (gdb_client_data data)
{
- inferior_event_handler (INF_REG_EVENT);
-
remote_target *remote = (remote_target *) data;
remote_state *rs = remote->get_remote_state ();
+ clear_async_event_handler (rs->remote_async_inferior_event_token);
+
+ inferior_event_handler (INF_REG_EVENT);
/* inferior_event_handler may have consumed an event pending on the
infrun side without calling target_wait on the REMOTE target, or