* defs.h (do_exec_error_cleanups, discard_exec_error_cleanups)
[deliverable/binutils-gdb.git] / gdb / inf-loop.c
index fc23fb80f34e3da58340e4f1e6e4940024c7c604..cfb80d5deab6931cd577d2cf8c3973ee49d80390 100644 (file)
@@ -1,5 +1,5 @@
 /* Handling of inferior events for the event loop for GDB, the GNU debugger.
-   Copyright (C) 1999, 2007 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2007, 2008 Free Software Foundation, Inc.
    Written by Elena Zannoni <ezannoni@cygnus.com> of Cygnus Solutions.
 
    This file is part of GDB.
@@ -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:
@@ -50,7 +51,7 @@ inferior_event_handler (enum inferior_event_type event_type,
       target_async (NULL, 0);
       pop_target ();
       discard_all_continuations ();
-      do_exec_error_cleanups (ALL_CLEANUPS);
+      async_enable_stdin ();
       break;
 
     case INF_REG_EVENT:
@@ -64,17 +65,56 @@ inferior_event_handler (enum inferior_event_type event_type,
          target_async (NULL, 0);
          pop_target ();
          discard_all_continuations ();
-         do_exec_error_cleanups (ALL_CLEANUPS);
+         async_enable_stdin ();
          display_gdb_prompt (0);
        }
       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);
+
+      /* The call to async_enable_stdin below resets 'sync_execution'.
+        However, if sync_execution is 1 now, we also need to show the
+        prompt below, so save the current value.  */
+      was_sync = sync_execution;
+      async_enable_stdin ();
+
       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 +143,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"));
-    }
-}
This page took 0.026652 seconds and 4 git commands to generate.