From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca (simark.ca [158.69.221.121]) by sourceware.org (Postfix) with ESMTPS id 7648E393C862 for ; Mon, 7 Sep 2020 18:59:46 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 7648E393C862 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=simark.ca Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=simark@simark.ca Received: from [10.0.0.11] (173-246-6-90.qc.cable.ebox.net [173.246.6.90]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by simark.ca (Postfix) with ESMTPSA id 1F37E1E554; Mon, 7 Sep 2020 14:59:46 -0400 (EDT) Subject: Re: [PATCH v2 05/10] Add gdb/nat common functions for listing threads To: Kamil Rytarowski , gdb-patches@sourceware.org Cc: tom@tromey.com References: <20200904002905.13616-1-n54@gmx.com> <20200904002905.13616-6-n54@gmx.com> From: Simon Marchi Message-ID: Date: Mon, 7 Sep 2020 14:59:45 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.12.0 MIME-Version: 1.0 In-Reply-To: <20200904002905.13616-6-n54@gmx.com> Content-Type: text/plain; charset=utf-8 Content-Language: fr Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-4.7 required=5.0 tests=BAYES_00, KAM_DMARC_STATUS, NICE_REPLY_A, SPF_HELO_PASS, 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, 07 Sep 2020 18:59:47 -0000 On 2020-09-03 8:29 p.m., Kamil Rytarowski wrote: > @@ -39,4 +45,121 @@ pid_to_exec_file (pid_t pid) > return buf; > } > > +/* Generic thread (LWP) lister within a specified process. The callback > + parameters is a C++ function that is called for each detected thread. */ The behavior seems to be that if the callback returns true, the iteration is stopped. If so, it would be good to document it. As well as the return value of this function. > + > +static bool > +netbsd_thread_lister (const pid_t pid, > + gdb::function_view > + callback) > +{ > + int mib[5] = {CTL_KERN, KERN_LWP, pid, sizeof (struct kinfo_lwp), 0}; > + size_t size; > + > + if (sysctl (mib, ARRAY_SIZE (mib), NULL, &size, NULL, 0) == -1 || size == 0) > + perror_with_name (("sysctl")); > + > + mib[4] = 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) == -1 > + || size == 0) > + perror_with_name (("sysctl")); Is there a chance that the number of threads changes between the two sysctl calls? Or does that assume that the process is not executing? It would be good to spell out any such assumption in a comment. > + > + for (size_t i = 0; i < size / sizeof (struct kinfo_lwp); i++) > + { > + struct kinfo_lwp *l = &kl[i]; > + > + /* Return true if the specified thread is alive. */ > + auto lwp_alive > + = [] (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 > +thread_alive (ptid_t ptid) > +{ > + pid_t pid = ptid.pid (); > + lwpid_t lwp = ptid.lwp (); > + > + auto fn > + = [&lwp] (const struct kinfo_lwp *kl) > + { > + return kl->l_lid == lwp; > + }; Just a nit, but would it be better to capture variables known to be scalars as value instead of as reference? Simon