From: Patrick Monnerat <patrick@monnerat.net>
To: gdb-patches@sourceware.org
Subject: [PATCH] Replace deprecated_target_wait_hook by observers
Date: Thu, 26 Aug 2021 16:40:44 +0200 [thread overview]
Message-ID: <20210826144044.146397-1-patrick@monnerat.net> (raw)
Commit b60cea7 (Make target_wait options use enum flags) broke
deprecated_target_wait_hook usage: there's a commit comment telling
this hook has not been converted.
Rather than trying to mend it, this patch replaces the hook by two
target_wait observers:
target_pre_wait (ptid_t ptid)
target_post_wait (ptid_t event_ptid)
Upon target_wait entry, target_pre_wait is notified with the ptid
passed to target_wait. Upon exit, target_post_wait is notified with
the event ptid returned by target_wait. Should an exception occur,
event_ptid is null_ptid.
This change benefits to Insight (out-of-tree): there's no real use of the
late hook in gdb itself.
---
gdb/infrun.c | 15 +++------------
gdb/infrun.h | 5 ++---
gdb/interps.c | 1 -
gdb/observable.c | 2 ++
gdb/observable.h | 6 ++++++
gdb/target.c | 37 ++++++++++++++++++++++++++++++++++++-
gdb/top.c | 7 -------
7 files changed, 49 insertions(+), 24 deletions(-)
diff --git a/gdb/infrun.c b/gdb/infrun.c
index 5ee650fa464..695e3b0a586 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -366,7 +366,7 @@ show_stop_on_solib_events (struct ui_file *file, int from_tty,
static bool stop_print_frame;
/* This is a cached copy of the target/ptid/waitstatus of the last
- event returned by target_wait()/deprecated_target_wait_hook().
+ event returned by target_wait().
This information is returned by get_last_target_status(). */
static process_stratum_target *target_last_proc_target;
static ptid_t target_last_wait_ptid;
@@ -3478,7 +3478,6 @@ static ptid_t
do_target_wait_1 (inferior *inf, ptid_t ptid,
target_waitstatus *status, target_wait_flags options)
{
- ptid_t event_ptid;
struct thread_info *tp;
/* We know that we are looking for an event in the target of inferior
@@ -3594,12 +3593,7 @@ do_target_wait_1 (inferior *inf, ptid_t ptid,
if (!target_can_async_p ())
options &= ~TARGET_WNOHANG;
- if (deprecated_target_wait_hook)
- event_ptid = deprecated_target_wait_hook (ptid, status, options);
- else
- event_ptid = target_wait (ptid, status, options);
-
- return event_ptid;
+ return target_wait (ptid, status, options);
}
/* Wrapper for target_wait that first checks whether threads have
@@ -4558,10 +4552,7 @@ poll_one_curr_target (struct target_waitstatus *ws)
don't get any event. */
target_dcache_invalidate ();
- if (deprecated_target_wait_hook)
- event_ptid = deprecated_target_wait_hook (minus_one_ptid, ws, TARGET_WNOHANG);
- else
- event_ptid = target_wait (minus_one_ptid, ws, TARGET_WNOHANG);
+ event_ptid = target_wait (minus_one_ptid, ws, TARGET_WNOHANG);
if (debug_infrun)
print_target_wait_results (minus_one_ptid, event_ptid, ws);
diff --git a/gdb/infrun.h b/gdb/infrun.h
index 5a577365f94..a14e20b5f94 100644
--- a/gdb/infrun.h
+++ b/gdb/infrun.h
@@ -124,9 +124,8 @@ extern process_stratum_target *user_visible_resume_target (ptid_t resume_ptid);
extern int normal_stop (void);
/* Return the cached copy of the last target/ptid/waitstatus returned
- by target_wait()/deprecated_target_wait_hook(). The data is
- actually cached by handle_inferior_event(), which gets called
- immediately after target_wait()/deprecated_target_wait_hook(). */
+ by target_wait(). The data is actually cached by handle_inferior_event(),
+ which gets called immediately after target_wait(). */
extern void get_last_target_status (process_stratum_target **target,
ptid_t *ptid,
struct target_waitstatus *status);
diff --git a/gdb/interps.c b/gdb/interps.c
index ec19822b571..55bd10467c3 100644
--- a/gdb/interps.c
+++ b/gdb/interps.c
@@ -356,7 +356,6 @@ clear_interpreter_hooks (void)
deprecated_readline_hook = 0;
deprecated_readline_end_hook = 0;
deprecated_context_hook = 0;
- deprecated_target_wait_hook = 0;
deprecated_call_command_hook = 0;
deprecated_error_begin_hook = 0;
}
diff --git a/gdb/observable.c b/gdb/observable.c
index 51f5edb0a1f..5724b712604 100644
--- a/gdb/observable.c
+++ b/gdb/observable.c
@@ -77,6 +77,8 @@ DEFINE_OBSERVABLE (register_changed);
DEFINE_OBSERVABLE (user_selected_context_changed);
DEFINE_OBSERVABLE (source_styling_changed);
DEFINE_OBSERVABLE (current_source_symtab_and_line_changed);
+DEFINE_OBSERVABLE (target_pre_wait);
+DEFINE_OBSERVABLE (target_post_wait);
} /* namespace observers */
} /* namespace gdb */
diff --git a/gdb/observable.h b/gdb/observable.h
index 915770ff363..652fb3df43f 100644
--- a/gdb/observable.h
+++ b/gdb/observable.h
@@ -251,6 +251,12 @@ extern observable<> source_styling_changed;
extern observable<> current_source_symtab_and_line_changed;
+/* About to enter target_wait (). */
+extern observable <ptid_t /* ptid */> target_pre_wait;
+
+/* About to leave target_wait (). */
+extern observable <ptid_t /* event_ptid */> target_post_wait;
+
} /* namespace observers */
} /* namespace gdb */
diff --git a/gdb/target.c b/gdb/target.c
index ae2d659583e..22e58484a18 100644
--- a/gdb/target.c
+++ b/gdb/target.c
@@ -26,6 +26,7 @@
#include "symtab.h"
#include "inferior.h"
#include "infrun.h"
+#include "observable.h"
#include "bfd.h"
#include "symfile.h"
#include "objfiles.h"
@@ -2591,12 +2592,45 @@ target_disconnect (const char *args, int from_tty)
current_inferior ()->top_target ()->disconnect (args, from_tty);
}
+/* RAII class to handle target_wait observers.
+ These observers allow the Insight GUI to monitor user interaction while
+ waiting on the target. */
+
+class scoped_target_wait
+{
+public:
+ explicit scoped_target_wait (ptid_t ptid)
+ {
+ m_event_ptid = null_ptid;
+ gdb::observers::target_pre_wait.notify (ptid);
+ }
+
+ ~scoped_target_wait ()
+ {
+ gdb::observers::target_post_wait.notify (m_event_ptid);
+ }
+
+ void set (ptid_t event_ptid) noexcept
+ {
+ m_event_ptid = event_ptid;
+ }
+
+ ptid_t get () const noexcept
+ {
+ return m_event_ptid;
+ }
+
+private:
+ ptid_t m_event_ptid;
+};
+
/* See target/target.h. */
ptid_t
target_wait (ptid_t ptid, struct target_waitstatus *status,
target_wait_flags options)
{
+ scoped_target_wait event_ptid(ptid);
target_ops *target = current_inferior ()->top_target ();
process_stratum_target *proc_target = current_inferior ()->process_target ();
@@ -2605,7 +2639,8 @@ target_wait (ptid_t ptid, struct target_waitstatus *status,
if (!target->can_async_p ())
gdb_assert ((options & TARGET_WNOHANG) == 0);
- return target->wait (ptid, status, options);
+ event_ptid.set (target->wait (ptid, status, options));
+ return event_ptid.get ();
}
/* See target.h. */
diff --git a/gdb/top.c b/gdb/top.c
index 0c49f4f9eb4..368166720ac 100644
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -249,13 +249,6 @@ void (*deprecated_readline_end_hook) (void);
void (*deprecated_attach_hook) (void);
void (*deprecated_detach_hook) (void);
-/* Called when going to wait for the target. Usually allows the GUI
- to run while waiting for target events. */
-
-ptid_t (*deprecated_target_wait_hook) (ptid_t ptid,
- struct target_waitstatus *status,
- int options);
-
/* Used by UI as a wrapper around command execution. May do various
things like enabling/disabling buttons, etc... */
--
2.31.1
next reply other threads:[~2021-08-26 14:41 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-08-26 14:40 Patrick Monnerat [this message]
2021-09-04 11:58 ` [PING] " Patrick Monnerat
2021-09-07 15:08 ` [PATCH] " Simon Marchi
2021-09-23 20:10 ` Tom Tromey
2021-10-25 19:02 ` Simon Marchi
2021-10-27 18:39 ` Tom Tromey
2022-03-12 12:41 patrick
2022-03-14 13:53 ` Tom Tromey
2022-03-14 14:16 ` Patrick Monnerat
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210826144044.146397-1-patrick@monnerat.net \
--to=patrick@monnerat.net \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).