Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 27 Jul 2026 16:18:00 +0000
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 10ea2300bf29 - main - tests/libpthread: add pthread_cond_clockwait(3) tests
Message-ID:  <6a6784b8.1dc9d.31d68997@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch main has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=10ea2300bf29cdcaf12182e8b722f6becb0da1fb

commit 10ea2300bf29cdcaf12182e8b722f6becb0da1fb
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2026-07-26 01:59:05 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2026-07-27 16:17:29 +0000

    tests/libpthread: add pthread_cond_clockwait(3) tests
    
    Reviewed by:    markj, ngie
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Differential revision:  https://reviews.freebsd.org/D58458
---
 contrib/netbsd-tests/lib/libpthread/t_condwait.c | 112 +++++++++++++++++++----
 1 file changed, 93 insertions(+), 19 deletions(-)

diff --git a/contrib/netbsd-tests/lib/libpthread/t_condwait.c b/contrib/netbsd-tests/lib/libpthread/t_condwait.c
index 5fdebe868f3f..ead113b7bd97 100644
--- a/contrib/netbsd-tests/lib/libpthread/t_condwait.c
+++ b/contrib/netbsd-tests/lib/libpthread/t_condwait.c
@@ -47,25 +47,41 @@ __RCSID("$NetBSD: t_condwait.c,v 1.8 2019/08/11 11:42:23 martin Exp $");
 
 static const int debug = 1;
 
+struct run_param {
+	clockid_t clck;
+	bool clockwait;
+	bool pshared;
+};
+
 static void *
 run(void *param)
 {
 	struct timespec ts, to, te, twmin, twmax;
-	clockid_t clck;
-	pthread_condattr_t attr;
+	struct run_param *rp;
+	pthread_condattr_t cattr;
 	pthread_cond_t cond;
-	pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
+	pthread_mutexattr_t mattr;
+	pthread_mutex_t m;
 	int ret = 0;
 
-
-	clck = *(clockid_t *)param;
-	PTHREAD_REQUIRE(pthread_condattr_init(&attr));
-	PTHREAD_REQUIRE(pthread_condattr_setclock(&attr, clck));
-	pthread_cond_init(&cond, &attr);
+	rp = param;
+
+	PTHREAD_REQUIRE(pthread_condattr_init(&cattr));
+	PTHREAD_REQUIRE(pthread_mutexattr_init(&mattr));
+	if (!rp->clockwait)
+		PTHREAD_REQUIRE(pthread_condattr_setclock(&cattr, rp->clck));
+	if (rp->pshared) {
+		PTHREAD_REQUIRE(pthread_condattr_setpshared(&cattr,
+		    PTHREAD_PROCESS_SHARED));
+		PTHREAD_REQUIRE(pthread_mutexattr_setpshared(&mattr,
+		    PTHREAD_PROCESS_SHARED));
+	}
+	pthread_mutex_init(&m, &mattr);
+	pthread_cond_init(&cond, &cattr);
 
 	ATF_REQUIRE_EQ((ret = pthread_mutex_lock(&m)), 0);
 
-	ATF_REQUIRE_EQ(clock_gettime(clck, &ts), 0);
+	ATF_REQUIRE_EQ(clock_gettime(rp->clck, &ts), 0);
 	to = ts;
 
 	if (debug)
@@ -74,10 +90,14 @@ run(void *param)
 
 	ts.tv_sec += WAITTIME;	/* Timeout wait */
 
-	switch (ret = pthread_cond_timedwait(&cond, &m, &ts)) {
+	if (rp->clockwait)
+		ret = pthread_cond_clockwait(&cond, &m, rp->clck, &ts);
+	else
+		ret = pthread_cond_timedwait(&cond, &m, &ts);
+	switch (ret) {
 	case ETIMEDOUT:
 		/* Timeout */
-		ATF_REQUIRE_EQ(clock_gettime(clck, &te), 0);
+		ATF_REQUIRE_EQ(clock_gettime(rp->clck, &te), 0);
 		timespecsub(&te, &to, &to);
 		if (debug) {
 			printf("timeout: %lld.%09ld sec\n",
@@ -113,12 +133,18 @@ run(void *param)
 }
 
 static void
-cond_wait(clockid_t clck, const char *msg) {
+cond_wait(clockid_t clck, bool clockwait, bool pshared, const char *msg)
+{
 	pthread_t child;
+	struct run_param rp;
+
+	rp.clck = clck;
+	rp.clockwait = clockwait;
+	rp.pshared = pshared;
 
 	if (debug)
 		printf( "**** %s clock wait starting\n", msg);
-	ATF_REQUIRE_EQ(pthread_create(&child, NULL, run, &clck), 0);
+	ATF_REQUIRE_EQ(pthread_create(&child, NULL, run, &rp), 0);
 	ATF_REQUIRE_EQ(pthread_join(child, NULL), 0); /* wait for terminate */
 	if (debug)
 		printf( "**** %s clock wait ended\n", msg);
@@ -127,28 +153,76 @@ cond_wait(clockid_t clck, const char *msg) {
 ATF_TC(cond_wait_real);
 ATF_TC_HEAD(cond_wait_real, tc)
 {
-	atf_tc_set_md_var(tc, "descr", "Checks pthread_cond_timedwait "
-	    "with CLOCK_REALTIME");
+	atf_tc_set_md_var(tc, "descr",
+	    "Checks pthread_cond_timedwait with CLOCK_REALTIME");
 }
 
 ATF_TC_BODY(cond_wait_real, tc) {
-	cond_wait(CLOCK_REALTIME, "CLOCK_REALTIME");
+	cond_wait(CLOCK_REALTIME, false, false, "CLOCK_REALTIME");
 }
 
 ATF_TC(cond_wait_mono);
 ATF_TC_HEAD(cond_wait_mono, tc)
 {
-	atf_tc_set_md_var(tc, "descr", "Checks pthread_cond_timedwait "
-	    "with CLOCK_MONOTONIC");
+	atf_tc_set_md_var(tc, "descr",
+	    "Checks pthread_cond_timedwait with CLOCK_MONOTONIC");
 }
 
 ATF_TC_BODY(cond_wait_mono, tc) {
-	cond_wait(CLOCK_MONOTONIC, "CLOCK_MONOTONIC");
+	cond_wait(CLOCK_MONOTONIC, false, false, "CLOCK_MONOTONIC");
+}
+
+ATF_TC(cond_clockwait_real);
+ATF_TC_HEAD(cond_clockwait_real, tc)
+{
+	atf_tc_set_md_var(tc, "descr",
+	    "Checks pthread_cond_clockwait with CLOCK_REALTIME");
+}
+
+ATF_TC_BODY(cond_clockwait_real, tc) {
+	cond_wait(CLOCK_REALTIME, true, false, "CLOCK_REALTIME");
+}
+
+ATF_TC(cond_clockwait_mono);
+ATF_TC_HEAD(cond_clockwait_mono, tc)
+{
+	atf_tc_set_md_var(tc, "descr",
+	    "Checks pthread_cond_clockwait with CLOCK_MONOTONIC");
+}
+
+ATF_TC_BODY(cond_clockwait_mono, tc) {
+	cond_wait(CLOCK_MONOTONIC, true, false, "CLOCK_MONOTONIC");
+}
+
+ATF_TC(cond_klockwait_real);
+ATF_TC_HEAD(cond_klockwait_real, tc)
+{
+	atf_tc_set_md_var(tc, "descr",
+    "Checks pthread_cond_clockwait with CLOCK_REALTIME calling kernel");
+}
+
+ATF_TC_BODY(cond_klockwait_real, tc) {
+	cond_wait(CLOCK_REALTIME, true, true, "CLOCK_REALTIME");
+}
+
+ATF_TC(cond_klockwait_mono);
+ATF_TC_HEAD(cond_klockwait_mono, tc)
+{
+	atf_tc_set_md_var(tc, "descr",
+    "Checks pthread_cond_clockwait with CLOCK_MONOTONIC calling kernel");
+}
+
+ATF_TC_BODY(cond_klockwait_mono, tc) {
+	cond_wait(CLOCK_MONOTONIC, true, true, "CLOCK_MONOTONIC");
 }
 
 ATF_TP_ADD_TCS(tp)
 {
 	ATF_TP_ADD_TC(tp, cond_wait_real);
 	ATF_TP_ADD_TC(tp, cond_wait_mono);
+	ATF_TP_ADD_TC(tp, cond_clockwait_real);
+	ATF_TP_ADD_TC(tp, cond_clockwait_mono);
+	ATF_TP_ADD_TC(tp, cond_klockwait_real);
+	ATF_TP_ADD_TC(tp, cond_klockwait_mono);
 	return atf_no_error();
 }


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6a6784b8.1dc9d.31d68997>