From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm1-f52.google.com (mail-wm1-f52.google.com [209.85.128.52]) by sourceware.org (Postfix) with ESMTPS id 0E5C4384E200 for ; Mon, 12 Dec 2022 20:31:22 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 0E5C4384E200 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=palves.net Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-wm1-f52.google.com with SMTP id bg10so6613621wmb.1 for ; Mon, 12 Dec 2022 12:31:22 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=4j53u569JzphjHktOphIyNlET32gigJqdT4OFrIrLos=; b=YLbWTEeHOBh0y1aBeIfOlNqRLWhFsfX26aOAQz6UIRJYrg0oEdIrwjWSu9dLVz5Tu9 BnXJ3Oxay6gkToJfRyxy5TLBNrB0q1ySFcln4vnwFASzgRx6vCFDrP8ZpGbDSfOITpeo UWIXPpUPsWBPx3UZwEKLlkb6PpeyVsGX935VknbLTZ8ydwYqi3C59TUoAJCtiNx/cchJ T9Da5g6vu4PzSjRg2y7aRDVkXmFGico73CO2hCNNGOZmvcOb3QufgP5zE9eOSLYsmOC3 TvZVK7M23p08B+HRYLEmGoV7tVBKwVqtt61jsxT7fE7a0V4p1ujng2WoJNXwf5uQ4AHc fx1A== X-Gm-Message-State: ANoB5pml+JOtt1oS3tmxIf7RIhSEsA+tfsds0R0VG5IPJF6Gy/BASIkI vI8IBd6PK85I2iZsZDbVmr80QwMuXbyNAg== X-Google-Smtp-Source: AA0mqf6x1gtTL1XrRwSr+kXFz37UUHZoHrdnGNx8bD4iWWEXa3fo9Hq+9iIuMpVkQ4QfccC6VH1iLQ== X-Received: by 2002:a7b:c417:0:b0:3cc:cc18:b490 with SMTP id k23-20020a7bc417000000b003cccc18b490mr13393805wmi.28.1670877080709; Mon, 12 Dec 2022 12:31:20 -0800 (PST) Received: from localhost ([2001:8a0:f912:6700:afd9:8b6d:223f:6170]) by smtp.gmail.com with ESMTPSA id z13-20020a05600c220d00b003d1e4f3ac8esm10074904wml.33.2022.12.12.12.31.20 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 12 Dec 2022 12:31:20 -0800 (PST) From: Pedro Alves To: gdb-patches@sourceware.org Subject: [PATCH 16/31] Move deleting thread on TARGET_WAITKIND_THREAD_EXITED to core Date: Mon, 12 Dec 2022 20:30:46 +0000 Message-Id: <20221212203101.1034916-17-pedro@palves.net> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20221212203101.1034916-1-pedro@palves.net> References: <20221212203101.1034916-1-pedro@palves.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-10.4 required=5.0 tests=BAYES_00,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM,GIT_PATCH_0,HEADER_FROM_DIFFERENT_DOMAINS,KAM_DMARC_STATUS,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Currently, infrun assumes that when TARGET_WAITKIND_THREAD_EXITED is reported, the corresponding GDB thread has already been removed from the GDB thread list. Later in the series, that will no longer work, as infrun will need to refer to the thread's thread_info when it processes TARGET_WAITKIND_THREAD_EXITED. As preparation, this patch makes deleting the GDB thread responsibility of infrun, instead of the target. Change-Id: I013d87f61ffc9aaca49f0d6ce2a43e3ea69274de --- gdb/infrun.c | 31 ++++++++++++++++++++++++++----- gdb/linux-nat.c | 22 +++++++++++++++------- gdb/netbsd-nat.c | 1 - 3 files changed, 41 insertions(+), 13 deletions(-) diff --git a/gdb/infrun.c b/gdb/infrun.c index c100bc70034..6fdffb31884 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -4238,7 +4238,12 @@ reinstall_readline_callback_handler_cleanup () } /* Clean up the FSMs of threads that are now stopped. In non-stop, - that's just the event thread. In all-stop, that's all threads. */ + that's just the event thread. In all-stop, that's all threads. In + all-stop, threads that had a pending exit no longer have a reason + to be around, as their FSMs/commands are canceled, so we delete + them. This avoids "info threads" listing such threads as if they + were alive (and failing to read their registers), the user being to + select and resume them (and that failing), etc. */ static void clean_up_just_stopped_threads_fsms (struct execution_control_state *ecs) @@ -4256,15 +4261,28 @@ clean_up_just_stopped_threads_fsms (struct execution_control_state *ecs) { scoped_restore_current_thread restore_thread; - for (thread_info *thr : all_non_exited_threads ()) + for (thread_info *thr : all_threads_safe ()) { - if (thr->thread_fsm () == nullptr) + if (thr->state == THREAD_EXITED) continue; + if (thr == ecs->event_thread) continue; - switch_to_thread (thr); - thr->thread_fsm ()->clean_up (thr); + if (thr->thread_fsm () != nullptr) + { + switch_to_thread (thr); + thr->thread_fsm ()->clean_up (thr); + } + + /* As we are cancelling the command/FSM of this thread, + whatever was the reason we needed to report a thread + exited event to the user, that reason is gone. Delete + the thread, so that the user doesn't see it in the thread + list, the next proceed doesn't try to resume it, etc. */ + if (thr->has_pending_waitstatus () + && thr->pending_waitstatus ().kind () == TARGET_WAITKIND_THREAD_EXITED) + delete_thread (thr); } } } @@ -5537,6 +5555,9 @@ handle_inferior_event (struct execution_control_state *ecs) if (ecs->ws.kind () == TARGET_WAITKIND_THREAD_EXITED) { + ecs->event_thread = find_thread_ptid (ecs->target, ecs->ptid); + gdb_assert (ecs->event_thread != nullptr); + delete_thread (ecs->event_thread); prepare_to_wait (ecs); return; } diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index 5fadc82deb0..b576ce60b75 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c @@ -898,10 +898,11 @@ linux_nat_switch_fork (ptid_t new_ptid) registers_changed (); } -/* Handle the exit of a single thread LP. */ +/* Handle the exit of a single thread LP. If DEL_THREAD is true, + delete the thread_info associated to LP, if it exists. */ static void -exit_lwp (struct lwp_info *lp) +exit_lwp (struct lwp_info *lp, bool del_thread = true) { struct thread_info *th = find_thread_ptid (linux_target, lp->ptid); @@ -911,7 +912,8 @@ exit_lwp (struct lwp_info *lp) gdb_printf (_("[%s exited]\n"), target_pid_to_str (lp->ptid).c_str ()); - delete_thread (th); + if (del_thread) + delete_thread (th); } delete_lwp (lp->ptid); @@ -3135,11 +3137,17 @@ filter_exit_event (struct lwp_info *event_child, if (!is_leader (event_child)) { if (report_thread_events) - ourstatus->set_thread_exited (0); + { + ourstatus->set_thread_exited (0); + /* Delete lwp, but not thread_info, infrun will need it to + process the event. */ + exit_lwp (event_child, false); + } else - ourstatus->set_ignore (); - - exit_lwp (event_child); + { + ourstatus->set_ignore (); + exit_lwp (event_child); + } } return ptid; diff --git a/gdb/netbsd-nat.c b/gdb/netbsd-nat.c index bbadd865823..aa16a6cc5bd 100644 --- a/gdb/netbsd-nat.c +++ b/gdb/netbsd-nat.c @@ -629,7 +629,6 @@ nbsd_nat_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus, if (print_thread_events) gdb_printf (_("[%s exited]\n"), target_pid_to_str (wptid).c_str ()); - delete_thread (thr); } /* The GDB core expects that the rest of the threads are running. */ -- 2.36.0