From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM02-DM3-obe.outbound.protection.outlook.com (mail-dm3nam07on2053.outbound.protection.outlook.com [40.107.95.53]) by sourceware.org (Postfix) with ESMTPS id 323633858D37 for ; Wed, 19 Jan 2022 11:53:29 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 323633858D37 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=L7T/nSfN4FegqW/MBw0XAI7J6mxNkiPiXkaKRrrR+bzsnEXfyakFeYYrk4bHbv8Ute+c0vdPXij4fsmt46vB3ADa3c/w+wt/RD1b+WoqjYk/gKooAAvRSmQgniks3hp0n4AaY7FQnq9xGDxpAWqDM05NKt6Udbqq59IobpkUAIQfXGEOKCPUh8NL32ibBaLDEZU9V3jTs9tWDQbDY98xYxDtUCBTIgi5Kpmy7REJAABmzsDvZj2GymEDcFetVaDsqwppupnNpRHUl874xxHo+KWKviHAm8+ty4kqJM04tO4TFrnUnoExTG9g52fpzV9LmMn8Z8mqS0WzlouXCA/XaQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=utdVZQJytRzwx6qUEhw+z0Qg0Pg611d8ZMc1SVO8Nyg=; b=OHZ9OHiFIYVg6IU5bbyrAPMogkqrKeGjnwWvataWyyWFR0tE8ck3X7awHO8PMExD0QnibDoxmUrDIbG/5oBdMpHUPX3xEcNJSR/x9MTHaeWYGcovB2Ma49RQPCBI/EswWiA062zvraJxxWa3hm/5bR73ckdoQ24k+f0ZF2aXAnT6XqR1LaSUlEx+pb2EMN4E5AIQD7+rGH741GPD/4JacVW+Mw5M3IzvuA//Fp+/NQfMHazGiHY+/qU/8zXqW/HY6YDp4ybnULWkN7sI+AQf/oIuivofgRgiF4icNJtflTNIRylNnF8tuvHCZjCjVMMoU0Kk5vzgA2e6B/DzUfetsA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=sourceware.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none Received: from DM3PR14CA0133.namprd14.prod.outlook.com (2603:10b6:0:53::17) by MWHPR12MB1229.namprd12.prod.outlook.com (2603:10b6:300:11::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4909.8; Wed, 19 Jan 2022 11:53:25 +0000 Received: from DM6NAM11FT057.eop-nam11.prod.protection.outlook.com (2603:10b6:0:53:cafe::c6) by DM3PR14CA0133.outlook.office365.com (2603:10b6:0:53::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4909.8 via Frontend Transport; Wed, 19 Jan 2022 11:53:25 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; Received: from SATLEXMB04.amd.com (165.204.84.17) by DM6NAM11FT057.mail.protection.outlook.com (10.13.172.252) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.4909.7 via Frontend Transport; Wed, 19 Jan 2022 11:53:25 +0000 Received: from node-bp126-r03c.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.18; Wed, 19 Jan 2022 05:53:24 -0600 From: Lancelot SIX To: CC: Lancelot SIX Subject: [PATCH] gdb: make thread_info::thread_fsm a std::unique_ptr Date: Wed, 19 Jan 2022 05:51:35 -0600 Message-ID: <20220119115135.117096-1-lancelot.six@amd.com> X-Mailer: git-send-email 2.17.1 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.180.168.240] X-ClientProxiedBy: SATLEXMB03.amd.com (10.181.40.144) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 467159f2-711f-4922-1c89-08d9db424cea X-MS-TrafficTypeDiagnostic: MWHPR12MB1229:EE_ X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:5516; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: XBt0Xy1LOOcAo2ycebsO9/ncqDATDtkGqw7kWm8UMYTlM/WetZlbYFMlz6878g9umy19NuuqpMDmAGV9n+fkDNStoycULqIBRk2oJhpsTgXm+IgBGaZ2s7prgHxM1ZuJgU6X3kpGnnHaFkpXMaEaebAjzSuswdJ3oPrcDJYCWU8+OhiflJTkEiZL1b31yXJKctM5IMMYUVK67v1uHl4qKruTDgJAZGcxa9Fbwq17Pf8xYeBFxKmbN/np2IWne1B7l7LKp7YbPlml9M6T4LdJWlnFlb+yI2i86A63knrSRYGrwLRhhFFC0s25Tt5nPUX8i/SIIhicRB/lcMRUW3eGeSF+KMx763XDu1j+z2XERD4x1vIU6JXI7xsdQJpg8ovK9uEsCDQZnzpH+C7ZkevhCfsBH1HX494Ub/XqA+t+sEhJ17MzpXQd4Ms5QVcnCEIsgndOYeIHwNIuVs9WPL3AdcnYVU5YKfL9JAeZY+O5vD91FgmzTRK0eGKxt8Qsjtzg3GYItDpApmMtVPl6ouYvC8tuRELnlWnB9ulMRagC62AHs1W+60Y2kEpLiAo2aX+at+1F51EH70qpp6eXqjjPOTk0wutEeDV0IjlURpJVwdjdpM9/NxazHcEHxQchwR95R2dsLxNX2JrqfkpAe2uTlv6SaIj4sKiVswWVm3ArdXdBCuozY89Ps4pNK42n5QZ1BAm+erLlcNpZ0QWx4vF4uqGnphTqyxIkgBgB9CKijwrGP2/viY9JpSoE/0r+K4mOgxeV/y53peggXknqV5fV60WN4/qKk4nEIF+7/LuIle8= X-Forefront-Antispam-Report: CIP:165.204.84.17; CTRY:US; LANG:en; SCL:1; SRV:; IPV:CAL; SFV:NSPM; H:SATLEXMB04.amd.com; PTR:InfoDomainNonexistent; CAT:NONE; SFS:(4636009)(40470700002)(46966006)(36840700001)(7696005)(82310400004)(8676002)(86362001)(40460700001)(2906002)(5660300002)(2616005)(47076005)(8936002)(6916009)(426003)(4326008)(316002)(36756003)(83380400001)(1076003)(26005)(81166007)(70206006)(70586007)(336012)(508600001)(6666004)(16526019)(186003)(356005)(36860700001)(36900700001); DIR:OUT; SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Jan 2022 11:53:25.3746 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 467159f2-711f-4922-1c89-08d9db424cea X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d; Ip=[165.204.84.17]; Helo=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: DM6NAM11FT057.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR12MB1229 X-Spam-Status: No, score=-11.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 19 Jan 2022 11:53:31 -0000 While working on function calls, I realized that the thread_fsm member of struct thread_info is a raw pointer to a resource it owns. This commit changes the type of the thread_fsm member to a std::unique_ptr in order to signify this ownership relationship and slightly ease resource management (no need to manually call delete). The function run_inferior_call takes an argument as a pointer to a call_thread_fsm and installs it in it in a thread_info instance. Also change this function's signature to accept a unique_ptr in order to signify that the ownership of the call_thread_fsm is transferred during the call. No user visible change expected after this commit. Tested on x86_64-linux with no regression observed. Change-Id: Ia1224f72a4afa247801ce6650ce82f90224a9ae8 --- gdb/breakpoint.c | 5 +++-- gdb/gdbthread.h | 3 ++- gdb/infcall.c | 23 ++++++++++------------- gdb/infcmd.c | 9 ++++++--- gdb/infrun.c | 20 +++++++------------- gdb/thread.c | 3 +-- 6 files changed, 29 insertions(+), 34 deletions(-) diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 1812bfe42f9..b2821042303 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -10838,8 +10838,9 @@ until_break_command (const char *arg, int from_tty, int anywhere) breakpoints.emplace_back (std::move (location_breakpoint)); } - tp->thread_fsm = new until_break_fsm (command_interp (), tp->global_num, - std::move (breakpoints)); + gdb_assert (tp->thread_fsm == nullptr); + tp->thread_fsm.reset (new until_break_fsm (command_interp (), tp->global_num, + std::move (breakpoints))); if (lj_deleter) lj_deleter->release (); diff --git a/gdb/gdbthread.h b/gdb/gdbthread.h index 9921dae7a71..735f37300f6 100644 --- a/gdb/gdbthread.h +++ b/gdb/gdbthread.h @@ -34,6 +34,7 @@ struct symtab; #include "gdbsupport/forward-scope-exit.h" #include "displaced-stepping.h" #include "gdbsupport/intrusive_list.h" +#include "thread-fsm.h" struct inferior; struct process_stratum_target; @@ -483,7 +484,7 @@ class thread_info : public refcounted_object, /* Pointer to the state machine manager object that handles what is left to do for the thread's execution command after the target stops. Several execution commands use it. */ - struct thread_fsm *thread_fsm = NULL; + std::unique_ptr thread_fsm = nullptr; /* This is used to remember when a fork or vfork event was caught by a catchpoint, and thus the event is to be followed at the next diff --git a/gdb/infcall.c b/gdb/infcall.c index 05cf18f0a7f..a178051391c 100644 --- a/gdb/infcall.c +++ b/gdb/infcall.c @@ -574,7 +574,7 @@ call_thread_fsm::should_notify_stop () thrown errors. The caller should rethrow if there's an error. */ static struct gdb_exception -run_inferior_call (struct call_thread_fsm *sm, +run_inferior_call (std::unique_ptr sm, struct thread_info *call_thread, CORE_ADDR real_pc) { struct gdb_exception caught_error; @@ -599,7 +599,7 @@ run_inferior_call (struct call_thread_fsm *sm, /* Associate the FSM with the thread after clear_proceed_status (otherwise it'd clear this FSM), and before anything throws, so we don't leak it (and any resources it manages). */ - call_thread->thread_fsm = sm; + call_thread->thread_fsm = std::move (sm); disable_watchpoints_before_interactive_call_start (); @@ -1251,12 +1251,10 @@ call_function_by_hand_dummy (struct value *function, just below is the place to chop this function in two.. */ { - struct thread_fsm *saved_sm; - struct call_thread_fsm *sm; - /* Save the current FSM. We'll override it. */ - saved_sm = call_thread->thread_fsm; - call_thread->thread_fsm = NULL; + std::unique_ptr saved_sm + = std::move (call_thread->thread_fsm); + struct call_thread_fsm *sm; /* Save this thread's ptid, we need it later but the thread may have exited. */ @@ -1274,14 +1272,15 @@ call_function_by_hand_dummy (struct value *function, return_method != return_method_normal, struct_addr); - e = run_inferior_call (sm, call_thread.get (), real_pc); + e = run_inferior_call (std::unique_ptr (sm), + call_thread.get (), real_pc); gdb::observers::inferior_call_post.notify (call_thread_ptid, funaddr); if (call_thread->state != THREAD_EXITED) { /* The FSM should still be the same. */ - gdb_assert (call_thread->thread_fsm == sm); + gdb_assert (call_thread->thread_fsm.get () == sm); if (call_thread->thread_fsm->finished_p ()) { @@ -1300,8 +1299,7 @@ call_function_by_hand_dummy (struct value *function, /* Clean up / destroy the call FSM, and restore the original one. */ call_thread->thread_fsm->clean_up (call_thread.get ()); - delete call_thread->thread_fsm; - call_thread->thread_fsm = saved_sm; + call_thread->thread_fsm = std::move (saved_sm); maybe_remove_breakpoints (); @@ -1316,8 +1314,7 @@ call_function_by_hand_dummy (struct value *function, /* Didn't complete. Clean up / destroy the call FSM, and restore the previous state machine, and handle the error. */ call_thread->thread_fsm->clean_up (call_thread.get ()); - delete call_thread->thread_fsm; - call_thread->thread_fsm = saved_sm; + call_thread->thread_fsm = std::move (saved_sm); } } diff --git a/gdb/infcmd.c b/gdb/infcmd.c index 9f4ed8bff13..af8b6c3eb46 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -848,7 +848,8 @@ step_1 (int skip_subroutines, int single_inst, const char *count_string) steps. */ thr = inferior_thread (); step_sm = new step_command_fsm (command_interp ()); - thr->thread_fsm = step_sm; + gdb_assert (thr->thread_fsm == nullptr); + thr->thread_fsm.reset (step_sm); step_command_fsm_prepare (step_sm, skip_subroutines, single_inst, count, thr); @@ -1355,7 +1356,8 @@ until_next_command (int from_tty) delete_longjmp_breakpoint_cleanup lj_deleter (thread); sm = new until_next_fsm (command_interp (), tp->global_num); - tp->thread_fsm = sm; + gdb_assert (tp->thread_fsm == nullptr); + tp->thread_fsm.reset (sm); lj_deleter.release (); proceed ((CORE_ADDR) -1, GDB_SIGNAL_DEFAULT); @@ -1762,7 +1764,8 @@ finish_command (const char *arg, int from_tty) sm = new finish_command_fsm (command_interp ()); - tp->thread_fsm = sm; + gdb_assert (tp->thread_fsm == nullptr); + tp->thread_fsm.reset (sm); /* Finishing from an inline frame is completely different. We don't try to show the "return value" - no way to locate it. */ diff --git a/gdb/infrun.c b/gdb/infrun.c index 2e7ed15723f..e3bc0706c68 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -698,7 +698,7 @@ follow_fork () int current_line = 0; symtab *current_symtab = NULL; struct frame_id step_frame_id = { 0 }; - struct thread_fsm *thread_fsm = NULL; + std::unique_ptr thread_fsm = nullptr; if (!non_stop) { @@ -755,7 +755,7 @@ follow_fork () step_frame_id = tp->control.step_frame_id; exception_resume_breakpoint = clone_momentary_breakpoint (tp->control.exception_resume_breakpoint); - thread_fsm = tp->thread_fsm; + thread_fsm = std::move (tp->thread_fsm); /* For now, delete the parent's sr breakpoint, otherwise, parent/child sr breakpoints are considered duplicates, @@ -767,7 +767,6 @@ follow_fork () tp->control.step_range_end = 0; tp->control.step_frame_id = null_frame_id; delete_exception_resume_breakpoint (tp); - tp->thread_fsm = NULL; } parent = inferior_ptid; @@ -809,7 +808,8 @@ follow_fork () tp->control.step_frame_id = step_frame_id; tp->control.exception_resume_breakpoint = exception_resume_breakpoint; - tp->thread_fsm = thread_fsm; + gdb_assert (tp->thread_fsm == nullptr); + tp->thread_fsm = std::move (thread_fsm); } else { @@ -2651,8 +2651,7 @@ clear_proceed_status_thread (struct thread_info *tp) if (!signal_pass_state (tp->stop_signal ())) tp->set_stop_signal (GDB_SIGNAL_0); - delete tp->thread_fsm; - tp->thread_fsm = NULL; + tp->thread_fsm.reset (); tp->control.trap_expected = 0; tp->control.step_range_start = 0; @@ -4103,13 +4102,8 @@ fetch_inferior_event () delete_just_stopped_threads_infrun_breakpoints (); - if (thr != NULL) - { - struct thread_fsm *thread_fsm = thr->thread_fsm; - - if (thread_fsm != NULL) - should_stop = thread_fsm->should_stop (thr); - } + if (thr != nullptr && thr->thread_fsm != nullptr) + should_stop = thr->thread_fsm->should_stop (thr); if (!should_stop) { diff --git a/gdb/thread.c b/gdb/thread.c index 611be3f4633..b13a066e7f5 100644 --- a/gdb/thread.c +++ b/gdb/thread.c @@ -163,8 +163,7 @@ thread_cancel_execution_command (struct thread_info *thr) if (thr->thread_fsm != NULL) { thr->thread_fsm->clean_up (thr); - delete thr->thread_fsm; - thr->thread_fsm = NULL; + thr->thread_fsm.reset (); } } base-commit: 8ffb6df2aa60af2fae5378e2520fbf6bdd0b0962 -- 2.25.1