From patchwork Mon Mar 27 16:53:54 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Marchi X-Patchwork-Id: 66966 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 4C3803858C66 for ; Mon, 27 Mar 2023 16:54:32 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4C3803858C66 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1679936072; bh=t8VTzvE6tEQXjuYySLtoKlxL18+LC1ReQp92Xdc3iAc=; h=To:Cc:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=A8eEn9IfpPFQbS0FP17xc26cFOW3yyQW3/KzLZISiqCgKzMFbbPwSVKwtQfGKUKIX asxYpDFP4cK7sUm/E/zdgNNcnmprIcN5fDP4E0Fc85y9opSPMatjx4WB9VLf7QtYQB zwjKRyhlkzp0cmVozM+mxw8OOz5GbWviIoj2STbs= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from simark.ca (simark.ca [158.69.221.121]) by sourceware.org (Postfix) with ESMTPS id 9360B3858C54 for ; Mon, 27 Mar 2023 16:53:56 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 9360B3858C54 Received: from localhost.localdomain (unknown [217.28.27.60]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPSA id 498C01E15D; Mon, 27 Mar 2023 12:53:56 -0400 (EDT) To: gdb-patches@sourceware.org Cc: Simon Marchi Subject: [PATCH 1/2] gdb: make find_thread_ptid an inferior method Date: Mon, 27 Mar 2023 12:53:54 -0400 Message-Id: <20230327165355.89228-2-simon.marchi@efficios.com> X-Mailer: git-send-email 2.40.0 In-Reply-To: <20230327165355.89228-1-simon.marchi@efficios.com> References: <20230327165355.89228-1-simon.marchi@efficios.com> MIME-Version: 1.0 X-Spam-Status: No, score=-1173.3 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_NONE, KAM_DMARC_STATUS, SPF_HELO_PASS, SPF_SOFTFAIL, 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 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-Patchwork-Original-From: Simon Marchi via Gdb-patches From: Simon Marchi Reply-To: Simon Marchi Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" From: Simon Marchi Make find_thread_ptid (the overload that takes an inferior) a method of struct inferior. Change-Id: Ie5b9fa623ff35aa7ddb45e2805254fc8e83c9cd4 --- gdb/ada-tasks.c | 8 ++++---- gdb/aix-thread.c | 6 +++--- gdb/btrace.c | 2 +- gdb/gdbthread.h | 3 --- gdb/inferior.c | 12 ++++++++++++ gdb/inferior.h | 3 +++ gdb/infrun.c | 4 ++-- gdb/linux-thread-db.c | 2 +- gdb/python/py-threadevent.c | 3 +-- gdb/ravenscar-thread.c | 2 +- gdb/sol-thread.c | 4 ++-- gdb/thread.c | 22 ++++------------------ 12 files changed, 34 insertions(+), 37 deletions(-) diff --git a/gdb/ada-tasks.c b/gdb/ada-tasks.c index b14d159df149..f107d4e4c286 100644 --- a/gdb/ada-tasks.c +++ b/gdb/ada-tasks.c @@ -1177,7 +1177,7 @@ print_ada_task_info (struct ui_out *uiout, if (uiout->is_mi_like_p ()) { thread_info *thread = (ada_task_is_alive (task_info) - ? find_thread_ptid (inf, task_info->ptid) + ? inf->find_thread (task_info->ptid) : nullptr); if (thread != NULL) @@ -1393,7 +1393,7 @@ task_command_1 (const char *taskno_str, int from_tty, struct inferior *inf) computed if target_get_ada_task_ptid has not been implemented for our target (yet). Rather than cause an assertion error in that case, it's nicer for the user to just refuse to perform the task switch. */ - thread_info *tp = find_thread_ptid (inf, task_info->ptid); + thread_info *tp = inf->find_thread (task_info->ptid); if (tp == NULL) error (_("Unable to compute thread ID for task %s.\n" "Cannot switch to this task."), @@ -1577,7 +1577,7 @@ task_apply_all_command (const char *cmd, int from_tty) if (!ada_task_is_alive (&task)) continue; - thread_info *tp = find_thread_ptid (inf, task.ptid); + thread_info *tp = inf->find_thread (task.ptid); if (tp == nullptr) warning (_("Unable to compute thread ID for task %s.\n" "Cannot switch to this task."), @@ -1627,7 +1627,7 @@ task_apply_command (const char *tidlist, int from_tty) if (!ada_task_is_alive (&task)) continue; - thread_info *tp = find_thread_ptid (inf, task.ptid); + thread_info *tp = inf->find_thread (task.ptid); if (tp == nullptr) warning (_("Unable to compute thread ID for task %s.\n" "Cannot switch to this task."), diff --git a/gdb/aix-thread.c b/gdb/aix-thread.c index df843d3c4873..f4ccfb2b364d 100644 --- a/gdb/aix-thread.c +++ b/gdb/aix-thread.c @@ -1172,7 +1172,7 @@ aix_thread_target::resume (ptid_t ptid, int step, enum gdb_signal sig) } else { - thread = find_thread_ptid (current_inferior (), ptid); + thread = current_inferior ()->find_thread (ptid); if (!thread) error (_("aix-thread resume: unknown pthread %ld"), ptid.lwp ()); @@ -1566,7 +1566,7 @@ aix_thread_target::fetch_registers (struct regcache *regcache, int regno) beneath ()->fetch_registers (regcache, regno); else { - thread = find_thread_ptid (current_inferior (), regcache->ptid ()); + thread = current_inferior ()->find_thread (regcache->ptid ()); aix_thread_info *priv = get_aix_thread_info (thread); tid = priv->tid; @@ -2032,7 +2032,7 @@ aix_thread_target::store_registers (struct regcache *regcache, int regno) beneath ()->store_registers (regcache, regno); else { - thread = find_thread_ptid (current_inferior (), regcache->ptid ()); + thread = current_inferior ()->find_thread (regcache->ptid ()); aix_thread_info *priv = get_aix_thread_info (thread); tid = priv->tid; diff --git a/gdb/btrace.c b/gdb/btrace.c index 38d3882c1540..dbdcea0a8eaf 100644 --- a/gdb/btrace.c +++ b/gdb/btrace.c @@ -3246,7 +3246,7 @@ maint_btrace_packet_history_cmd (const char *arg, int from_tty) struct btrace_thread_info *btinfo; unsigned int size, begin, end, from, to; - thread_info *tp = find_thread_ptid (current_inferior (), inferior_ptid); + thread_info *tp = current_inferior ()->find_thread (inferior_ptid); if (tp == NULL) error (_("No thread.")); diff --git a/gdb/gdbthread.h b/gdb/gdbthread.h index 848daa94410a..81e4afd24c25 100644 --- a/gdb/gdbthread.h +++ b/gdb/gdbthread.h @@ -672,9 +672,6 @@ extern bool in_thread_list (process_stratum_target *targ, ptid_t ptid); global id, not the system's). */ extern int valid_global_thread_id (int global_id); -/* Find (non-exited) thread PTID of inferior INF. */ -extern thread_info *find_thread_ptid (inferior *inf, ptid_t ptid); - /* Search function to lookup a (non-exited) thread by 'ptid'. */ extern struct thread_info *find_thread_ptid (process_stratum_target *targ, ptid_t ptid); diff --git a/gdb/inferior.c b/gdb/inferior.c index a1e3c79d8a20..6eb9f3ff23b9 100644 --- a/gdb/inferior.c +++ b/gdb/inferior.c @@ -216,6 +216,18 @@ add_inferior (int pid) /* See inferior.h. */ +thread_info * +inferior::find_thread (ptid_t ptid) +{ + auto it = this->ptid_thread_map.find (ptid); + if (it != this->ptid_thread_map.end ()) + return it->second; + else + return nullptr; +} + +/* See inferior.h. */ + void inferior::clear_thread_list (bool silent) { diff --git a/gdb/inferior.h b/gdb/inferior.h index 72034cc4ffbc..633916eb7c1f 100644 --- a/gdb/inferior.h +++ b/gdb/inferior.h @@ -490,6 +490,9 @@ class inferior : public refcounted_object, inline safe_inf_threads_range threads_safe () { return safe_inf_threads_range (this->thread_list.begin ()); } + /* Find (non-exited) thread PTID of this inferior. */ + thread_info *find_thread (ptid_t ptid); + /* Delete all threads in the thread list. If SILENT, exit threads silently. */ void clear_thread_list (bool silent); diff --git a/gdb/infrun.c b/gdb/infrun.c index ee812baf8dac..334080142f15 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -645,7 +645,7 @@ holding the child stopped. Try \"set detach-on-fork\" or \ The former case will have pending_follow cleared, the later will have pending_follow set. */ - thread_info *parent_thread = find_thread_ptid (parent_inf, parent_ptid); + thread_info *parent_thread = parent_inf->find_thread (parent_ptid); gdb_assert (parent_thread != nullptr); parent_thread->pending_follow.set_spurious (); @@ -3730,7 +3730,7 @@ do_target_wait_1 (inferior *inf, ptid_t ptid, ptid.to_string ().c_str ()); /* We have a specific thread to check. */ - tp = find_thread_ptid (inf, ptid); + tp = inf->find_thread (ptid); gdb_assert (tp != nullptr); if (!tp->has_pending_waitstatus ()) tp = nullptr; diff --git a/gdb/linux-thread-db.c b/gdb/linux-thread-db.c index 5f2f167dbce7..ef1c2819229d 100644 --- a/gdb/linux-thread-db.c +++ b/gdb/linux-thread-db.c @@ -1655,7 +1655,7 @@ thread_db_target::update_thread_list () std::string thread_db_target::pid_to_str (ptid_t ptid) { - thread_info *thread_info = find_thread_ptid (current_inferior (), ptid); + thread_info *thread_info = current_inferior ()->find_thread (ptid); if (thread_info != NULL && thread_info->priv != NULL) { diff --git a/gdb/python/py-threadevent.c b/gdb/python/py-threadevent.c index b29f69a3855f..05a833def259 100644 --- a/gdb/python/py-threadevent.c +++ b/gdb/python/py-threadevent.c @@ -28,8 +28,7 @@ py_get_event_thread (ptid_t ptid) if (non_stop) { thread_info *thread - = find_thread_ptid (current_inferior ()->process_target (), - ptid); + = current_inferior ()->find_thread (ptid); if (thread != nullptr) return thread_to_thread_object (thread); PyErr_SetString (PyExc_RuntimeError, "Could not find event thread"); diff --git a/gdb/ravenscar-thread.c b/gdb/ravenscar-thread.c index 22fbdbe9662e..ad357352eca8 100644 --- a/gdb/ravenscar-thread.c +++ b/gdb/ravenscar-thread.c @@ -452,7 +452,7 @@ ravenscar_thread_target::wait (ptid_t ptid, void ravenscar_thread_target::add_thread (struct ada_task_info *task) { - if (find_thread_ptid (current_inferior (), task->ptid) == NULL) + if (current_inferior ()->find_thread (task->ptid) == NULL) { ::add_thread (current_inferior ()->process_target (), task->ptid); m_cpu_map[task->ptid.tid ()] = task->base_cpu; diff --git a/gdb/sol-thread.c b/gdb/sol-thread.c index 8945c2041db8..ed1a803fbdb0 100644 --- a/gdb/sol-thread.c +++ b/gdb/sol-thread.c @@ -451,7 +451,7 @@ sol_thread_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus, /* See if we have a new thread. */ if (rtnval.tid_p ()) { - thread_info *thr = find_thread_ptid (current_inferior (), rtnval); + thread_info *thr = current_inferior ()->find_thread (rtnval); if (thr == NULL || thr->state == THREAD_EXITED) { process_stratum_target *proc_target @@ -1003,7 +1003,7 @@ sol_update_thread_list_callback (const td_thrhandle_t *th, void *ignored) return -1; ptid_t ptid = ptid_t (current_inferior ()->pid, 0, ti.ti_tid); - thread_info *thr = find_thread_ptid (current_inferior (), ptid); + thread_info *thr = current_inferior ()->find_thread (ptid); if (thr == NULL || thr->state == THREAD_EXITED) { process_stratum_target *proc_target diff --git a/gdb/thread.c b/gdb/thread.c index 3d4cba32303d..9bca4784f900 100644 --- a/gdb/thread.c +++ b/gdb/thread.c @@ -221,7 +221,7 @@ set_thread_exited (thread_info *tp, bool silent) clear_thread_inferior_resources (tp); /* Remove from the ptid_t map. We don't want for - find_thread_ptid to find exited threads. Also, the target + inferior::find_thread to find exited threads. Also, the target may reuse the ptid for a new thread, and there can only be one value per key; adding a new thread with the same ptid_t would overwrite the exited thread's ptid entry. */ @@ -275,7 +275,7 @@ add_thread_silent (process_stratum_target *targ, ptid_t ptid) If we do, it must be dead, otherwise we wouldn't be adding a new thread with the same id. The OS is reusing this id --- delete the old thread, and create a new one. */ - thread_info *tp = find_thread_ptid (inf, ptid); + thread_info *tp = inf->find_thread (ptid); if (tp != nullptr) delete_thread (tp); @@ -520,21 +520,7 @@ find_thread_ptid (process_stratum_target *targ, ptid_t ptid) inferior *inf = find_inferior_ptid (targ, ptid); if (inf == NULL) return NULL; - return find_thread_ptid (inf, ptid); -} - -/* See gdbthread.h. */ - -struct thread_info * -find_thread_ptid (inferior *inf, ptid_t ptid) -{ - gdb_assert (inf != nullptr); - - auto it = inf->ptid_thread_map.find (ptid); - if (it != inf->ptid_thread_map.end ()) - return it->second; - else - return nullptr; + return inf->find_thread (ptid); } /* See gdbthread.h. */ @@ -802,7 +788,7 @@ thread_change_ptid (process_stratum_target *targ, inf = find_inferior_ptid (targ, old_ptid); inf->pid = new_ptid.pid (); - tp = find_thread_ptid (inf, old_ptid); + tp = inf->find_thread (old_ptid); gdb_assert (tp != nullptr); int num_erased = inf->ptid_thread_map.erase (old_ptid); From patchwork Mon Mar 27 16:53:55 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Marchi X-Patchwork-Id: 66967 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 8287E385B50B for ; Mon, 27 Mar 2023 16:54:34 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 8287E385B50B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1679936074; bh=dZfyngWDZFjBdrpLaO9aI5C9xmUUxZhXCoPLdzVVKdU=; h=To:Cc:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=iVyoASCeYmUZVAzs0R9b46j+d9B9SMXxby7MGNAQrDhH3db1w7+AWsxHoJqCj0tQg 6oVaeDoo9SQWEZHp+BW6o2l4KykdCJ+58KKJbrZsvxbWwYHaCw4RhkoCFK1uS7pwxy c4CSbkH4ps9juWogBS3yrIDMK7hdmUNzaGW+OhLc= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from simark.ca (simark.ca [158.69.221.121]) by sourceware.org (Postfix) with ESMTPS id D2AEA3858C5E for ; Mon, 27 Mar 2023 16:53:56 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org D2AEA3858C5E Received: from localhost.localdomain (unknown [217.28.27.60]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPSA id 77ABB1E4A3; Mon, 27 Mar 2023 12:53:56 -0400 (EDT) To: gdb-patches@sourceware.org Cc: Simon Marchi Subject: [PATCH 2/2] gdb: make find_thread_ptid a process_stratum_target method Date: Mon, 27 Mar 2023 12:53:55 -0400 Message-Id: <20230327165355.89228-3-simon.marchi@efficios.com> X-Mailer: git-send-email 2.40.0 In-Reply-To: <20230327165355.89228-1-simon.marchi@efficios.com> References: <20230327165355.89228-1-simon.marchi@efficios.com> MIME-Version: 1.0 X-Spam-Status: No, score=-1171.8 required=5.0 tests=BAYES_00, DIET_1, GIT_PATCH_0, KAM_DMARC_NONE, KAM_DMARC_STATUS, SPF_HELO_PASS, SPF_SOFTFAIL, 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 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-Patchwork-Original-From: Simon Marchi via Gdb-patches From: Simon Marchi Reply-To: Simon Marchi Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" From: Simon Marchi Make find_thread_ptid (the overload that takes a process_stratum_target) a method of process_stratum_target. Change-Id: Ib190a925a83c6b93e9c585dc7c6ab65efbdd8629 --- gdb/aarch64-tdep.c | 4 +--- gdb/aix-thread.c | 2 +- gdb/amd-dbgapi-target.c | 4 ++-- gdb/bsd-uthread.c | 4 ++-- gdb/darwin-nat.c | 2 +- gdb/fbsd-nat.c | 2 +- gdb/gdbthread.h | 4 ---- gdb/gnu-nat.c | 3 +-- gdb/infcmd.c | 2 +- gdb/infrun.c | 12 ++++++------ gdb/linux-fork.c | 2 +- gdb/linux-nat.c | 14 +++++++------- gdb/linux-thread-db.c | 12 ++++++------ gdb/mi/mi-interp.c | 2 +- gdb/netbsd-nat.c | 2 +- gdb/nto-procfs.c | 6 +++--- gdb/process-stratum-target.c | 11 +++++++++++ gdb/process-stratum-target.h | 3 +++ gdb/procfs.c | 6 +++--- gdb/ravenscar-thread.c | 6 +++--- gdb/record-btrace.c | 4 ++-- gdb/remote.c | 18 +++++++++--------- gdb/thread-iter.c | 2 +- gdb/thread.c | 15 ++------------- gdb/windows-nat.c | 4 ++-- 25 files changed, 71 insertions(+), 75 deletions(-) diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c index d11d8320799c..a1daa9a17884 100644 --- a/gdb/aarch64-tdep.c +++ b/gdb/aarch64-tdep.c @@ -3576,9 +3576,7 @@ aarch64_remove_non_address_bits (struct gdbarch *gdbarch, CORE_ADDR pointer) { /* If we do have an inferior, attempt to fetch its thread's thread_info struct. */ - thread_info *thread - = find_thread_ptid (current_inferior ()->process_target (), - inferior_ptid); + thread_info *thread = current_inferior ()->find_thread (inferior_ptid); /* If the thread is running, we will not be able to fetch the mask registers. */ diff --git a/gdb/aix-thread.c b/gdb/aix-thread.c index f4ccfb2b364d..c587027fb6dc 100644 --- a/gdb/aix-thread.c +++ b/gdb/aix-thread.c @@ -941,7 +941,7 @@ sync_threadlists (pid_t pid) if (gptid.is_pid ()) { - tp = find_thread_ptid (proc_target, gptid); + tp = proc_target->find_thread (gptid); thread_change_ptid (proc_target, gptid, pptid); aix_thread_info *priv = new aix_thread_info; priv->pdtid = pbuf[pi].pdtid; diff --git a/gdb/amd-dbgapi-target.c b/gdb/amd-dbgapi-target.c index f5161038c51d..f1ef37d17967 100644 --- a/gdb/amd-dbgapi-target.c +++ b/gdb/amd-dbgapi-target.c @@ -718,7 +718,7 @@ amd_dbgapi_target::stop (ptid_t ptid) { /* No need to iterate all non-exited threads if the request is to stop a specific thread. */ - stop_one_thread (find_thread_ptid (proc_target, ptid)); + stop_one_thread (proc_target->find_thread (ptid)); return; } @@ -998,7 +998,7 @@ process_one_event (amd_dbgapi_event_id_t event_id, else ws.set_stopped (GDB_SIGNAL_0); - thread_info *thread = find_thread_ptid (proc_target, event_ptid); + thread_info *thread = proc_target->find_thread (event_ptid); if (thread == nullptr) { /* Silently create new GPU threads to avoid spamming the diff --git a/gdb/bsd-uthread.c b/gdb/bsd-uthread.c index 8b08de8075f4..d0094bdc2ca1 100644 --- a/gdb/bsd-uthread.c +++ b/gdb/bsd-uthread.c @@ -415,7 +415,7 @@ bsd_uthread_target::wait (ptid_t ptid, struct target_waitstatus *status, thread_change_ptid (beneath, inferior_ptid, ptid); /* Don't let the core see a ptid without a corresponding thread. */ - thread_info *thread = find_thread_ptid (beneath, ptid); + thread_info *thread = beneath->find_thread (ptid); if (thread == NULL || thread->state == THREAD_EXITED) add_thread (beneath, ptid); @@ -466,7 +466,7 @@ bsd_uthread_target::update_thread_list () process_stratum_target *proc_target = as_process_stratum_target (this->beneath ()); - thread_info *thread = find_thread_ptid (proc_target, ptid); + thread_info *thread = proc_target->find_thread (ptid); if (thread == nullptr || thread->state == THREAD_EXITED) { /* If INFERIOR_PTID doesn't have a tid member yet, then ptid diff --git a/gdb/darwin-nat.c b/gdb/darwin-nat.c index e864c35620ea..4cf2d9f387a1 100644 --- a/gdb/darwin-nat.c +++ b/gdb/darwin-nat.c @@ -360,7 +360,7 @@ darwin_nat_target::check_new_threads (inferior *inf) { /* A thread was removed. */ struct thread_info *thr - = find_thread_ptid (this, ptid_t (inf->pid, 0, old_id)); + = this->find_thread (ptid_t (inf->pid, 0, old_id)); delete_thread (thr); kret = mach_port_deallocate (gdb_task, old_id); MACH_CHECK_ERROR (kret); diff --git a/gdb/fbsd-nat.c b/gdb/fbsd-nat.c index 27d2fe450929..b2e8043e4b4d 100644 --- a/gdb/fbsd-nat.c +++ b/gdb/fbsd-nat.c @@ -1295,7 +1295,7 @@ fbsd_nat_target::wait_1 (ptid_t ptid, struct target_waitstatus *ourstatus, threads might be skipped during post_attach that have not yet reported their PL_FLAG_EXITED event. Ignore EXITED events for an unknown LWP. */ - thread_info *thr = find_thread_ptid (this, wptid); + thread_info *thr = this->find_thread (wptid); if (thr != nullptr) { fbsd_lwp_debug_printf ("deleting thread for LWP %u", diff --git a/gdb/gdbthread.h b/gdb/gdbthread.h index 81e4afd24c25..65aab9d12c32 100644 --- a/gdb/gdbthread.h +++ b/gdb/gdbthread.h @@ -672,10 +672,6 @@ extern bool in_thread_list (process_stratum_target *targ, ptid_t ptid); global id, not the system's). */ extern int valid_global_thread_id (int global_id); -/* Search function to lookup a (non-exited) thread by 'ptid'. */ -extern struct thread_info *find_thread_ptid (process_stratum_target *targ, - ptid_t ptid); - /* Find thread by GDB global thread ID. */ struct thread_info *find_thread_global_id (int global_id); diff --git a/gdb/gnu-nat.c b/gdb/gnu-nat.c index afaec46e3c15..138905395813 100644 --- a/gdb/gnu-nat.c +++ b/gdb/gnu-nat.c @@ -2186,8 +2186,7 @@ gnu_nat_target::attach (const char *args, int from_tty) inf_update_procs (inf); - thread_info *thr - = find_thread_ptid (this, ptid_t (pid, inf_pick_first_thread ())); + thread_info *thr = this->find_thread (ptid_t (pid, inf_pick_first_thread ())); switch_to_thread (thr); /* We have to initialize the terminal settings now, since the code diff --git a/gdb/infcmd.c b/gdb/infcmd.c index e2032d185646..4ed7d9d2c8ff 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -710,7 +710,7 @@ continue_command (const char *args, int from_tty) ptid_t last_ptid; get_last_target_status (&last_target, &last_ptid, nullptr); - tp = find_thread_ptid (last_target, last_ptid); + tp = last_target->find_thread (last_ptid); } if (tp != nullptr) bs = tp->control.stop_bpstat; diff --git a/gdb/infrun.c b/gdb/infrun.c index 334080142f15..a03576e5f2d3 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -875,7 +875,7 @@ follow_fork () /* If we followed the child, switch to it... */ if (follow_child) { - tp = find_thread_ptid (parent_targ, child); + tp = parent_targ->find_thread (child); switch_to_thread (tp); /* ... and preserve the stepping state, in case the @@ -5085,7 +5085,7 @@ handle_one (const wait_one_event &event) } else { - t = find_thread_ptid (event.target, event.ptid); + t = event.target->find_thread (event.ptid); /* Check if this is the first time we see this thread. Don't bother adding if it individually exited. */ if (t == nullptr @@ -5106,7 +5106,7 @@ handle_one (const wait_one_event &event) } else { - thread_info *t = find_thread_ptid (event.target, event.ptid); + thread_info *t = event.target->find_thread (event.ptid); if (t == nullptr) t = add_thread (event.target, event.ptid); @@ -5507,7 +5507,7 @@ handle_inferior_event (struct execution_control_state *ecs) if (ecs->ws.kind () != TARGET_WAITKIND_EXITED && ecs->ws.kind () != TARGET_WAITKIND_SIGNALLED) { - ecs->event_thread = find_thread_ptid (ecs->target, ecs->ptid); + ecs->event_thread = ecs->target->find_thread (ecs->ptid); /* If it's a new thread, add it to the thread database. */ if (ecs->event_thread == nullptr) ecs->event_thread = add_thread (ecs->target, ecs->ptid); @@ -5656,7 +5656,7 @@ handle_inferior_event (struct execution_control_state *ecs) need to have access to the just-exited thread. That is the case of GNU/Linux's "checkpoint" support, for example. Call the switch_to_xxx routine as appropriate. */ - thread_info *thr = find_thread_ptid (ecs->target, ecs->ptid); + thread_info *thr = ecs->target->find_thread (ecs->ptid); if (thr != nullptr) switch_to_thread (thr); else @@ -5843,7 +5843,7 @@ handle_inferior_event (struct execution_control_state *ecs) /* Note that one of these may be an invalid pointer, depending on detach_fork. */ thread_info *parent = ecs->event_thread; - thread_info *child = find_thread_ptid (targ, ecs->ws.child_ptid ()); + thread_info *child = targ->find_thread (ecs->ws.child_ptid ()); /* At this point, the parent is marked running, and the child is marked stopped. */ diff --git a/gdb/linux-fork.c b/gdb/linux-fork.c index a6e74c0cb529..52e385411c7e 100644 --- a/gdb/linux-fork.c +++ b/gdb/linux-fork.c @@ -529,7 +529,7 @@ Please switch to another checkpoint before deleting the current one")); list, waitpid the ptid. If fi->parent_ptid is a part of lwp and it is stopped, waitpid the ptid. */ - thread_info *parent = find_thread_ptid (linux_target, pptid); + thread_info *parent = linux_target->find_thread (pptid); if ((parent == NULL && find_fork_ptid (pptid)) || (parent != NULL && parent->state == THREAD_STOPPED)) { diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index fd537d7a1d36..029dbef37238 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c @@ -890,7 +890,7 @@ linux_nat_switch_fork (ptid_t new_ptid) static void exit_lwp (struct lwp_info *lp) { - struct thread_info *th = find_thread_ptid (linux_target, lp->ptid); + struct thread_info *th = linux_target->find_thread (lp->ptid); if (th) { @@ -1219,7 +1219,7 @@ get_detach_signal (struct lwp_info *lp) signo = gdb_signal_from_host (WSTOPSIG (lp->status)); else { - struct thread_info *tp = find_thread_ptid (linux_target, lp->ptid); + thread_info *tp = linux_target->find_thread (lp->ptid); if (target_is_non_stop_p () && !tp->executing ()) { @@ -1312,7 +1312,7 @@ detach_one_lwp (struct lwp_info *lp, int *signo_p) /* Check in thread_info::pending_waitstatus. */ - thread_info *tp = find_thread_ptid (linux_target, lp->ptid); + thread_info *tp = linux_target->find_thread (lp->ptid); if (tp->has_pending_waitstatus ()) { const target_waitstatus &ws = tp->pending_waitstatus (); @@ -1566,7 +1566,7 @@ linux_nat_resume_callback (struct lwp_info *lp, struct lwp_info *except) { struct thread_info *thread; - thread = find_thread_ptid (linux_target, lp->ptid); + thread = linux_target->find_thread (lp->ptid); if (thread != NULL) { signo = thread->stop_signal (); @@ -1704,7 +1704,7 @@ linux_handle_syscall_trap (struct lwp_info *lp, int stopping) { struct target_waitstatus *ourstatus = &lp->waitstatus; struct gdbarch *gdbarch = target_thread_architecture (lp->ptid); - thread_info *thread = find_thread_ptid (linux_target, lp->ptid); + thread_info *thread = linux_target->find_thread (lp->ptid); int syscall_number = (int) gdbarch_get_syscall_number (gdbarch, thread); if (stopping) @@ -2983,7 +2983,7 @@ linux_nat_filter_event (int lwpid, int status) if (!lp->step && WSTOPSIG (status) && sigismember (&pass_mask, WSTOPSIG (status)) && (WSTOPSIG (status) != SIGSTOP - || !find_thread_ptid (linux_target, lp->ptid)->stop_requested) + || !linux_target->find_thread (lp->ptid)->stop_requested) && !linux_wstatus_maybe_breakpoint (status)) { linux_resume_one_lwp (lp, lp->step, signo); @@ -4265,7 +4265,7 @@ linux_nat_stop_lwp (struct lwp_info *lwp) if (debug_linux_nat) { - if (find_thread_ptid (linux_target, lwp->ptid)->stop_requested) + if (linux_target->find_thread (lwp->ptid)->stop_requested) linux_nat_debug_printf ("already stopped/stop_requested %s", lwp->ptid.to_string ().c_str ()); else diff --git a/gdb/linux-thread-db.c b/gdb/linux-thread-db.c index ef1c2819229d..0e190f942668 100644 --- a/gdb/linux-thread-db.c +++ b/gdb/linux-thread-db.c @@ -422,7 +422,7 @@ thread_from_lwp (thread_info *stopped, ptid_t ptid) thread_db_err_str (err)); /* Fill the cache. */ - tp = find_thread_ptid (stopped->inf->process_target (), ptid); + tp = stopped->inf->process_target ()->find_thread (ptid); return record_thread (info, tp, ptid, &th, &ti); } @@ -439,7 +439,7 @@ thread_db_notice_clone (ptid_t parent, ptid_t child) if (info == NULL) return 0; - thread_info *stopped = find_thread_ptid (linux_target, parent); + thread_info *stopped = linux_target->find_thread (parent); thread_from_lwp (stopped, child); @@ -685,7 +685,7 @@ check_thread_db_callback (const td_thrhandle_t *th, void *arg) to how GDB accesses TLS could result in this passing without exercising the calls it's supposed to. */ ptid_t ptid = ptid_t (tdb_testinfo->info->pid, ti.ti_lid); - thread_info *thread_info = find_thread_ptid (linux_target, ptid); + thread_info *thread_info = linux_target->find_thread (ptid); if (thread_info != NULL && thread_info->priv != NULL) { LOG ("; errno"); @@ -1417,7 +1417,7 @@ thread_db_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus, return ptid; /* Fill in the thread's user-level thread id and status. */ - thread_from_lwp (find_thread_ptid (beneath, ptid), ptid); + thread_from_lwp (beneath->find_thread (ptid), ptid); return ptid; } @@ -1511,7 +1511,7 @@ find_new_threads_callback (const td_thrhandle_t *th_p, void *data) } ptid_t ptid (info->pid, ti.ti_lid); - tp = find_thread_ptid (info->process_target, ptid); + tp = info->process_target->find_thread (ptid); if (tp == NULL || tp->priv == NULL) record_thread (info, tp, ptid, th_p, &ti); @@ -1751,7 +1751,7 @@ thread_db_target::get_thread_local_address (ptid_t ptid, process_stratum_target *beneath = as_process_stratum_target (this->beneath ()); /* Find the matching thread. */ - thread_info = find_thread_ptid (beneath, ptid); + thread_info = beneath->find_thread (ptid); /* We may not have discovered the thread yet. */ if (thread_info != NULL && thread_info->priv == NULL) diff --git a/gdb/mi/mi-interp.c b/gdb/mi/mi-interp.c index e1244f3df438..4f0bbd40f9d7 100644 --- a/gdb/mi/mi-interp.c +++ b/gdb/mi/mi-interp.c @@ -1015,7 +1015,7 @@ mi_on_resume (ptid_t ptid) if (ptid == minus_one_ptid || ptid.is_pid ()) tp = inferior_thread (); else - tp = find_thread_ptid (target, ptid); + tp = target->find_thread (ptid); /* Suppress output while calling an inferior function. */ if (tp->control.in_infcall) diff --git a/gdb/netbsd-nat.c b/gdb/netbsd-nat.c index 64f74c9405c9..86df0c8fe6a0 100644 --- a/gdb/netbsd-nat.c +++ b/gdb/netbsd-nat.c @@ -618,7 +618,7 @@ nbsd_nat_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus, threads might be skipped during post_attach that have not yet reported their PTRACE_LWP_EXIT event. Ignore exited events for an unknown LWP. */ - thread_info *thr = find_thread_ptid (this, wptid); + thread_info *thr = this->find_thread (wptid); if (thr == nullptr) ourstatus->set_spurious (); else diff --git a/gdb/nto-procfs.c b/gdb/nto-procfs.c index 8e40efa31fcf..61c18fdc8254 100644 --- a/gdb/nto-procfs.c +++ b/gdb/nto-procfs.c @@ -409,7 +409,7 @@ nto_procfs_target::update_thread_list () (e.g. thread exited). */ continue; ptid = ptid_t (pid, 0, tid); - new_thread = find_thread_ptid (this, ptid); + new_thread = this->find_thread (ptid); if (!new_thread) new_thread = add_thread (ptid); update_thread_private_data (new_thread, tid, status.state, 0); @@ -713,7 +713,7 @@ nto_procfs_target::attach (const char *args, int from_tty) update_thread_list (); - switch_to_thread (find_thread_ptid (this, ptid)); + switch_to_thread (this->find_thread (ptid)); } void @@ -1282,7 +1282,7 @@ nto_procfs_target::create_inferior (const char *exec_file, ptid_t ptid = do_attach (ptid_t (pid)); update_thread_list (); - switch_to_thread (find_thread_ptid (this, ptid)); + switch_to_thread (this->find_thread (ptid)); inf = current_inferior (); inferior_appeared (inf, pid); diff --git a/gdb/process-stratum-target.c b/gdb/process-stratum-target.c index e1d41c86b9c3..5c031203e89e 100644 --- a/gdb/process-stratum-target.c +++ b/gdb/process-stratum-target.c @@ -199,6 +199,17 @@ process_stratum_target::random_resumed_with_pending_wait_status /* See process-stratum-target.h. */ +thread_info * +process_stratum_target::find_thread (ptid_t ptid) +{ + inferior *inf = find_inferior_ptid (this, ptid); + if (inf == NULL) + return NULL; + return inf->find_thread (ptid); +} + +/* See process-stratum-target.h. */ + std::set all_non_exited_process_targets () { diff --git a/gdb/process-stratum-target.h b/gdb/process-stratum-target.h index dcbca5a9c6ad..35cfd9c1cca6 100644 --- a/gdb/process-stratum-target.h +++ b/gdb/process-stratum-target.h @@ -108,6 +108,9 @@ class process_stratum_target : public target_ops thread_info *random_resumed_with_pending_wait_status (inferior *inf, ptid_t filter_ptid); + /* Search function to lookup a (non-exited) thread by 'ptid'. */ + thread_info *find_thread (ptid_t ptid); + /* The connection number. Visible in "info connections". */ int connection_number = 0; diff --git a/gdb/procfs.c b/gdb/procfs.c index 741e62a24026..7990640963b7 100644 --- a/gdb/procfs.c +++ b/gdb/procfs.c @@ -2118,7 +2118,7 @@ procfs_target::wait (ptid_t ptid, struct target_waitstatus *status, if (print_thread_events) gdb_printf (_("[%s exited]\n"), target_pid_to_str (retval).c_str ()); - delete_thread (find_thread_ptid (this, retval)); + delete_thread (this->find_thread (retval)); target_continue_no_signal (ptid); goto wait_again; } @@ -2225,7 +2225,7 @@ procfs_target::wait (ptid_t ptid, struct target_waitstatus *status, if (print_thread_events) gdb_printf (_("[%s exited]\n"), target_pid_to_str (retval).c_str ()); - delete_thread (find_thread_ptid (this, retval)); + delete_thread (this->find_thread (retval)); status->set_spurious (); return retval; } @@ -2854,7 +2854,7 @@ procfs_notice_thread (procinfo *pi, procinfo *thread, void *ptr) { ptid_t gdb_threadid = ptid_t (pi->pid, thread->tid, 0); - thread_info *thr = find_thread_ptid (&the_procfs_target, gdb_threadid); + thread_info *thr = the_procfs_target.find_thread (gdb_threadid); if (thr == NULL || thr->state == THREAD_EXITED) add_thread (&the_procfs_target, gdb_threadid); diff --git a/gdb/ravenscar-thread.c b/gdb/ravenscar-thread.c index ad357352eca8..520161338895 100644 --- a/gdb/ravenscar-thread.c +++ b/gdb/ravenscar-thread.c @@ -127,7 +127,7 @@ struct ravenscar_thread_target final : public target_ops process_stratum_target *proc_target = as_process_stratum_target (this->beneath ()); ptid_t underlying = get_base_thread_from_ravenscar_task (tp->ptid); - tp = find_thread_ptid (proc_target, underlying); + tp = proc_target->find_thread (underlying); return beneath ()->enable_btrace (tp, conf); } @@ -161,7 +161,7 @@ struct ravenscar_thread_target final : public target_ops process_stratum_target *proc_target = as_process_stratum_target (this->beneath ()); ptid_t underlying = get_base_thread_from_ravenscar_task (ptid); - switch_to_thread (find_thread_ptid (proc_target, underlying)); + switch_to_thread (proc_target->find_thread (underlying)); } /* Some targets use lazy FPU initialization. On these, the FP @@ -312,7 +312,7 @@ ravenscar_thread_target::add_active_thread () /* The running thread may not have been added to system.tasking.debug's list yet; so ravenscar_update_thread_list may not always add it to the thread list. Add it here. */ - thread_info *active_thr = find_thread_ptid (proc_target, active_ptid); + thread_info *active_thr = proc_target->find_thread (active_ptid); if (active_thr == nullptr) { active_thr = ::add_thread (proc_target, active_ptid); diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c index 2d88e4d20bf6..25ae66311520 100644 --- a/gdb/record-btrace.c +++ b/gdb/record-btrace.c @@ -1396,7 +1396,7 @@ enum record_method record_btrace_target::record_method (ptid_t ptid) { process_stratum_target *proc_target = current_inferior ()->process_target (); - thread_info *const tp = find_thread_ptid (proc_target, ptid); + thread_info *const tp = proc_target->find_thread (ptid); if (tp == NULL) error (_("No thread.")); @@ -1548,7 +1548,7 @@ record_btrace_target::fetch_registers (struct regcache *regcache, int regno) /* Thread-db may ask for a thread's registers before GDB knows about the thread. We forward the request to the target beneath in this case. */ - thread_info *tp = find_thread_ptid (regcache->target (), regcache->ptid ()); + thread_info *tp = regcache->target ()->find_thread (regcache->ptid ()); if (tp != nullptr) replay = tp->btrace.replay; diff --git a/gdb/remote.c b/gdb/remote.c index 526df313ea73..73deea3690b3 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -2783,7 +2783,7 @@ remote_target::remote_notice_new_inferior (ptid_t currthread, bool executing) /* If this is a new thread, add it to GDB's thread list. If we leave it up to WFI to do this, bad things will happen. */ - thread_info *tp = find_thread_ptid (this, currthread); + thread_info *tp = this->find_thread (currthread); if (tp != NULL && tp->state == THREAD_EXITED) { /* We're seeing an event on a thread id we knew had exited. @@ -2875,7 +2875,7 @@ get_remote_thread_info (thread_info *thread) static remote_thread_info * get_remote_thread_info (remote_target *target, ptid_t ptid) { - thread_info *thr = find_thread_ptid (target, ptid); + thread_info *thr = target->find_thread (ptid); return get_remote_thread_info (thr); } @@ -4175,7 +4175,7 @@ remote_target::update_thread_list () remote_notice_new_inferior (item.ptid, executing); - thread_info *tp = find_thread_ptid (this, item.ptid); + thread_info *tp = this->find_thread (item.ptid); remote_thread_info *info = get_remote_thread_info (tp); info->core = item.core; info->extra = std::move (item.extra); @@ -4771,7 +4771,7 @@ remote_target::process_initial_stop_replies (int from_tty) if (ignore_event) continue; - thread_info *evthread = find_thread_ptid (this, event_ptid); + thread_info *evthread = this->find_thread (event_ptid); if (ws.kind () == TARGET_WAITKIND_STOPPED) { @@ -5123,7 +5123,7 @@ remote_target::start_remote_1 (int from_tty, int extended_p) } } else - switch_to_thread (find_thread_ptid (this, curr_thread)); + switch_to_thread (this->find_thread (curr_thread)); } /* init_wait_for_inferior should be called before get_offsets in order @@ -6192,7 +6192,7 @@ remote_target::remote_detach_1 (inferior *inf, int from_tty) remote_detach_pid (reply->ws.child_ptid ().pid ()); } - thread_info *tp = find_thread_ptid (this, inferior_ptid); + thread_info *tp = this->find_thread (inferior_ptid); /* Check to see if we are detaching a fork parent. Note that if we are detaching a fork child, tp == NULL. */ @@ -6502,10 +6502,10 @@ remote_target::append_resumption (char *p, char *endp, { /* If we don't know about the target thread's tid, then we're resuming magic_null_ptid (see caller). */ - tp = find_thread_ptid (this, magic_null_ptid); + tp = this->find_thread (magic_null_ptid); } else - tp = find_thread_ptid (this, ptid); + tp = this->find_thread (ptid); gdb_assert (tp != NULL); if (tp->control.may_range_step) @@ -13964,7 +13964,7 @@ remote_target::set_disconnected_tracing (int val) int remote_target::core_of_thread (ptid_t ptid) { - thread_info *info = find_thread_ptid (this, ptid); + thread_info *info = this->find_thread (ptid); if (info != NULL && info->priv != NULL) return get_remote_thread_info (info)->core; diff --git a/gdb/thread-iter.c b/gdb/thread-iter.c index 9fc8c8a1b136..f61ce7fb33ce 100644 --- a/gdb/thread-iter.c +++ b/gdb/thread-iter.c @@ -122,7 +122,7 @@ all_matching_threads_iterator::all_matching_threads_iterator /* Iterate on a single thread. */ m_mode = mode::SINGLE_THREAD; - m_thr = find_thread_ptid (filter_target, filter_ptid); + m_thr = filter_target->find_thread (filter_ptid); } } } diff --git a/gdb/thread.c b/gdb/thread.c index 9bca4784f900..3425dbcac135 100644 --- a/gdb/thread.c +++ b/gdb/thread.c @@ -514,17 +514,6 @@ find_thread_id (struct inferior *inf, int thr_num) /* See gdbthread.h. */ -struct thread_info * -find_thread_ptid (process_stratum_target *targ, ptid_t ptid) -{ - inferior *inf = find_inferior_ptid (targ, ptid); - if (inf == NULL) - return NULL; - return inf->find_thread (ptid); -} - -/* See gdbthread.h. */ - struct thread_info * find_thread_by_handle (gdb::array_view handle, struct inferior *inf) @@ -598,7 +587,7 @@ valid_global_thread_id (int global_id) bool in_thread_list (process_stratum_target *targ, ptid_t ptid) { - return find_thread_ptid (targ, ptid) != nullptr; + return targ->find_thread (ptid) != nullptr; } /* Finds the first thread of the inferior. */ @@ -1336,7 +1325,7 @@ switch_to_thread (thread_info *thr) void switch_to_thread (process_stratum_target *proc_target, ptid_t ptid) { - thread_info *thr = find_thread_ptid (proc_target, ptid); + thread_info *thr = proc_target->find_thread (ptid); switch_to_thread (thr); } diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c index 26ad04b27be3..c09e459a8019 100644 --- a/gdb/windows-nat.c +++ b/gdb/windows-nat.c @@ -626,7 +626,7 @@ windows_nat_target::delete_thread (ptid_t ptid, DWORD exit_code, target_pid_to_str (ptid).c_str (), (unsigned) exit_code); - ::delete_thread (find_thread_ptid (this, ptid)); + ::delete_thread (this->find_thread (ptid)); auto iter = std::find_if (windows_process.thread_list.begin (), windows_process.thread_list.end (), @@ -1944,7 +1944,7 @@ windows_nat_target::do_initial_windows_stuff (DWORD pid, bool attaching) this->resume (minus_one_ptid, 0, GDB_SIGNAL_0); } - switch_to_thread (find_thread_ptid (this, last_ptid)); + switch_to_thread (this->find_thread (last_ptid)); /* Now that the inferior has been started and all DLLs have been mapped, we can iterate over all DLLs and load them in.