* top.c: Include interps.h.
(execute_command): If the target can async, but the interpreter is
in sync mode, synchronously wait for the command to finish before
returning.
(execute_command_to_string): Force the interpreter to sync mode.
* infrun.c: Include interps.h.
(fetch_inferior_event): Don't restore the prompt yet if the
interpreter is in sync mode.
* interps.c (interpreter_async): New global.
* interps.h (interpreter_async): Declare.
* inf-loop.c: Include interps.h.
(inferior_event_handler): Don't print the language change or run
breakpoint commands yet if the interpreter in is sync mode.
* main.c (captured_command_loop): Flip the interpreter to async
mode.
* cli/cli-script.c: Include interps.h.
(execute_user_command, while_command, if_command): Force the
interpreter to sync mode.
* python/python.c: Include interps.h.
(python_command, execute_gdb_command): Force the interpreter to
sync mode.
+2011-09-02 Pedro Alves <pedro@codesourcery.com>
+
+ * top.c: Include interps.h.
+ (execute_command): If the target can async, but the interpreter is
+ in sync mode, synchronously wait for the command to finish before
+ returning.
+ (execute_command_to_string): Force the interpreter to sync mode.
+ * infrun.c: Include interps.h.
+ (fetch_inferior_event): Don't restore the prompt yet if the
+ interpreter is in sync mode.
+ * interps.c (interpreter_async): New global.
+ * interps.h (interpreter_async): Declare.
+ * inf-loop.c: Include interps.h.
+ (inferior_event_handler): Don't print the language change or run
+ breakpoint commands yet if the interpreter in is sync mode.
+ * main.c (captured_command_loop): Flip the interpreter to async
+ mode.
+ * cli/cli-script.c: Include interps.h.
+ (execute_user_command, while_command, if_command): Force the
+ interpreter to sync mode.
+ * python/python.c: Include interps.h.
+ (python_command, execute_gdb_command): Force the interpreter to
+ sync mode.
+
2011-09-02 Pedro Alves <pedro@codesourcery.com>
* value.c (show_convenience): Catch errors thrown while printing
#include "gdb_assert.h"
#include "python/python.h"
+#include "interps.h"
/* Prototypes for local functions. */
not confused with Insight. */
in_user_command = 1;
+ make_cleanup_restore_integer (&interpreter_async);
+ interpreter_async = 0;
+
command_nest_depth++;
while (cmdlines)
{
while_command (char *arg, int from_tty)
{
struct command_line *command = NULL;
+ struct cleanup *old_chain;
control_level = 1;
command = get_command_line (while_control, arg);
if (command == NULL)
return;
+ old_chain = make_cleanup_restore_integer (&interpreter_async);
+ interpreter_async = 0;
+
execute_control_command_untraced (command);
free_command_lines (&command);
+
+ do_cleanups (old_chain);
}
/* "if" command support. Execute either the true or false arm depending
if_command (char *arg, int from_tty)
{
struct command_line *command = NULL;
+ struct cleanup *old_chain;
control_level = 1;
command = get_command_line (if_control, arg);
if (command == NULL)
return;
+ old_chain = make_cleanup_restore_integer (&interpreter_async);
+ interpreter_async = 0;
+
execute_control_command_untraced (command);
free_command_lines (&command);
+
+ do_cleanups (old_chain);
}
/* Cleanup */
#include "language.h"
#include "gdbthread.h"
#include "continuations.h"
+#include "interps.h"
static int fetch_inferior_event_wrapper (gdb_client_data client_data);
inferior_event_handler (enum inferior_event_type event_type,
gdb_client_data client_data)
{
- struct gdb_exception e;
int was_sync = 0;
struct cleanup *cleanup_if_error = make_bpstat_clear_actions_cleanup ();
else
do_all_continuations (0);
- if (info_verbose
- && current_language != expected_language
- && language_mode == language_mode_auto)
- language_info (1); /* Print what changed. */
-
- /* Don't propagate breakpoint commands errors. Either we're
- stopping or some command resumes the inferior. The user will
- be informed. */
- TRY_CATCH (e, RETURN_MASK_ALL)
+ /* When running a command list (from a user command, say), these
+ are only run when the command list is all done. */
+ if (interpreter_async)
{
- bpstat_do_actions ();
+ volatile struct gdb_exception e;
+
+ if (info_verbose
+ && current_language != expected_language
+ && language_mode == language_mode_auto)
+ language_info (1); /* Print what changed. */
+
+ /* Don't propagate breakpoint commands errors. Either we're
+ stopping or some command resumes the inferior. The user will
+ be informed. */
+ TRY_CATCH (e, RETURN_MASK_ALL)
+ {
+ bpstat_do_actions ();
+ }
+ exception_print (gdb_stderr, e);
}
- exception_print (gdb_stderr, e);
if (!was_sync
&& exec_done_display_p
#include "jit.h"
#include "tracepoint.h"
#include "continuations.h"
+#include "interps.h"
/* Prototypes for local functions */
/* If the inferior was in sync execution mode, and now isn't,
restore the prompt. */
- if (was_sync && !sync_execution)
+ if (interpreter_async && was_sync && !sync_execution)
display_gdb_prompt (0);
}
#include "exceptions.h"
#include "continuations.h"
+/* True if the current interpreter in is async mode. See interps.h
+ for more details. This starts out disabled, until all the explicit
+ command line arguments (e.g., `gdb -ex "start" -ex "next"') are
+ processed. */
+int interpreter_async = 0;
+
struct interp
{
/* This is the name in "-i=" and set interpreter. */
extern void *top_level_interpreter_data (void);
extern struct interp *top_level_interpreter (void);
+/* True if the current interpreter is in async mode, false if in sync
+ mode. If in sync mode, running a synchronous execution command
+ (with execute_command, e.g, "next") will not return until the
+ command is finished. If in async mode, then running a synchronous
+ command returns right after resuming the target. Waiting for the
+ command's completion is later done on the top event loop (using
+ continuations). */
+extern int interpreter_async;
+
extern void clear_interpreter_hooks (void);
/* well-known interpreters */
static int
captured_command_loop (void *data)
{
+ /* Top-level execution commands can be run on the background from
+ here on. */
+ interpreter_async = 1;
+
current_interp_command_loop ();
/* FIXME: cagney/1999-11-05: A correct command_loop() implementaton
would clean things up (restoring the cleanup chain) to the state
#include "target.h"
#include "gdbthread.h"
#include "observer.h"
+#include "interps.h"
static PyMethodDef GdbMethods[];
struct cleanup *cleanup;
cleanup = ensure_python_env (get_current_arch (), current_language);
+
+ make_cleanup_restore_integer (&interpreter_async);
+ interpreter_async = 0;
+
while (arg && *arg && isspace (*arg))
++arg;
if (arg && *arg)
char *copy = xstrdup (arg);
struct cleanup *cleanup = make_cleanup (xfree, copy);
+ make_cleanup_restore_integer (&interpreter_async);
+ interpreter_async = 0;
+
prevent_dont_repeat ();
if (to_string)
result = execute_command_to_string (copy, from_tty);
#include "event-loop.h"
#include "gdbthread.h"
#include "python/python.h"
+#include "interps.h"
/* readline include files. */
#include "readline/readline.h"
deprecated_call_command_hook (c, arg, from_tty & caution);
else
cmd_func (c, arg, from_tty & caution);
-
+
+ /* If the interpreter is in sync mode (we're running a user
+ command's list, running command hooks or similars), and we
+ just ran a synchronous command that started the target, wait
+ for that command to end. */
+ if (!interpreter_async && sync_execution && is_running (inferior_ptid))
+ {
+ while (gdb_do_one_event () >= 0)
+ if (!sync_execution)
+ break;
+ }
+
/* If this command has been post-hooked, run the hook last. */
execute_cmd_post_hook (c);
restoration callbacks. */
cleanup = set_batch_flag_and_make_cleanup_restore_page_info ();
+ make_cleanup_restore_integer (&interpreter_async);
+ interpreter_async = 0;
+
str_file = mem_fileopen ();
make_cleanup_ui_file_delete (str_file);