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 <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.
This commit is contained in:
parent
c4fc4724a6
commit
e6f5c25b57
@ -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
|
||||
|
18
gdb/infrun.c
18
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);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user