diff options
author | Vladimir Prus <vladimir@codesourcery.com> | 2008-03-14 18:57:44 +0000 |
---|---|---|
committer | Vladimir Prus <vladimir@codesourcery.com> | 2008-03-14 18:57:44 +0000 |
commit | 32c1e744c108afe9bebd41766ab3025279878f85 (patch) | |
tree | b2753a1c815eb9b5c2cca33ec36afe7ebcebf560 /gdb/inf-loop.c | |
parent | c04ea773f9e9764a17382e6c1e0cf5a8d24df67a (diff) | |
download | gdb-32c1e744c108afe9bebd41766ab3025279878f85.zip gdb-32c1e744c108afe9bebd41766ab3025279878f85.tar.gz gdb-32c1e744c108afe9bebd41766ab3025279878f85.tar.bz2 |
Async mode fixes.
* Makefile.in (infcmd.o, inf-loop.o): Update dependencies.
* breakpoint.c (bpstat_do_actions): In async mode,
don't jump to top expecting stop_bpstat to be already
updated.
* event-loop.c (start_event_loop): Call async_enable_stdin
on exception.
* event-top.c (async_enable_stdin): Do nothing if sync_execution
is not set.
(command_handler): Do not setup continuation here.
(command_line_handler_continuation): Move to...
* top.c (command_line_handler_continuation): ... here.
(execute_command): In async mode, register continuation.
Don't check frame's language in running in async mode.
* exceptions.c (throw_exception): Don't do exec_error_cleanups.
* inf-loop.c (complete_execution): Inline into...
(inferior_event_handler): ... here. Clear target_executing before
doing any cleanups. Don't try to show prompt if the target was
resumed.
* infcmd.c (signal_command): Add support for async mode.
(finish_command): Only add continuation if the target was
successfully resumed.
* remote.c (init_async_opts): Register to_get_thread_local_address
handler.
* mi/mi-interp.c (mi_cmd_interpreter_exec): Don't mess
with sync_execution.
* tui/tui-interp.c (tui_command_loop): Call async_enable_stdin
on exception.
Diffstat (limited to 'gdb/inf-loop.c')
-rw-r--r-- | gdb/inf-loop.c | 78 |
1 files changed, 47 insertions, 31 deletions
diff --git a/gdb/inf-loop.c b/gdb/inf-loop.c index b6f8bb8..c4fb111 100644 --- a/gdb/inf-loop.c +++ b/gdb/inf-loop.c @@ -25,9 +25,9 @@ #include "inf-loop.h" #include "remote.h" #include "exceptions.h" +#include "language.h" static int fetch_inferior_event_wrapper (gdb_client_data client_data); -static void complete_execution (void); void inferior_event_handler_wrapper (gdb_client_data client_data) @@ -43,6 +43,7 @@ void inferior_event_handler (enum inferior_event_type event_type, gdb_client_data client_data) { + int was_sync = 0; switch (event_type) { case INF_ERROR: @@ -70,11 +71,52 @@ inferior_event_handler (enum inferior_event_type event_type, break; case INF_EXEC_COMPLETE: - /* Is there anything left to do for the command issued to - complete? */ + + /* This is the first thing to do -- so that continuations know that + the target is stopped. For example, command_line_handler_continuation + will run breakpoint commands, and if we think that the target is + running, we'll refuse to execute most commands. MI continuation + presently uses target_executing to either print or not print *stopped. */ + target_executing = 0; + + /* Unregister the inferior from the event loop. This is done so that + when the inferior is not running we don't get distracted by + spurious inferior output. */ + if (target_has_execution) + target_async (NULL, 0); + + /* Calls to do_exec_error_cleanup below will call async_enable_stdin, + and that resets 'sync_execution'. However, if we were running + in sync execution mode, we also need to display the prompt. */ + was_sync = sync_execution; + + if (was_sync) + do_exec_error_cleanups (ALL_CLEANUPS); + do_all_continuations (); - /* Reset things after target has stopped for the async commands. */ - complete_execution (); + + if (current_language != expected_language) + { + if (language_mode == language_mode_auto) + { + language_info (1); /* Print what changed. */ + } + } + + /* If the continuation did not start the target again, + prepare for interation with the user. */ + if (!target_executing) + { + if (was_sync) + { + display_gdb_prompt (0); + } + else + { + if (exec_done_display_p) + printf_unfiltered (_("completed.\n")); + } + } break; case INF_EXEC_CONTINUE: @@ -103,29 +145,3 @@ fetch_inferior_event_wrapper (gdb_client_data client_data) fetch_inferior_event (client_data); return 1; } - -/* Reset proper settings after an asynchronous command has finished. - If the execution command was in synchronous mode, register stdin - with the event loop, and reset the prompt. */ - -static void -complete_execution (void) -{ - target_executing = 0; - - /* Unregister the inferior from the event loop. This is done so that - when the inferior is not running we don't get distracted by - spurious inferior output. */ - target_async (NULL, 0); - - if (sync_execution) - { - do_exec_error_cleanups (ALL_CLEANUPS); - display_gdb_prompt (0); - } - else - { - if (exec_done_display_p) - printf_unfiltered (_("completed.\n")); - } -} |