From: Pedro Alves Date: Wed, 1 Apr 2015 13:58:56 +0000 (+0100) Subject: wait_for_inferior and errors thrown from target_wait X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e6f5c25b57546cbd88daccea4f1739c3f90f7560;p=binutils-gdb.git wait_for_inferior and errors thrown from target_wait 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 * infrun.c (wait_for_inferior): Install the finish_thread_state_cleanup cleanup across the whole function, not just around handle_inferior_event. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 5353e34d5a5..8e1bd11a344 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2015-04-01 Pedro Alves + + * 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 * infrun.c (resume) : Use diff --git a/gdb/infrun.c b/gdb/infrun.c index d7c250ea45e..18ce0361b7e 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -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); }