From nobody Mon Jan 19 16:57:16 2026 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4dvxT84GBCz6P45G for ; Mon, 19 Jan 2026 16:57:16 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R13" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4dvxT81Gw9z46G3 for ; Mon, 19 Jan 2026 16:57:16 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1768841836; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=VcbF4YTfNuQcQYiNCgOTKQ+acK3AkCka5BixFE9rGbE=; b=F2gf4Rl9JqpuDnRg66ooYo4QRJYNxYEjlrCYqrH6jhBzkBYpdDTG7Nx8/gTsCAmvBuFyCz kdtr6PFMGc+kJO8zGWceIACGa/dInuAma7Zc4oCt4pRqJgKGF5BvXbkxcKmd/XPkmhO1KB fMIhzONw+S9estcF70JZZO+Kf1OnYKW4eX6Yqd2l2He2RTFFRS48u2s78zcon8YjjFkj19 +ojF0TW0JvlDi5d6V+9Yrd9d6zgZchRrXARw/gRlealYCrtriIvaxJ38yjYH1zVL6bciw/ h9eBx/Fwe5p50vjhO6u1v/VonTm/YAU9CvJkhc9L8XJpazNuToD2AwUSGDqVvw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1768841836; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=VcbF4YTfNuQcQYiNCgOTKQ+acK3AkCka5BixFE9rGbE=; b=GXNisrn96PsvdJZHaEHrFwZ4U96uImXnbrSSvXh2ipxfa8aFibu4pcfjrMVWadtAFcRv7z iKHO9t3DHCmtF2i3RmNjRRroaSzehG6OhBmf//P3IT/wOoHSQi1qlqKr3a4ixPIqEUIDP/ WqAWbCMHJajleUR2ggPWxAR2ERYccDnq0kOQE47iCYF5Qfao+Ufx65oG9PcXzqBs1/4aFw dtO3fHPIwicFUqXe6lbPYm3XfcCmJ9kmsdjySn0FdRI92Sh74i3Qx7ZQBrSOhuD6U0S6+n SZYb0UGzBaEVBT/S2ABG8uQnEBoE3UHeaAL8muM5JRnl7a8EpQtaPzLQqYVYPA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1768841836; a=rsa-sha256; cv=none; b=IbAOGCffOMHSNQUMyyT14dEcwVUh4eCquvd4Wn9kaSP1ZOQFOWfLQOMvYuPfwDN06VMU4E uPj6fWkL+V/TriDHUkwv60b1DF1daP307/N6Ckzugr3TJil5NoF3WJZz7BldUXmuqKErq2 pc/bZL7F5cteSSu7VippeIF1PM+pyGAs6IgktSiyO3qM0R+fQvgJuNvX3dsZ4q1UlsogX2 4f8aoWZ9SRpOcMHFmsgS460QFrJVjeSwoZqBYbJmAjkV6l92I973cIpS3ze/Mp0564m1/U 7AkRVs2xlFxEEl2wKNA1JoqHQKOLaWmSKG+V0FSNwC/+Ul5O8ueqvBWgkNFXJw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4dvxT80rPSzh4S for ; Mon, 19 Jan 2026 16:57:16 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 36aed by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Mon, 19 Jan 2026 16:57:16 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Konstantin Belousov Subject: git: afa70a8496e9 - main - libthr: add pthread_tryjoin_np() List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kib X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: afa70a8496e90fa751418be8d1b55e3d559a281a Auto-Submitted: auto-generated Date: Mon, 19 Jan 2026 16:57:16 +0000 Message-Id: <696e626c.36aed.44afc106@gitrepo.freebsd.org> The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=afa70a8496e90fa751418be8d1b55e3d559a281a commit afa70a8496e90fa751418be8d1b55e3d559a281a Author: Konstantin Belousov AuthorDate: 2026-01-18 12:26:46 +0000 Commit: Konstantin Belousov CommitDate: 2026-01-19 16:49:57 +0000 libthr: add pthread_tryjoin_np() Similar to the same glibc function. Reviewed by: markj Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D54766 --- include/pthread_np.h | 1 + lib/libthr/pthread.map | 4 ++++ lib/libthr/thread/thr_join.c | 55 +++++++++++++++++++++++++++++++++----------- 3 files changed, 46 insertions(+), 14 deletions(-) diff --git a/include/pthread_np.h b/include/pthread_np.h index a9e738540db4..04c64a748b72 100644 --- a/include/pthread_np.h +++ b/include/pthread_np.h @@ -65,6 +65,7 @@ int pthread_single_np(void); void pthread_suspend_all_np(void); int pthread_suspend_np(pthread_t); int pthread_timedjoin_np(pthread_t, void **, const struct timespec *); +int pthread_tryjoin_np(pthread_t, void **); __END_DECLS #endif diff --git a/lib/libthr/pthread.map b/lib/libthr/pthread.map index 3a5353a32dc3..ad0c28de98c1 100644 --- a/lib/libthr/pthread.map +++ b/lib/libthr/pthread.map @@ -342,3 +342,7 @@ FBSD_1.8 { pthread_signals_unblock_np; pthread_sigqueue; }; + +FBSD_1.9 { + pthread_tryjoin_np; +}; diff --git a/lib/libthr/thread/thr_join.c b/lib/libthr/thread/thr_join.c index 56b316ec0f51..33eb18638169 100644 --- a/lib/libthr/thread/thr_join.c +++ b/lib/libthr/thread/thr_join.c @@ -34,14 +34,17 @@ #include "thr_private.h" int _pthread_peekjoin_np(pthread_t pthread, void **thread_return); +int _pthread_tryjoin_np(pthread_t pthread, void **thread_return); int _pthread_timedjoin_np(pthread_t pthread, void **thread_return, const struct timespec *abstime); -static int join_common(pthread_t, void **, const struct timespec *, bool peek); +static int join_common(pthread_t, void **, const struct timespec *, bool peek, + bool try); __weak_reference(_thr_join, pthread_join); __weak_reference(_thr_join, _pthread_join); __weak_reference(_pthread_timedjoin_np, pthread_timedjoin_np); __weak_reference(_pthread_peekjoin_np, pthread_peekjoin_np); +__weak_reference(_pthread_tryjoin_np, pthread_tryjoin_np); static void backout_join(struct pthread *pthread, struct pthread *curthread) @@ -63,7 +66,7 @@ backout_join_pop(void *arg) int _thr_join(pthread_t pthread, void **thread_return) { - return (join_common(pthread, thread_return, NULL, false)); + return (join_common(pthread, thread_return, NULL, false, false)); } int @@ -74,13 +77,34 @@ _pthread_timedjoin_np(pthread_t pthread, void **thread_return, abstime->tv_nsec >= 1000000000) return (EINVAL); - return (join_common(pthread, thread_return, abstime, false)); + return (join_common(pthread, thread_return, abstime, false, false)); } int _pthread_peekjoin_np(pthread_t pthread, void **thread_return) { - return (join_common(pthread, thread_return, NULL, true)); + return (join_common(pthread, thread_return, NULL, true, false)); +} + +int +_pthread_tryjoin_np(pthread_t pthread, void **thread_return) +{ + return (join_common(pthread, thread_return, NULL, false, true)); +} + +static void +join_common_joined(struct pthread *pthread, struct pthread *curthread, + void **thread_return) +{ + void *tmp; + + tmp = pthread->ret; + pthread->flags |= THR_FLAGS_DETACHED; + pthread->joiner = NULL; + _thr_try_gc(curthread, pthread); /* thread lock released */ + + if (thread_return != NULL) + *thread_return = tmp; } /* @@ -89,11 +113,10 @@ _pthread_peekjoin_np(pthread_t pthread, void **thread_return) */ static int join_common(pthread_t pthread, void **thread_return, - const struct timespec *abstime, bool peek) + const struct timespec *abstime, bool peek, bool try) { struct pthread *curthread = _get_curthread(); struct timespec ts, ts2, *tsp; - void *tmp; long tid; int ret; @@ -127,12 +150,22 @@ join_common(pthread_t pthread, void **thread_return, return (ret); } + /* Only try to join. */ + if (try) { + if (pthread->tid != TID_TERMINATED) { + THR_THREAD_UNLOCK(curthread, pthread); + return (EBUSY); + } + join_common_joined(pthread, curthread, thread_return); + return (0); + } + /* Set the running thread to be the joiner: */ pthread->joiner = curthread; THR_THREAD_UNLOCK(curthread, pthread); - THR_CLEANUP_PUSH(curthread, backout_join, pthread); + THR_CLEANUP_PUSH(curthread, backout_join_pop, pthread); _thr_cancel_enter(curthread); tid = pthread->tid; @@ -160,14 +193,8 @@ join_common(pthread_t pthread, void **thread_return, backout_join(pthread, curthread); } else { ret = 0; - tmp = pthread->ret; THR_THREAD_LOCK(curthread, pthread); - pthread->flags |= THR_FLAGS_DETACHED; - pthread->joiner = NULL; - _thr_try_gc(curthread, pthread); /* thread lock released */ - - if (thread_return != NULL) - *thread_return = tmp; + join_common_joined(pthread, curthread, thread_return); } return (ret); }