aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Burgess <aburgess@redhat.com>2021-11-24 11:15:55 +0000
committerAndrew Burgess <aburgess@redhat.com>2021-11-25 09:54:58 +0000
commit0c1e6e265b276542ccb3f392c3070c3dd9339303 (patch)
tree3b45413e28d99ab95b068db30e0365c6c9ebc5ad
parenteec685f8a6e1a654bb82b0f20134689861589866 (diff)
downloadgdb-0c1e6e265b276542ccb3f392c3070c3dd9339303.zip
gdb-0c1e6e265b276542ccb3f392c3070c3dd9339303.tar.gz
gdb-0c1e6e265b276542ccb3f392c3070c3dd9339303.tar.bz2
gdb: introduce a new overload of target_can_async_p
There are a few places where we call the target_ops::can_async_p member function directly, instead of using the target_can_async_p wrapper. In some of these places this is because we need to ask before the target has been pushed, and in another location (in target.c) it seems unnecessary to go through the wrapper when we are already in target.c code. However, in the next commit I'd like to hoist some common checks out of target specific code into target.c. To achieve this, in this commit, I introduce a new overload of target_can_async_p which takes a target_ops pointer, and calls the ::can_async_p method directly. I then make use of the new overload where appropriate. There should be no user visible changes after this commit.
-rw-r--r--gdb/infcmd.c2
-rw-r--r--gdb/mi/mi-main.c4
-rw-r--r--gdb/target.c12
-rw-r--r--gdb/target.h4
4 files changed, 17 insertions, 5 deletions
diff --git a/gdb/infcmd.c b/gdb/infcmd.c
index 6bbd456..984ce4e 100644
--- a/gdb/infcmd.c
+++ b/gdb/infcmd.c
@@ -336,7 +336,7 @@ prepare_execution_command (struct target_ops *target, int background)
{
/* If we get a request for running in the bg but the target
doesn't support it, error out. */
- if (background && !target->can_async_p ())
+ if (background && !target_can_async_p (target))
error (_("Asynchronous execution not supported on this target."));
if (!background)
diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c
index e28fae0..311697b 100644
--- a/gdb/mi/mi-main.c
+++ b/gdb/mi/mi-main.c
@@ -408,7 +408,7 @@ run_one_inferior (inferior *inf, bool start_p)
{
const char *run_cmd = start_p ? "start" : "run";
struct target_ops *run_target = find_run_target ();
- int async_p = mi_async && run_target->can_async_p ();
+ int async_p = mi_async && target_can_async_p (run_target);
if (inf->pid != 0)
{
@@ -473,7 +473,7 @@ mi_cmd_exec_run (const char *command, char **argv, int argc)
{
const char *run_cmd = start_p ? "start" : "run";
struct target_ops *run_target = find_run_target ();
- int async_p = mi_async && run_target->can_async_p ();
+ int async_p = mi_async && target_can_async_p (run_target);
mi_execute_cli_command (run_cmd, async_p,
async_p ? "&" : NULL);
diff --git a/gdb/target.c b/gdb/target.c
index 8fe27c7..970e2a7 100644
--- a/gdb/target.c
+++ b/gdb/target.c
@@ -391,7 +391,15 @@ target_can_lock_scheduler ()
bool
target_can_async_p ()
{
- return current_inferior ()->top_target ()->can_async_p ();
+ return target_can_async_p (current_inferior ()->top_target ());
+}
+
+/* See target.h. */
+
+bool
+target_can_async_p (struct target_ops *target)
+{
+ return target->can_async_p ();
}
/* See target.h. */
@@ -2602,7 +2610,7 @@ target_wait (ptid_t ptid, struct target_waitstatus *status,
gdb_assert (!proc_target->commit_resumed_state);
- if (!target->can_async_p ())
+ if (!target_can_async_p (target))
gdb_assert ((options & TARGET_WNOHANG) == 0);
return target->wait (ptid, status, options);
diff --git a/gdb/target.h b/gdb/target.h
index 4dc17fd..e709b7d 100644
--- a/gdb/target.h
+++ b/gdb/target.h
@@ -1886,6 +1886,10 @@ extern bool target_async_permitted;
/* Can the target support asynchronous execution? */
extern bool target_can_async_p ();
+/* An overload of the above that can be called when the target is not yet
+ pushed, this calls TARGET::can_async_p directly. */
+extern bool target_can_async_p (struct target_ops *target);
+
/* Is the target in asynchronous execution mode? */
extern bool target_is_async_p ();