From patchwork Wed Jan 9 03:34:23 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 31008 Received: (qmail 37282 invoked by alias); 9 Jan 2019 03:34:39 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 36996 invoked by uid 89); 9 Jan 2019 03:34:36 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=proceeded X-HELO: gateway30.websitewelcome.com Received: from gateway30.websitewelcome.com (HELO gateway30.websitewelcome.com) (192.185.160.12) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 09 Jan 2019 03:34:33 +0000 Received: from cm10.websitewelcome.com (cm10.websitewelcome.com [100.42.49.4]) by gateway30.websitewelcome.com (Postfix) with ESMTP id 99B5E1130A for ; Tue, 8 Jan 2019 21:34:31 -0600 (CST) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with SMTP id h4dTg1gKt2PzOh4dTggF17; Tue, 08 Jan 2019 21:34:31 -0600 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tromey.com; s=default; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From: Sender:Reply-To:MIME-Version:Content-Type:Content-Transfer-Encoding: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=TIGaZz9Bu0foHOMkvItWFErM+nn0CO7TGvwMlgWPkig=; b=piRWcreVUappRbvvw8PLep+b6t wzjtwdxN79sFhcw5oqDMrZLVieAmESV0PmN1qQzGWanw4eY5schGoiVIbC0Y1onK+34+xoHZCu5KF 8ZXjmKPtJrlNK2rDhsarPYJpz; Received: from 75-166-72-210.hlrn.qwest.net ([75.166.72.210]:47026 helo=bapiya.Home) by box5379.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.91) (envelope-from ) id 1gh4dT-000HG2-DM; Tue, 08 Jan 2019 21:34:31 -0600 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH 09/12] Remove remaining cleanup from fetch_inferior_event Date: Tue, 8 Jan 2019 20:34:23 -0700 Message-Id: <20190109033426.16062-10-tom@tromey.com> In-Reply-To: <20190109033426.16062-1-tom@tromey.com> References: <20190109033426.16062-1-tom@tromey.com> This removes the remaining cleanup from fetch_inferior_event, replacing it with a cleanup_function. This required introducing a new scope and reindenting. gdb/ChangeLog 2019-01-08 Tom Tromey * infrun.c (reinstall_readline_callback_handler_cleanup): Remove argument. (fetch_inferior_event): Use cleanup_function. --- gdb/ChangeLog | 6 ++ gdb/infrun.c | 183 +++++++++++++++++++++++++------------------------- 2 files changed, 99 insertions(+), 90 deletions(-) diff --git a/gdb/infrun.c b/gdb/infrun.c index 19c6289f8d..f43f39a253 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -3586,7 +3586,7 @@ wait_for_inferior (void) input. */ static void -reinstall_readline_callback_handler_cleanup (void *arg) +reinstall_readline_callback_handler_cleanup () { struct ui *ui = current_ui; @@ -3688,7 +3688,6 @@ fetch_inferior_event (void *client_data) { struct execution_control_state ecss; struct execution_control_state *ecs = &ecss; - struct cleanup *old_chain = make_cleanup (null_cleanup, NULL); int cmd_done = 0; ptid_t waiton_ptid = minus_one_ptid; @@ -3700,115 +3699,119 @@ fetch_inferior_event (void *client_data) scoped_restore save_ui = make_scoped_restore (¤t_ui, main_ui); /* End up with readline processing input, if necessary. */ - make_cleanup (reinstall_readline_callback_handler_cleanup, NULL); + { + cleanup_function defer_reinstall_readline + (reinstall_readline_callback_handler_cleanup); + + /* We're handling a live event, so make sure we're doing live + debugging. If we're looking at traceframes while the target is + running, we're going to need to get back to that mode after + handling the event. */ + gdb::optional maybe_restore_traceframe; + if (non_stop) + { + maybe_restore_traceframe.emplace (); + set_current_traceframe (-1); + } - /* We're handling a live event, so make sure we're doing live - debugging. If we're looking at traceframes while the target is - running, we're going to need to get back to that mode after - handling the event. */ - gdb::optional maybe_restore_traceframe; - if (non_stop) - { - maybe_restore_traceframe.emplace (); - set_current_traceframe (-1); - } + gdb::optional maybe_restore_thread; - gdb::optional maybe_restore_thread; + if (non_stop) + /* In non-stop mode, the user/frontend should not notice a thread + switch due to internal events. Make sure we reverse to the + user selected thread and frame after handling the event and + running any breakpoint commands. */ + maybe_restore_thread.emplace (); - if (non_stop) - /* In non-stop mode, the user/frontend should not notice a thread - switch due to internal events. Make sure we reverse to the - user selected thread and frame after handling the event and - running any breakpoint commands. */ - maybe_restore_thread.emplace (); + overlay_cache_invalid = 1; + /* Flush target cache before starting to handle each event. Target + was running and cache could be stale. This is just a heuristic. + Running threads may modify target memory, but we don't get any + event. */ + target_dcache_invalidate (); - overlay_cache_invalid = 1; - /* Flush target cache before starting to handle each event. Target - was running and cache could be stale. This is just a heuristic. - Running threads may modify target memory, but we don't get any - event. */ - target_dcache_invalidate (); - - scoped_restore save_exec_dir - = make_scoped_restore (&execution_direction, target_execution_direction ()); + scoped_restore save_exec_dir + = make_scoped_restore (&execution_direction, + target_execution_direction ()); - ecs->ptid = do_target_wait (waiton_ptid, &ecs->ws, - target_can_async_p () ? TARGET_WNOHANG : 0); + ecs->ptid = do_target_wait (waiton_ptid, &ecs->ws, + target_can_async_p () ? TARGET_WNOHANG : 0); - if (debug_infrun) - print_target_wait_results (waiton_ptid, ecs->ptid, &ecs->ws); + 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. */ - ptid_t finish_ptid = !target_is_non_stop_p () ? minus_one_ptid : ecs->ptid; - scoped_finish_thread_state finish_state (finish_ptid); + /* If an error happens while handling the event, propagate GDB's + knowledge of the executing state to the frontend/user running + state. */ + ptid_t finish_ptid = !target_is_non_stop_p () ? minus_one_ptid : ecs->ptid; + scoped_finish_thread_state finish_state (finish_ptid); - /* Get executed before make_cleanup_restore_current_thread above to apply - still for the thread which has thrown the exception. */ - cleanup_function defer_bpstat_clear (bpstat_clear_actions); - cleanup_function defer_delete_threads - (delete_just_stopped_threads_infrun_breakpoints); + /* Get executed before make_cleanup_restore_current_thread above to apply + still for the thread which has thrown the exception. */ + cleanup_function defer_bpstat_clear (bpstat_clear_actions); + cleanup_function defer_delete_threads + (delete_just_stopped_threads_infrun_breakpoints); - /* Now figure out what to do with the result of the result. */ - handle_inferior_event (ecs); + /* Now figure out what to do with the result of the result. */ + handle_inferior_event (ecs); - if (!ecs->wait_some_more) - { - struct inferior *inf = find_inferior_ptid (ecs->ptid); - int should_stop = 1; - struct thread_info *thr = ecs->event_thread; + if (!ecs->wait_some_more) + { + struct inferior *inf = find_inferior_ptid (ecs->ptid); + int should_stop = 1; + struct thread_info *thr = ecs->event_thread; - delete_just_stopped_threads_infrun_breakpoints (); + delete_just_stopped_threads_infrun_breakpoints (); - if (thr != NULL) - { - struct thread_fsm *thread_fsm = thr->thread_fsm; + if (thr != NULL) + { + struct thread_fsm *thread_fsm = thr->thread_fsm; - if (thread_fsm != NULL) - should_stop = thread_fsm_should_stop (thread_fsm, thr); - } + if (thread_fsm != NULL) + should_stop = thread_fsm_should_stop (thread_fsm, thr); + } - if (!should_stop) - { - keep_going (ecs); - } - else - { - int should_notify_stop = 1; - int proceeded = 0; + if (!should_stop) + { + keep_going (ecs); + } + else + { + int should_notify_stop = 1; + int proceeded = 0; - clean_up_just_stopped_threads_fsms (ecs); + clean_up_just_stopped_threads_fsms (ecs); - if (thr != NULL && thr->thread_fsm != NULL) - { - should_notify_stop - = thread_fsm_should_notify_stop (thr->thread_fsm); - } + if (thr != NULL && thr->thread_fsm != NULL) + { + should_notify_stop + = thread_fsm_should_notify_stop (thr->thread_fsm); + } - if (should_notify_stop) - { - /* We may not find an inferior if this was a process exit. */ - if (inf == NULL || inf->control.stop_soon == NO_STOP_QUIETLY) - proceeded = normal_stop (); - } + if (should_notify_stop) + { + /* We may not find an inferior if this was a process exit. */ + if (inf == NULL || inf->control.stop_soon == NO_STOP_QUIETLY) + proceeded = normal_stop (); + } - if (!proceeded) - { - inferior_event_handler (INF_EXEC_COMPLETE, NULL); - cmd_done = 1; - } - } - } + if (!proceeded) + { + inferior_event_handler (INF_EXEC_COMPLETE, NULL); + cmd_done = 1; + } + } + } - defer_delete_threads.cancel (); - defer_bpstat_clear.cancel (); + defer_delete_threads.cancel (); + defer_bpstat_clear.cancel (); - /* No error, don't finish the thread states yet. */ - finish_state.release (); + /* No error, don't finish the thread states yet. */ + finish_state.release (); - /* Revert thread and frame. */ - do_cleanups (old_chain); + /* This scope is used to ensure that readline callbacks are + reinstalled here. */ + } /* If a UI was in sync execution mode, and now isn't, restore its prompt (a synchronous execution command has finished, and we're