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:
Pedro Alves
2015-04-01 14:58:56 +01:00
parent c4fc4724a6
commit e6f5c25b57
2 changed files with 15 additions and 9 deletions

View 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> 2015-04-01 Pedro Alves <palves@redhat.com>
* infrun.c (resume) <step past permanent breakpoint>: Use * infrun.c (resume) <step past permanent breakpoint>: Use

View File

@ -3132,6 +3132,7 @@ void
wait_for_inferior (void) wait_for_inferior (void)
{ {
struct cleanup *old_cleanups; struct cleanup *old_cleanups;
struct cleanup *thread_state_chain;
if (debug_infrun) if (debug_infrun)
fprintf_unfiltered fprintf_unfiltered
@ -3141,11 +3142,15 @@ wait_for_inferior (void)
= make_cleanup (delete_just_stopped_threads_infrun_breakpoints_cleanup, = make_cleanup (delete_just_stopped_threads_infrun_breakpoints_cleanup,
NULL); 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) while (1)
{ {
struct execution_control_state ecss; struct execution_control_state ecss;
struct execution_control_state *ecs = &ecss; struct execution_control_state *ecs = &ecss;
struct cleanup *old_chain;
ptid_t waiton_ptid = minus_one_ptid; ptid_t waiton_ptid = minus_one_ptid;
memset (ecs, 0, sizeof (*ecs)); memset (ecs, 0, sizeof (*ecs));
@ -3166,21 +3171,16 @@ wait_for_inferior (void)
if (debug_infrun) if (debug_infrun)
print_target_wait_results (waiton_ptid, ecs->ptid, &ecs->ws); 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. */ /* Now figure out what to do with the result of the result. */
handle_inferior_event (ecs); handle_inferior_event (ecs);
/* No error, don't finish the state yet. */
discard_cleanups (old_chain);
if (!ecs->wait_some_more) if (!ecs->wait_some_more)
break; break;
} }
/* No error, don't finish the state yet. */
discard_cleanups (thread_state_chain);
do_cleanups (old_cleanups); do_cleanups (old_cleanups);
} }