wait_for_inferior and errors thrown from target_wait
authorPedro Alves <palves@redhat.com>
Wed, 1 Apr 2015 13:58:56 +0000 (14:58 +0100)
committerPedro Alves <palves@redhat.com>
Wed, 1 Apr 2015 13:58:56 +0000 (14:58 +0100)
Noticed that if an error is thrown out of target_wait, we miss running
finish_thread_state_cleanup.

Tested on x86_64 Fedora 20, with "maint set target-async off".

gdb/ChangeLog:
2015-04-01  Pedro Alves  <palves@redhat.com>

* infrun.c (wait_for_inferior): Install the
finish_thread_state_cleanup cleanup across the whole function, not
just around handle_inferior_event.

gdb/ChangeLog
gdb/infrun.c

index 5353e34d5a5166618e11a64c8dc9b21d89cb28e6..8e1bd11a344b1070da8bb8cdaaff620d81ff5b27 100644 (file)
@@ -1,3 +1,9 @@
+2015-04-01  Pedro Alves  <palves@redhat.com>
+
+       * infrun.c (wait_for_inferior): Install the
+       finish_thread_state_cleanup cleanup across the whole function, not
+       just around handle_inferior_event.
+
 2015-04-01  Pedro Alves  <palves@redhat.com>
 
        * infrun.c (resume) <step past permanent breakpoint>: Use
index d7c250ea45eb8643a21be1ca225277d1d02bc7f3..18ce0361b7ee0bda2e1c37f1a03285a74e9f2786 100644 (file)
@@ -3132,6 +3132,7 @@ void
 wait_for_inferior (void)
 {
   struct cleanup *old_cleanups;
+  struct cleanup *thread_state_chain;
 
   if (debug_infrun)
     fprintf_unfiltered
@@ -3141,11 +3142,15 @@ wait_for_inferior (void)
     = make_cleanup (delete_just_stopped_threads_infrun_breakpoints_cleanup,
                    NULL);
 
+  /* If an error happens while handling the event, propagate GDB's
+     knowledge of the executing state to the frontend/user running
+     state.  */
+  thread_state_chain = make_cleanup (finish_thread_state_cleanup, &minus_one_ptid);
+
   while (1)
     {
       struct execution_control_state ecss;
       struct execution_control_state *ecs = &ecss;
-      struct cleanup *old_chain;
       ptid_t waiton_ptid = minus_one_ptid;
 
       memset (ecs, 0, sizeof (*ecs));
@@ -3166,21 +3171,16 @@ wait_for_inferior (void)
       if (debug_infrun)
        print_target_wait_results (waiton_ptid, ecs->ptid, &ecs->ws);
 
-      /* If an error happens while handling the event, propagate GDB's
-        knowledge of the executing state to the frontend/user running
-        state.  */
-      old_chain = make_cleanup (finish_thread_state_cleanup, &minus_one_ptid);
-
       /* Now figure out what to do with the result of the result.  */
       handle_inferior_event (ecs);
 
-      /* No error, don't finish the state yet.  */
-      discard_cleanups (old_chain);
-
       if (!ecs->wait_some_more)
        break;
     }
 
+  /* No error, don't finish the state yet.  */
+  discard_cleanups (thread_state_chain);
+
   do_cleanups (old_cleanups);
 }