+2008-07-12 Vladimir Prus <vladimir@codesourcery.com>
+
+ Implement -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.
+
2008-07-12 Vladimir Prus <vladimir@codesourcery.com>
Implement --thread and --frame.
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)
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. */
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
{
if (target_can_async_p ())
{
- ptid_t ptid;
int all_threads = 0;
dont_repeat (); /* Not for the faint of heart */
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);
}
}
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;
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
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