Remove remaining cleanup from fetch_inferior_event
This removes the remaining cleanup from fetch_inferior_event, replacing it with a SCOPE_EXIT. This required introducing a new scope and reindenting. gdb/ChangeLog: 2019-01-23 Tom Tromey <tom@tromey.com> Pedro Alves <palves@redhat.com> * infrun.c (reinstall_readline_callback_handler_cleanup): Remove parameter. (fetch_inferior_event): Use SCOPE_EXIT.
This commit is contained in:
parent
9885e6bb5b
commit
d238133d02
|
@ -1,3 +1,11 @@
|
||||||
|
2019-01-23 Tom Tromey <tom@tromey.com>
|
||||||
|
Pedro Alves <palves@redhat.com>
|
||||||
|
|
||||||
|
* infrun.c (reinstall_readline_callback_handler_cleanup): Remove
|
||||||
|
parameter.
|
||||||
|
(fetch_inferior_event): Use SCOPE_EXIT.
|
||||||
|
|
||||||
|
|
||||||
2019-01-23 Tom Tromey <tom@tromey.com>
|
2019-01-23 Tom Tromey <tom@tromey.com>
|
||||||
Pedro Alves <palves@redhat.com>
|
Pedro Alves <palves@redhat.com>
|
||||||
|
|
||||||
|
|
182
gdb/infrun.c
182
gdb/infrun.c
|
@ -3585,7 +3585,7 @@ wait_for_inferior (void)
|
||||||
input. */
|
input. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
reinstall_readline_callback_handler_cleanup (void *arg)
|
reinstall_readline_callback_handler_cleanup ()
|
||||||
{
|
{
|
||||||
struct ui *ui = current_ui;
|
struct ui *ui = current_ui;
|
||||||
|
|
||||||
|
@ -3687,7 +3687,6 @@ fetch_inferior_event (void *client_data)
|
||||||
{
|
{
|
||||||
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 = make_cleanup (null_cleanup, NULL);
|
|
||||||
int cmd_done = 0;
|
int cmd_done = 0;
|
||||||
ptid_t waiton_ptid = minus_one_ptid;
|
ptid_t waiton_ptid = minus_one_ptid;
|
||||||
|
|
||||||
|
@ -3699,116 +3698,119 @@ fetch_inferior_event (void *client_data)
|
||||||
scoped_restore save_ui = make_scoped_restore (¤t_ui, main_ui);
|
scoped_restore save_ui = make_scoped_restore (¤t_ui, main_ui);
|
||||||
|
|
||||||
/* End up with readline processing input, if necessary. */
|
/* End up with readline processing input, if necessary. */
|
||||||
make_cleanup (reinstall_readline_callback_handler_cleanup, NULL);
|
{
|
||||||
|
SCOPE_EXIT { reinstall_readline_callback_handler_cleanup (); };
|
||||||
|
|
||||||
/* We're handling a live event, so make sure we're doing live
|
/* We're handling a live event, so make sure we're doing live
|
||||||
debugging. If we're looking at traceframes while the target is
|
debugging. If we're looking at traceframes while the target is
|
||||||
running, we're going to need to get back to that mode after
|
running, we're going to need to get back to that mode after
|
||||||
handling the event. */
|
handling the event. */
|
||||||
gdb::optional<scoped_restore_current_traceframe> maybe_restore_traceframe;
|
gdb::optional<scoped_restore_current_traceframe> maybe_restore_traceframe;
|
||||||
if (non_stop)
|
if (non_stop)
|
||||||
{
|
{
|
||||||
maybe_restore_traceframe.emplace ();
|
maybe_restore_traceframe.emplace ();
|
||||||
set_current_traceframe (-1);
|
set_current_traceframe (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
gdb::optional<scoped_restore_current_thread> maybe_restore_thread;
|
gdb::optional<scoped_restore_current_thread> maybe_restore_thread;
|
||||||
|
|
||||||
if (non_stop)
|
if (non_stop)
|
||||||
/* In non-stop mode, the user/frontend should not notice a thread
|
/* In non-stop mode, the user/frontend should not notice a thread
|
||||||
switch due to internal events. Make sure we reverse to the
|
switch due to internal events. Make sure we reverse to the
|
||||||
user selected thread and frame after handling the event and
|
user selected thread and frame after handling the event and
|
||||||
running any breakpoint commands. */
|
running any breakpoint commands. */
|
||||||
maybe_restore_thread.emplace ();
|
maybe_restore_thread.emplace ();
|
||||||
|
|
||||||
overlay_cache_invalid = 1;
|
overlay_cache_invalid = 1;
|
||||||
/* Flush target cache before starting to handle each event. Target
|
/* Flush target cache before starting to handle each event. Target
|
||||||
was running and cache could be stale. This is just a heuristic.
|
was running and cache could be stale. This is just a heuristic.
|
||||||
Running threads may modify target memory, but we don't get any
|
Running threads may modify target memory, but we don't get any
|
||||||
event. */
|
event. */
|
||||||
target_dcache_invalidate ();
|
target_dcache_invalidate ();
|
||||||
|
|
||||||
scoped_restore save_exec_dir
|
scoped_restore save_exec_dir
|
||||||
= make_scoped_restore (&execution_direction, target_execution_direction ());
|
= make_scoped_restore (&execution_direction,
|
||||||
|
target_execution_direction ());
|
||||||
|
|
||||||
ecs->ptid = do_target_wait (waiton_ptid, &ecs->ws,
|
ecs->ptid = do_target_wait (waiton_ptid, &ecs->ws,
|
||||||
target_can_async_p () ? TARGET_WNOHANG : 0);
|
target_can_async_p () ? TARGET_WNOHANG : 0);
|
||||||
|
|
||||||
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
|
/* If an error happens while handling the event, propagate GDB's
|
||||||
knowledge of the executing state to the frontend/user running
|
knowledge of the executing state to the frontend/user running
|
||||||
state. */
|
state. */
|
||||||
ptid_t finish_ptid = !target_is_non_stop_p () ? minus_one_ptid : ecs->ptid;
|
ptid_t finish_ptid = !target_is_non_stop_p () ? minus_one_ptid : ecs->ptid;
|
||||||
scoped_finish_thread_state finish_state (finish_ptid);
|
scoped_finish_thread_state finish_state (finish_ptid);
|
||||||
|
|
||||||
/* Get executed before make_cleanup_restore_current_thread above to apply
|
/* Get executed before make_cleanup_restore_current_thread above to apply
|
||||||
still for the thread which has thrown the exception. */
|
still for the thread which has thrown the exception. */
|
||||||
auto defer_bpstat_clear
|
auto defer_bpstat_clear
|
||||||
= make_scope_exit (bpstat_clear_actions);
|
= make_scope_exit (bpstat_clear_actions);
|
||||||
auto defer_delete_threads
|
auto defer_delete_threads
|
||||||
= make_scope_exit (delete_just_stopped_threads_infrun_breakpoints);
|
= make_scope_exit (delete_just_stopped_threads_infrun_breakpoints);
|
||||||
|
|
||||||
/* 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);
|
||||||
|
|
||||||
if (!ecs->wait_some_more)
|
if (!ecs->wait_some_more)
|
||||||
{
|
{
|
||||||
struct inferior *inf = find_inferior_ptid (ecs->ptid);
|
struct inferior *inf = find_inferior_ptid (ecs->ptid);
|
||||||
int should_stop = 1;
|
int should_stop = 1;
|
||||||
struct thread_info *thr = ecs->event_thread;
|
struct thread_info *thr = ecs->event_thread;
|
||||||
|
|
||||||
delete_just_stopped_threads_infrun_breakpoints ();
|
delete_just_stopped_threads_infrun_breakpoints ();
|
||||||
|
|
||||||
if (thr != NULL)
|
if (thr != NULL)
|
||||||
{
|
{
|
||||||
struct thread_fsm *thread_fsm = thr->thread_fsm;
|
struct thread_fsm *thread_fsm = thr->thread_fsm;
|
||||||
|
|
||||||
if (thread_fsm != NULL)
|
if (thread_fsm != NULL)
|
||||||
should_stop = thread_fsm_should_stop (thread_fsm, thr);
|
should_stop = thread_fsm_should_stop (thread_fsm, thr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!should_stop)
|
if (!should_stop)
|
||||||
{
|
{
|
||||||
keep_going (ecs);
|
keep_going (ecs);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int should_notify_stop = 1;
|
int should_notify_stop = 1;
|
||||||
int proceeded = 0;
|
int proceeded = 0;
|
||||||
|
|
||||||
clean_up_just_stopped_threads_fsms (ecs);
|
clean_up_just_stopped_threads_fsms (ecs);
|
||||||
|
|
||||||
if (thr != NULL && thr->thread_fsm != NULL)
|
if (thr != NULL && thr->thread_fsm != NULL)
|
||||||
{
|
{
|
||||||
should_notify_stop
|
should_notify_stop
|
||||||
= thread_fsm_should_notify_stop (thr->thread_fsm);
|
= thread_fsm_should_notify_stop (thr->thread_fsm);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (should_notify_stop)
|
if (should_notify_stop)
|
||||||
{
|
{
|
||||||
/* We may not find an inferior if this was a process exit. */
|
/* We may not find an inferior if this was a process exit. */
|
||||||
if (inf == NULL || inf->control.stop_soon == NO_STOP_QUIETLY)
|
if (inf == NULL || inf->control.stop_soon == NO_STOP_QUIETLY)
|
||||||
proceeded = normal_stop ();
|
proceeded = normal_stop ();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!proceeded)
|
if (!proceeded)
|
||||||
{
|
{
|
||||||
inferior_event_handler (INF_EXEC_COMPLETE, NULL);
|
inferior_event_handler (INF_EXEC_COMPLETE, NULL);
|
||||||
cmd_done = 1;
|
cmd_done = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
defer_delete_threads.release ();
|
defer_delete_threads.release ();
|
||||||
defer_bpstat_clear.release ();
|
defer_bpstat_clear.release ();
|
||||||
|
|
||||||
/* No error, don't finish the thread states yet. */
|
/* No error, don't finish the thread states yet. */
|
||||||
finish_state.release ();
|
finish_state.release ();
|
||||||
|
|
||||||
/* Revert thread and frame. */
|
/* This scope is used to ensure that readline callbacks are
|
||||||
do_cleanups (old_chain);
|
reinstalled here. */
|
||||||
|
}
|
||||||
|
|
||||||
/* If a UI was in sync execution mode, and now isn't, restore its
|
/* If a UI was in sync execution mode, and now isn't, restore its
|
||||||
prompt (a synchronous execution command has finished, and we're
|
prompt (a synchronous execution command has finished, and we're
|
||||||
|
|
Loading…
Reference in New Issue