From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mout.gmx.net (mout.gmx.net [212.227.15.15]) by sourceware.org (Postfix) with ESMTPS id 0D697385B832 for ; Mon, 6 Apr 2020 07:27:41 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 0D697385B832 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=gmx.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=n54@gmx.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1586158041; bh=CJcPXGaBfrtlcpvRe+uXHEpEyUZbzNThuKcD0CFHDz0=; h=X-UI-Sender-Class:Subject:To:Cc:References:From:Date:In-Reply-To; b=g/BCKmiO9jJIBltyBNND8wKa+dQZvhl4G4kNcFNLfQDRJ56SKoFJNKn7IJPx/gkKN Fy3uv6QY8ciUz2r7yJ/gJ1dLnVpwOcJaknz2VH61Fx5MdqmQT+MwKQelZIa+x1epyK OM2mfaCxJsy+98ogxVlEBbtRIOYav/T3WlyP7eK8= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from [192.168.0.241] ([89.79.191.25]) by mail.gmx.com (mrgmx004 [212.227.17.184]) with ESMTPSA (Nemesis) id 1Mi2Nv-1iqg2a2Pc9-00e0jm; Mon, 06 Apr 2020 09:27:21 +0200 Subject: Re: [PATCH v5] Implement basic threading support in the NetBSD target To: gdb-patches@sourceware.org Cc: tom@tromey.com, palves@redhat.com, jhb@FreeBSD.org References: <20200401213321.20107-1-n54@gmx.com> <20200402192431.2111-1-n54@gmx.com> From: Kamil Rytarowski Autocrypt: addr=n54@gmx.com; prefer-encrypt=mutual; keydata= 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 4XSbcg== Message-ID: <2418b931-1b43-c184-9494-0018dc6fb3bc@gmx.com> Date: Mon, 6 Apr 2020 09:26:14 +0200 User-Agent: Mozilla/5.0 (X11; NetBSD amd64; rv:68.0) Gecko/20100101 Thunderbird/68.4.1 MIME-Version: 1.0 In-Reply-To: <20200402192431.2111-1-n54@gmx.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:CRKy85XEtpmcb530M9ZosWl6vZ+06SLvkT9pGOf01tz6lFzXbSY 1qKaFOztaFE0VJWSmXCbn5SPGRbrBtPG2pP0TSgvMD+Vn+lp8p+wBZoiaa8REu9kK/asmqD JZKyTha+6c/nDrpW6vXLpjIwP1cmwjB9yXrIz4+rZ1n9/PBRgq4J8v0nsXYwa2SGpFy1PvO KuHiPpGh4xQsBAeZz8W7g== X-UI-Out-Filterresults: notjunk:1;V03:K0:FOAxP3P37WA=:QR8YSzVhD8RIJOZSSx+dhU XLTpxhff6PBAFz8f9NUIj2uQIpoVTv4lJxVZfGiU67vAE/Rs+TGpsZbWc1Jko+1B5+VNkbEUE t2wdhlHRwVhQfeqEipeeCBitdvGLxSJq/UilQwAROSOjEjKIJPHRoe+ou6c0jXz6omwrTI9RK 7l+4r3Fl42Z8BeSA2kMFrXgX3jdzOZjcMbVglEo+a/FRkwI3njVnmrEtrmQ9ieHAsPRehPZRJ jGhG84aruvnBuns6TuFCno5oyMCybWdA5jPK1J2tXsb/lpFAha5IQSmKQE14TZh/8Xbb391rL kOWZ3D5KC6jCilko+6l0G8qOcicvAbpIwbsS4fl636nR9KoeDiCk1ebZFmASBBBxL42hYwaB1 72IBtMeFhTI/z55N+99X+6NWD9XUS3rn50DtJRuAyWbfIXRAID792WKt7xvrr9X5la6UGd53L HZQgFsHQPaDT3TbqOA5R/0JY8DT8t+x4p+KSfSmq1gRJhwY9o2ev5BS7WTxKccWiQGommM0gX r9Yb7uXlo8crq+xMhyjo6zBkmLzp/HL4CmTlz+8856iSmDmquPpUUCZeWyhx4xZ39IuAzqcxh 1ObBNC1huaKDmP9O3Zc5h98UP4NRobx76EGm/JqloT/QSSO66ubDXV3kn5EHAvXingRSNSXnn q5VYKMifGMYeS1l4NTlJFYYuay/SLsfzi4eWUJUC5tzTHyhVV/m2CXNRp5Qh6B4uqu3kAwaKs nreGnFdQ0ZLQEs40pBOjaseW1i3/6pPY/vg4ez4h0gwM+rvi7fUka47lEFH0XaJDHzHg8Tm1+ N7I3LEHlfDY0cXyCUINIGz7wOCR0ELPo7P53kTfAGMWs0JLqOggedUjrmJ37ZjJC7ryQHB9Lw GCkrmHovkngttoFVE87WUKkix1k/nf1DGMNHei89hruxC+Lm68LKc87Hyp+hNqW4dHXRlBtC6 fZ8p5lHghocHzP8uEp1SkqCtKxg1PILLaUTKuD845LZn9Nag9PCHAfEifgoYQrYa0ODya3VDr 4MR0lXX9EH2T56Pt2Bqvc60f1l7OelmzLngR1uE4tCk+4LsLgiZLUcVqAqEZklaC+s+EczOQ7 nCG8+TwI7RDtlZJhz0KSXmhfdFTl5dEQCqjWg7ASz7tAFpuZzWVzNkQMAupiQI8ioxJIcPd+O WVZoGhJtYrx2RU9KHxIYGV64DL2XtZl4/o17dQpacC6F3SvX+pYjisDmSjB34agQljibM= X-Spam-Status: No, score=-28.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) 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: Mon, 06 Apr 2020 07:27:44 -0000 Ping? On 02.04.2020 21:24, Kamil Rytarowski wrote: > Use sysctl(3) as the portable interface to prompt NetBSD threads on > all supported NetBSD versions. In future newer versions could switch > to PT_LWPSTATUS ptrace(2) API that will be supported on NetBSD 10.0 > and newer. > > Implement as part of nbsd_nat_target: > - thread_name() - read descriptive thread name > - thread_alive() - check whether a thread is alive > - post_attach() - updates the list of threads after attach > - update_thread_list() - updates the list of threads > - pid_to_str() - translates ptid to a descriptive string > > There are two local static functions: > - nbsd_thread_lister() - generic LWP lister for a specified pid > - nbsd_add_threads() - utility to update the list of threads > > Now, GDB on NetBSD can attach to a multithreaded process, spawn > a multithreaded process, list threads, print their LWP+PID numbers > and descriptive thread names. > > gdb/ChangeLog: > > * nbsd-nat.h (struct thread_info): Add forward declaration. > (nbsd_nat_target::thread_alive): Add. > (nbsd_nat_target::thread_name): Likewise. > (nbsd_nat_target::update_thread_list): Likewise. > (update_thread_list::post_attach): Likewise. > (post_attach::pid_to_str): Likewise. > * nbsd-nat.c: Include "gdbthread.h" and "inferior.h". > (nbsd_thread_lister): Add. > (nbsd_nat_target::thread_alive): Likewise. > (nbsd_nat_target::thread_name): Likewise. > (nbsd_add_threads): Likewise. > (update_thread_list::post_attach): Likewise. > (nbsd_nat_target::update_thread_list): Likewise. > (post_attach::pid_to_str): Likewise. > --- > gdb/ChangeLog | 17 ++++++ > gdb/nbsd-nat.c | 160 +++++++++++++++++++++++++++++++++++++++++++++++++ > gdb/nbsd-nat.h | 8 +++ > 3 files changed, 185 insertions(+) > > diff --git a/gdb/ChangeLog b/gdb/ChangeLog > index ef62216e0ad..764b65d872d 100644 > --- a/gdb/ChangeLog > +++ b/gdb/ChangeLog > @@ -1,3 +1,20 @@ > +2020-04-01 Kamil Rytarowski > + > + * nbsd-nat.h (struct thread_info): Add forward declaration. > + (nbsd_nat_target::thread_alive): Add. > + (nbsd_nat_target::thread_name): Likewise. > + (nbsd_nat_target::update_thread_list): Likewise. > + (update_thread_list::post_attach): Likewise. > + (post_attach::pid_to_str): Likewise. > + * nbsd-nat.c: Include "gdbthread.h" and "inferior.h". > + (nbsd_thread_lister): Add. > + (nbsd_nat_target::thread_alive): Likewise. > + (nbsd_nat_target::thread_name): Likewise. > + (nbsd_add_threads): Likewise. > + (update_thread_list::post_attach): Likewise. > + (nbsd_nat_target::update_thread_list): Likewise. > + (post_attach::pid_to_str): Likewise. > + > 2020-04-01 Tankut Baris Aktemur > > * infrun.c (stop_all_threads): Update assertion, plus when > diff --git a/gdb/nbsd-nat.c b/gdb/nbsd-nat.c > index 326bbe3aec3..4423e19428d 100644 > --- a/gdb/nbsd-nat.c > +++ b/gdb/nbsd-nat.c > @@ -20,6 +20,8 @@ > #include "defs.h" > > #include "nbsd-nat.h" > +#include "gdbthread.h" > +#include "inferior.h" > > #include > #include > @@ -39,3 +41,161 @@ nbsd_nat_target::pid_to_exec_file (int pid) > return NULL; > return buf; > } > + > +/* Generic thread (LWP) lister within a specified process. The callbac= k > + parameters is a C++ function that is called for each detected thread= . */ > + > +static bool > +nbsd_thread_lister (const pid_t pid, > + gdb::function_view > + callback) > +{ > + int mib[5] =3D {CTL_KERN, KERN_LWP, pid, sizeof (struct kinfo_lwp), 0= }; > + size_t size; > + > + if (sysctl (mib, ARRAY_SIZE (mib), NULL, &size, NULL, 0) =3D=3D -1 ||= size =3D=3D 0) > + perror_with_name (("sysctl")); > + > + mib[4] =3D size / sizeof (size_t); > + > + gdb::unique_xmalloc_ptr kl > + ((struct kinfo_lwp *) xcalloc (size, 1)); > + > + if (sysctl (mib, ARRAY_SIZE (mib), kl.get (), &size, NULL, 0) =3D=3D = -1 > + || size =3D=3D 0) > + perror_with_name (("sysctl")); > + > + for (size_t i =3D 0; i < size / sizeof (struct kinfo_lwp); i++) > + { > + struct kinfo_lwp *l =3D &kl[i]; > + > + /* Return true if the specified thread is alive. */ > + auto lwp_alive > + =3D [] (struct kinfo_lwp *lwp) > + { > + switch (lwp->l_stat) > + { > + case LSSLEEP: > + case LSRUN: > + case LSONPROC: > + case LSSTOP: > + case LSSUSPENDED: > + return true; > + default: > + return false; > + } > + }; > + > + /* Ignore embryonic or demised threads. */ > + if (!lwp_alive (l)) > + continue; > + > + if (callback (l)) > + return true; > + } > + > + return false; > +} > + > +/* Return true if PTID is still active in the inferior. */ > + > +bool > +nbsd_nat_target::thread_alive (ptid_t ptid) > +{ > + pid_t pid =3D ptid.pid (); > + int lwp =3D ptid.lwp (); > + > + auto fn > + =3D [&lwp] (const struct kinfo_lwp *kl) > + { > + return kl->l_lid =3D=3D lwp; > + }; > + > + return nbsd_thread_lister (pid, fn); > +} > + > +/* Return the name assigned to a thread by an application. Returns > + the string in a static buffer. */ > + > +const char * > +nbsd_nat_target::thread_name (struct thread_info *thr) > +{ > + ptid_t ptid =3D thr->ptid; > + pid_t pid =3D ptid.pid (); > + int lwp =3D ptid.lwp (); > + > + static char buf[KI_LNAMELEN] =3D {}; > + > + auto fn > + =3D [&lwp] (const struct kinfo_lwp *kl) > + { > + if (kl->l_lid =3D=3D lwp) > + { > + xsnprintf (buf, sizeof buf, "%s", kl->l_name); > + return true; > + } > + return false; > + }; > + > + if (nbsd_thread_lister (pid, fn)) > + return buf; > + else > + return NULL; > +} > + > +/* Implement the "post_attach" target_ops method. */ > + > +static void > +nbsd_add_threads (nbsd_nat_target *target, pid_t pid) > +{ > + auto fn > + =3D [&target, &pid] (const struct kinfo_lwp *kl) > + { > + ptid_t ptid =3D ptid_t (pid, kl->l_lid, 0); > + if (!in_thread_list (target, ptid)) > + { > + if (inferior_ptid.lwp () =3D=3D 0) > + thread_change_ptid (target, inferior_ptid, ptid); > + else > + add_thread (target, ptid); > + } > + return false; > + }; > + > + nbsd_thread_lister (pid, fn); > +} > + > +/* Implement the "post_attach" target_ops method. */ > + > +void > +nbsd_nat_target::post_attach (int pid) > +{ > + nbsd_add_threads (this, pid); > +} > + > +/* Implement the "update_thread_list" target_ops method. */ > + > +void > +nbsd_nat_target::update_thread_list () > +{ > + prune_threads (); > + > + nbsd_add_threads (this, inferior_ptid.pid ()); > +} > + > +/* Convert PTID to a string. */ > + > +std::string > +nbsd_nat_target::pid_to_str (ptid_t ptid) > +{ > + int lwp =3D ptid.lwp (); > + > + if (lwp !=3D 0) > + { > + pid_t pid =3D ptid.pid (); > + > + return string_printf ("LWP %d of process %d", lwp, pid); > + } > + > + return normal_pid_to_str (ptid); > +} > diff --git a/gdb/nbsd-nat.h b/gdb/nbsd-nat.h > index a752fbe572d..3606048cd07 100644 > --- a/gdb/nbsd-nat.h > +++ b/gdb/nbsd-nat.h > @@ -22,11 +22,19 @@ > > #include "inf-ptrace.h" > > +struct thread_info; > + > /* A prototype NetBSD target. */ > > struct nbsd_nat_target : public inf_ptrace_target > { > char *pid_to_exec_file (int pid) override; > + > + bool thread_alive (ptid_t ptid) override; > + const char *thread_name (struct thread_info *thr) override; > + void post_attach (int pid) override; > + void update_thread_list () override; > + std::string pid_to_str (ptid_t ptid) override; > }; > > #endif /* nbsd-nat.h */ > -- > 2.25.0 >