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.
This commit is contained in:
Vladimir Prus 2008-07-12 17:10:59 +00:00
parent 1e92afda99
commit 77ebaa5ad3
4 changed files with 74 additions and 32 deletions

View File

@ -1,3 +1,14 @@
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.

View File

@ -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);
}
/* 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);
}
}

View File

@ -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;

View File

@ -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