From e6f5c25b57546cbd88daccea4f1739c3f90f7560 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Wed, 1 Apr 2015 14:58:56 +0100 Subject: [PATCH] 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. --- gdb/ChangeLog | 6 ++++++ gdb/infrun.c | 18 +++++++++--------- 2 files changed, 15 insertions(+), 9 deletions(-) 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); } -- 2.30.2