From: Vladimir Prus <vladimir@codesourcery.com>
To: gdb-patches@sources.redhat.com
Subject: [MI non-stop 05/11, RFA] -exec-continue/-exec-interrupt --all
Date: Sat, 28 Jun 2008 16:56:00 -0000 [thread overview]
Message-ID: <200806282045.39438.vladimir@codesourcery.com> (raw)
Per MI non-stop spec, continue and interrupt need --all option
to resume every thread. Implemented thusly. OK?
- Volodya
* infcmd.c (continue_1): New, extracted from
(continue_command): ...here.
(interrupt_target_1): New, extracted from
(interrupt_target_command): ...here.
* inferior.h (continue_1, interrupt_target_1): New.
* mi/mi-main.c (mi_cmd_exec_continue)
(mi_cmd_exec_interrupt): Handle --all.
---
gdb/infcmd.c | 58 ++++++++++++++++++++++++++++++++---------------------
gdb/inferior.h | 4 +++
gdb/mi/mi-main.c | 26 +++++++++++++++++++----
3 files changed, 60 insertions(+), 28 deletions(-)
diff --git a/gdb/infcmd.c b/gdb/infcmd.c
index ae3668f..6ec458c 100644
--- a/gdb/infcmd.c
+++ b/gdb/infcmd.c
@@ -625,6 +625,21 @@ proceed_thread_callback (struct thread_info *thread, void *arg)
return 0;
}
+void
+continue_1 (int all_threads)
+{
+ if (non_stop && all_threads)
+ /* Don't error out current thread is running, because there may
+ be other stopped threads. */
+ iterate_over_threads (proceed_thread_callback, NULL);
+ else
+ {
+ ensure_not_running ();
+ clear_proceed_status ();
+ proceed ((CORE_ADDR) -1, TARGET_SIGNAL_DEFAULT, 0);
+ }
+}
+
/* continue [-a] [proceed-count] [&] */
void
continue_command (char *args, int from_tty)
@@ -699,16 +714,7 @@ Can't resume all threads and specify proceed count simultaneously."));
if (from_tty)
printf_filtered (_("Continuing.\n"));
- if (non_stop && all_threads)
- /* Don't error out if the current thread is running, because
- there may be other stopped threads. */
- iterate_over_threads (proceed_thread_callback, NULL);
- else
- {
- ensure_not_running ();
- clear_proceed_status ();
- proceed ((CORE_ADDR) -1, TARGET_SIGNAL_DEFAULT, 0);
- }
+ continue_1 (all_threads);
}
\f
/* Step until outside of current statement. */
@@ -2148,6 +2154,24 @@ disconnect_command (char *args, int from_tty)
deprecated_detach_hook ();
}
+void
+interrupt_target_1 (int all_threads)
+{
+ if (non_stop)
+ {
+ ptid_t ptid;
+
+ if (all_threads)
+ ptid = minus_one_ptid;
+ else
+ ptid = inferior_ptid;
+
+ target_stop_ptid (ptid);
+ }
+ else
+ target_stop ();
+}
+
/* Stop the execution of the target while running in async mode, in
the backgound. In all-stop, stop the whole process. In non-stop
mode, stop the current thread only by default, or stop all threads
@@ -2170,19 +2194,7 @@ interrupt_target_command (char *args, int from_tty)
if (!non_stop && all_threads)
error (_("-a is meaningless in all-stop mode."));
- if (non_stop)
- {
- ptid_t ptid;
-
- if (all_threads)
- ptid = minus_one_ptid;
- else
- ptid = inferior_ptid;
-
- target_stop_ptid (ptid);
- }
- else
- target_stop ();
+ interrupt_target_1 (all_threads);
}
}
diff --git a/gdb/inferior.h b/gdb/inferior.h
index f4c6b83..d0067ce 100644
--- a/gdb/inferior.h
+++ b/gdb/inferior.h
@@ -271,10 +271,14 @@ extern void nexti_command (char *, int);
extern void stepi_command (char *, int);
+extern void continue_1 (int all_threads);
+
extern void continue_command (char *, int);
extern void interrupt_target_command (char *args, int from_tty);
+extern void interrupt_target_1 (int all_threads);
+
/* Last signal that the inferior received (why it stopped). */
extern enum target_signal stop_signal;
diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c
index 61ef5a4..87c3257 100644
--- a/gdb/mi/mi-main.c
+++ b/gdb/mi/mi-main.c
@@ -177,8 +177,12 @@ mi_cmd_exec_return (char *command, char **argv, int argc)
void
mi_cmd_exec_continue (char *command, char **argv, int argc)
{
- /* FIXME: Should call a libgdb function, not a cli wrapper. */
- return mi_execute_async_cli_command ("continue", argv, argc);
+ if (argc == 0)
+ continue_1 (0);
+ else if (argc == 1 && strcmp (argv[0], "--all") == 0)
+ continue_1 (1);
+ else
+ error ("Usage: -exec-continue [--all]");
}
/* Interrupt the execution of the target. Note how we must play around
@@ -189,10 +193,22 @@ mi_cmd_exec_continue (char *command, char **argv, int argc)
void
mi_cmd_exec_interrupt (char *command, char **argv, int argc)
{
- if (!is_running (inferior_ptid))
- error ("mi_cmd_exec_interrupt: Inferior not running.");
+ if (argc == 0)
+ {
+ if (!is_running (inferior_ptid))
+ error ("Current thread is not running.");
- interrupt_target_command (NULL, 0);
+ interrupt_target_1 (0);
+ }
+ else if (argc == 1 && strcmp (argv[0], "--all") == 0)
+ {
+ if (!any_running ())
+ error ("Inferior not running.");
+
+ interrupt_target_1 (1);
+ }
+ else
+ error ("Usage: -exec-interrupt [--all]");
}
void
--
1.5.3.5
next reply other threads:[~2008-06-28 16:46 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-06-28 16:56 Vladimir Prus [this message]
2008-06-28 18:17 ` Marc Khouzam
2008-06-29 6:05 ` Vladimir Prus
2008-06-28 20:28 ` Tom Tromey
2008-06-29 17:37 ` Vladimir Prus
2008-07-11 13:34 ` Daniel Jacobowitz
2008-07-13 4:25 ` Daniel Jacobowitz
2008-07-13 4:36 ` Vladimir Prus
2008-07-13 14:32 ` Daniel Jacobowitz
2008-07-13 16:24 ` Vladimir Prus
2008-07-13 22:35 ` Nick Roberts
2008-07-13 5:50 ` Vladimir Prus
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=200806282045.39438.vladimir@codesourcery.com \
--to=vladimir@codesourcery.com \
--cc=gdb-patches@sources.redhat.com \
/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