From: Vladimir Prus <vladimir@codesourcery.com>
To: gdb-patches@sources.redhat.com
Subject: Re: [MI non-stop 05/11, RFA] -exec-continue/-exec-interrupt --all
Date: Sun, 13 Jul 2008 05:50:00 -0000 [thread overview]
Message-ID: <g5c4qh$dbm$3@ger.gmane.org> (raw)
In-Reply-To: <200806282045.39438.vladimir@codesourcery.com>
[-- Attachment #1: Type: text/plain, Size: 320 bytes --]
Vladimir Prus wrote:
>
> Per MI non-stop spec, continue and interrupt need --all option
> to resume every thread. Implemented thusly. OK?
Here's what went in. There were mechanical adjustments since
the continue and interrupt code was revised by Pedro per review comments.
No functional changes, though.
- Volodya
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: all.diff --]
[-- Type: text/x-diff; name="all.diff", Size: 5182 bytes --]
commit 426f984015cb596e6119e41a3daa2a4785ed5974
Author: Vladimir Prus <vladimir@codesourcery.com>
Date: Fri Jun 6 21:26:14 2008 +0400
-exec-continue/-exec-interrupt --all
* 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.
diff --git a/gdb/infcmd.c b/gdb/infcmd.c
index f5fd018..0a40564 100644
--- a/gdb/infcmd.c
+++ b/gdb/infcmd.c
@@ -620,6 +620,31 @@ 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 if the current thread is running, because
+ there may be other stopped threads. */
+ struct cleanup *old_chain;
+
+ /* Backup current thread and selected frame. */
+ old_chain = make_cleanup_restore_current_thread ();
+
+ iterate_over_threads (proceed_thread_callback, NULL);
+
+ /* Restore selected ptid. */
+ do_cleanups (old_chain);
+ }
+ 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)
@@ -694,26 +719,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. */
- struct cleanup *old_chain;
-
- /* Backup current thread and selected frame. */
- old_chain = make_cleanup_restore_current_thread ();
-
- iterate_over_threads (proceed_thread_callback, NULL);
-
- /* Restore selected ptid. */
- do_cleanups (old_chain);
- }
- 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. */
@@ -2146,6 +2152,17 @@ disconnect_command (char *args, int from_tty)
deprecated_detach_hook ();
}
+void
+interrupt_target_1 (int all_threads)
+{
+ ptid_t ptid;
+ if (all_threads)
+ ptid = minus_one_ptid;
+ else
+ ptid = inferior_ptid;
+ target_stop (ptid);
+}
+
/* 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
@@ -2157,7 +2174,6 @@ interrupt_target_command (char *args, int from_tty)
{
if (target_can_async_p ())
{
- ptid_t ptid;
int all_threads = 0;
dont_repeat (); /* Not for the faint of heart */
@@ -2169,12 +2185,7 @@ interrupt_target_command (char *args, int from_tty)
if (!non_stop && all_threads)
error (_("-a is meaningless in all-stop mode."));
- if (all_threads)
- ptid = minus_one_ptid;
- else
- ptid = inferior_ptid;
-
- target_stop (ptid);
+ interrupt_target_1 (all_threads);
}
}
diff --git a/gdb/inferior.h b/gdb/inferior.h
index 60d0352..f53af8b 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 f829a93..43f3a5f 100644
--- a/gdb/mi/mi-main.c
+++ b/gdb/mi/mi-main.c
@@ -163,8 +163,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
@@ -175,10 +179,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
prev parent reply other threads:[~2008-07-13 5:50 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-06-28 16:56 Vladimir Prus
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 [this message]
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='g5c4qh$dbm$3@ger.gmane.org' \
--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