xref: /titanic_50/usr/src/test/libc-tests/tests/c11_threads.c (revision dcdfe824b3dff2df12578b936adf1daf000aa129)
1*dcdfe824SRobert Mustacchi /*
2*dcdfe824SRobert Mustacchi  * This file and its contents are supplied under the terms of the
3*dcdfe824SRobert Mustacchi  * Common Development and Distribution License ("CDDL"), version 1.0.
4*dcdfe824SRobert Mustacchi  * You may only use this file in accordance with the terms of version
5*dcdfe824SRobert Mustacchi  * 1.0 of the CDDL.
6*dcdfe824SRobert Mustacchi  *
7*dcdfe824SRobert Mustacchi  * A full copy of the text of the CDDL should have accompanied this
8*dcdfe824SRobert Mustacchi  * source.  A copy of the CDDL is also available via the Internet at
9*dcdfe824SRobert Mustacchi  * http://www.illumos.org/license/CDDL.
10*dcdfe824SRobert Mustacchi  */
11*dcdfe824SRobert Mustacchi 
12*dcdfe824SRobert Mustacchi /*
13*dcdfe824SRobert Mustacchi  * Copyright 2016 Joyent, Inc.
14*dcdfe824SRobert Mustacchi  */
15*dcdfe824SRobert Mustacchi 
16*dcdfe824SRobert Mustacchi /*
17*dcdfe824SRobert Mustacchi  * Validate various C11 threads routines. Specifically we want to cover:
18*dcdfe824SRobert Mustacchi  *
19*dcdfe824SRobert Mustacchi  *    o threads
20*dcdfe824SRobert Mustacchi  *    o mutexes
21*dcdfe824SRobert Mustacchi  *    o condition variables
22*dcdfe824SRobert Mustacchi  */
23*dcdfe824SRobert Mustacchi 
24*dcdfe824SRobert Mustacchi #include <threads.h>
25*dcdfe824SRobert Mustacchi #include <sys/debug.h>
26*dcdfe824SRobert Mustacchi #include <stdlib.h>
27*dcdfe824SRobert Mustacchi #include <unistd.h>
28*dcdfe824SRobert Mustacchi 
29*dcdfe824SRobert Mustacchi #define	STRESS_NTHREADS	128
30*dcdfe824SRobert Mustacchi #define	STRESS_COUNT	1000
31*dcdfe824SRobert Mustacchi 
32*dcdfe824SRobert Mustacchi static mtx_t stress_mtx;
33*dcdfe824SRobert Mustacchi static int stress_count;
34*dcdfe824SRobert Mustacchi 
35*dcdfe824SRobert Mustacchi #define	BROADCAST_NTHREADS 128
36*dcdfe824SRobert Mustacchi 
37*dcdfe824SRobert Mustacchi static mtx_t broadcast_mtx;
38*dcdfe824SRobert Mustacchi static cnd_t broadcast_cnd;
39*dcdfe824SRobert Mustacchi static boolean_t broadcast_done;
40*dcdfe824SRobert Mustacchi 
41*dcdfe824SRobert Mustacchi #define	SIGNAL_NTHREADS 128
42*dcdfe824SRobert Mustacchi 
43*dcdfe824SRobert Mustacchi static mtx_t signal_mtx;
44*dcdfe824SRobert Mustacchi static cnd_t signal_cnd;
45*dcdfe824SRobert Mustacchi static boolean_t signal_done;
46*dcdfe824SRobert Mustacchi 
47*dcdfe824SRobert Mustacchi /*
48*dcdfe824SRobert Mustacchi  * This thread should only ever be used for detach.
49*dcdfe824SRobert Mustacchi  */
50*dcdfe824SRobert Mustacchi static int
cthr_test_sleep_thr(void * arg)51*dcdfe824SRobert Mustacchi cthr_test_sleep_thr(void *arg)
52*dcdfe824SRobert Mustacchi {
53*dcdfe824SRobert Mustacchi 	for (;;) {
54*dcdfe824SRobert Mustacchi 		sleep(1000);
55*dcdfe824SRobert Mustacchi 	}
56*dcdfe824SRobert Mustacchi 
57*dcdfe824SRobert Mustacchi 	abort();
58*dcdfe824SRobert Mustacchi }
59*dcdfe824SRobert Mustacchi 
60*dcdfe824SRobert Mustacchi static void
cthr_test_mtx_init(void)61*dcdfe824SRobert Mustacchi cthr_test_mtx_init(void)
62*dcdfe824SRobert Mustacchi {
63*dcdfe824SRobert Mustacchi 	mtx_t mtx;
64*dcdfe824SRobert Mustacchi 
65*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_init(&mtx, mtx_plain), ==, thrd_success);
66*dcdfe824SRobert Mustacchi 	mtx_destroy(&mtx);
67*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_init(&mtx, mtx_timed), ==, thrd_success);
68*dcdfe824SRobert Mustacchi 	mtx_destroy(&mtx);
69*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_init(&mtx, mtx_plain | mtx_recursive), ==, thrd_success);
70*dcdfe824SRobert Mustacchi 	mtx_destroy(&mtx);
71*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_init(&mtx, mtx_timed | mtx_recursive), ==, thrd_success);
72*dcdfe824SRobert Mustacchi 	mtx_destroy(&mtx);
73*dcdfe824SRobert Mustacchi 
74*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_init(&mtx, UINT32_MAX), ==, thrd_error);
75*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_init(&mtx, 42), ==, thrd_error);
76*dcdfe824SRobert Mustacchi }
77*dcdfe824SRobert Mustacchi 
78*dcdfe824SRobert Mustacchi static void
cthr_test_mtx_lockrec(void)79*dcdfe824SRobert Mustacchi cthr_test_mtx_lockrec(void)
80*dcdfe824SRobert Mustacchi {
81*dcdfe824SRobert Mustacchi 	mtx_t mtx;
82*dcdfe824SRobert Mustacchi 
83*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_init(&mtx, mtx_plain | mtx_recursive), ==, thrd_success);
84*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_lock(&mtx), ==, thrd_success);
85*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_lock(&mtx), ==, thrd_success);
86*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_trylock(&mtx), ==, thrd_success);
87*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_unlock(&mtx), ==, thrd_success);
88*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_unlock(&mtx), ==, thrd_success);
89*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_unlock(&mtx), ==, thrd_success);
90*dcdfe824SRobert Mustacchi 	mtx_destroy(&mtx);
91*dcdfe824SRobert Mustacchi }
92*dcdfe824SRobert Mustacchi 
93*dcdfe824SRobert Mustacchi static void
cthr_test_mtx_trylock(void)94*dcdfe824SRobert Mustacchi cthr_test_mtx_trylock(void)
95*dcdfe824SRobert Mustacchi {
96*dcdfe824SRobert Mustacchi 	mtx_t mtx;
97*dcdfe824SRobert Mustacchi 
98*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_init(&mtx, mtx_plain), ==, thrd_success);
99*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_trylock(&mtx), ==, thrd_success);
100*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_trylock(&mtx), ==, thrd_busy);
101*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_unlock(&mtx), ==, thrd_success);
102*dcdfe824SRobert Mustacchi 	mtx_destroy(&mtx);
103*dcdfe824SRobert Mustacchi }
104*dcdfe824SRobert Mustacchi 
105*dcdfe824SRobert Mustacchi static int
cthr_test_stress_thr(void * arg)106*dcdfe824SRobert Mustacchi cthr_test_stress_thr(void *arg)
107*dcdfe824SRobert Mustacchi {
108*dcdfe824SRobert Mustacchi 	int i;
109*dcdfe824SRobert Mustacchi 	int *ip = arg;
110*dcdfe824SRobert Mustacchi 
111*dcdfe824SRobert Mustacchi 	for (i = 0; i < STRESS_COUNT; i++) {
112*dcdfe824SRobert Mustacchi 		VERIFY3S(mtx_lock(&stress_mtx), ==, thrd_success);
113*dcdfe824SRobert Mustacchi 		*ip = *ip + 1;
114*dcdfe824SRobert Mustacchi 		VERIFY3S(mtx_unlock(&stress_mtx), ==, thrd_success);
115*dcdfe824SRobert Mustacchi 	}
116*dcdfe824SRobert Mustacchi 
117*dcdfe824SRobert Mustacchi 	return (0);
118*dcdfe824SRobert Mustacchi }
119*dcdfe824SRobert Mustacchi 
120*dcdfe824SRobert Mustacchi static void
cthr_test_stress(void)121*dcdfe824SRobert Mustacchi cthr_test_stress(void)
122*dcdfe824SRobert Mustacchi {
123*dcdfe824SRobert Mustacchi 	int i;
124*dcdfe824SRobert Mustacchi 	thrd_t threads[STRESS_NTHREADS];
125*dcdfe824SRobert Mustacchi 
126*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_init(&stress_mtx, mtx_plain), ==, thrd_success);
127*dcdfe824SRobert Mustacchi 	for (i = 0; i < STRESS_NTHREADS; i++) {
128*dcdfe824SRobert Mustacchi 		VERIFY3S(thrd_create(&threads[i], cthr_test_stress_thr,
129*dcdfe824SRobert Mustacchi 		    &stress_count),  ==, thrd_success);
130*dcdfe824SRobert Mustacchi 	}
131*dcdfe824SRobert Mustacchi 
132*dcdfe824SRobert Mustacchi 	for (i = 0; i < STRESS_NTHREADS; i++) {
133*dcdfe824SRobert Mustacchi 		VERIFY3S(thrd_join(threads[i], NULL), ==, thrd_success);
134*dcdfe824SRobert Mustacchi 	}
135*dcdfe824SRobert Mustacchi 	mtx_destroy(&stress_mtx);
136*dcdfe824SRobert Mustacchi 
137*dcdfe824SRobert Mustacchi 	VERIFY3S(stress_count, ==, STRESS_NTHREADS * STRESS_COUNT);
138*dcdfe824SRobert Mustacchi }
139*dcdfe824SRobert Mustacchi 
140*dcdfe824SRobert Mustacchi static void
cthr_test_equal(void)141*dcdfe824SRobert Mustacchi cthr_test_equal(void)
142*dcdfe824SRobert Mustacchi {
143*dcdfe824SRobert Mustacchi 	thrd_t self, other;
144*dcdfe824SRobert Mustacchi 
145*dcdfe824SRobert Mustacchi 	self = thrd_current();
146*dcdfe824SRobert Mustacchi 
147*dcdfe824SRobert Mustacchi 	VERIFY0(thrd_equal(self, self));
148*dcdfe824SRobert Mustacchi 	VERIFY3S(thrd_create(&other, cthr_test_sleep_thr, NULL), ==,
149*dcdfe824SRobert Mustacchi 	    thrd_success);
150*dcdfe824SRobert Mustacchi 	VERIFY3S(thrd_equal(self, other), !=, 0);
151*dcdfe824SRobert Mustacchi 	VERIFY3S(thrd_equal(other, other), ==, 0);
152*dcdfe824SRobert Mustacchi 	VERIFY3S(thrd_detach(other), ==, thrd_success);
153*dcdfe824SRobert Mustacchi }
154*dcdfe824SRobert Mustacchi 
155*dcdfe824SRobert Mustacchi static void
cthr_test_detach_err(void)156*dcdfe824SRobert Mustacchi cthr_test_detach_err(void)
157*dcdfe824SRobert Mustacchi {
158*dcdfe824SRobert Mustacchi 	thrd_t self, other;
159*dcdfe824SRobert Mustacchi 
160*dcdfe824SRobert Mustacchi 	self = thrd_current();
161*dcdfe824SRobert Mustacchi 
162*dcdfe824SRobert Mustacchi 	VERIFY0(thrd_equal(self, self));
163*dcdfe824SRobert Mustacchi 	VERIFY3S(thrd_create(&other, cthr_test_sleep_thr, NULL), ==,
164*dcdfe824SRobert Mustacchi 	    thrd_success);
165*dcdfe824SRobert Mustacchi 	VERIFY3S(thrd_detach(other), ==, thrd_success);
166*dcdfe824SRobert Mustacchi 
167*dcdfe824SRobert Mustacchi 	VERIFY3S(thrd_join(self, NULL), ==, thrd_error);
168*dcdfe824SRobert Mustacchi 	VERIFY3S(thrd_join(other, NULL), ==, thrd_error);
169*dcdfe824SRobert Mustacchi }
170*dcdfe824SRobert Mustacchi 
171*dcdfe824SRobert Mustacchi static int
cthr_test_detach_thr0(void * arg)172*dcdfe824SRobert Mustacchi cthr_test_detach_thr0(void *arg)
173*dcdfe824SRobert Mustacchi {
174*dcdfe824SRobert Mustacchi 	thrd_exit(23);
175*dcdfe824SRobert Mustacchi 	abort();
176*dcdfe824SRobert Mustacchi }
177*dcdfe824SRobert Mustacchi 
178*dcdfe824SRobert Mustacchi static int
cthr_test_detach_thr1(void * arg)179*dcdfe824SRobert Mustacchi cthr_test_detach_thr1(void *arg)
180*dcdfe824SRobert Mustacchi {
181*dcdfe824SRobert Mustacchi 	return (42);
182*dcdfe824SRobert Mustacchi }
183*dcdfe824SRobert Mustacchi 
184*dcdfe824SRobert Mustacchi static void
cthr_test_detach(void)185*dcdfe824SRobert Mustacchi cthr_test_detach(void)
186*dcdfe824SRobert Mustacchi {
187*dcdfe824SRobert Mustacchi 	int status;
188*dcdfe824SRobert Mustacchi 	thrd_t thrd;
189*dcdfe824SRobert Mustacchi 
190*dcdfe824SRobert Mustacchi 	VERIFY3S(thrd_create(&thrd, cthr_test_detach_thr0, NULL), ==,
191*dcdfe824SRobert Mustacchi 	    thrd_success);
192*dcdfe824SRobert Mustacchi 	VERIFY3S(thrd_join(thrd, &status), ==, thrd_success);
193*dcdfe824SRobert Mustacchi 	VERIFY3S(status, ==, 23);
194*dcdfe824SRobert Mustacchi 
195*dcdfe824SRobert Mustacchi 	VERIFY3S(thrd_create(&thrd, cthr_test_detach_thr1, NULL), ==,
196*dcdfe824SRobert Mustacchi 	    thrd_success);
197*dcdfe824SRobert Mustacchi 	VERIFY3S(thrd_join(thrd, &status), ==, thrd_success);
198*dcdfe824SRobert Mustacchi 	VERIFY3S(status, ==, 42);
199*dcdfe824SRobert Mustacchi }
200*dcdfe824SRobert Mustacchi 
201*dcdfe824SRobert Mustacchi static void
cthr_test_sleep(void)202*dcdfe824SRobert Mustacchi cthr_test_sleep(void)
203*dcdfe824SRobert Mustacchi {
204*dcdfe824SRobert Mustacchi 	struct timespec ts;
205*dcdfe824SRobert Mustacchi 	hrtime_t start, end;
206*dcdfe824SRobert Mustacchi 	long stime = 10 * NANOSEC / MILLISEC;
207*dcdfe824SRobert Mustacchi 
208*dcdfe824SRobert Mustacchi 	ts.tv_sec = 1;
209*dcdfe824SRobert Mustacchi 	ts.tv_nsec = -1;
210*dcdfe824SRobert Mustacchi 
211*dcdfe824SRobert Mustacchi 	VERIFY3S(thrd_sleep(&ts, NULL), <, -1);
212*dcdfe824SRobert Mustacchi 
213*dcdfe824SRobert Mustacchi 	ts.tv_sec = 0;
214*dcdfe824SRobert Mustacchi 	ts.tv_nsec = stime;
215*dcdfe824SRobert Mustacchi 	start = gethrtime();
216*dcdfe824SRobert Mustacchi 	VERIFY3S(thrd_sleep(&ts, NULL), ==, 0);
217*dcdfe824SRobert Mustacchi 	end = gethrtime();
218*dcdfe824SRobert Mustacchi 
219*dcdfe824SRobert Mustacchi 	VERIFY3S(end - start, >, stime);
220*dcdfe824SRobert Mustacchi }
221*dcdfe824SRobert Mustacchi 
222*dcdfe824SRobert Mustacchi static int
cthr_test_broadcast_thr(void * arg)223*dcdfe824SRobert Mustacchi cthr_test_broadcast_thr(void *arg)
224*dcdfe824SRobert Mustacchi {
225*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_lock(&broadcast_mtx), ==, thrd_success);
226*dcdfe824SRobert Mustacchi 	while (broadcast_done == B_FALSE)
227*dcdfe824SRobert Mustacchi 		VERIFY3S(cnd_wait(&broadcast_cnd, &broadcast_mtx), ==,
228*dcdfe824SRobert Mustacchi 		    thrd_success);
229*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_unlock(&broadcast_mtx), ==, thrd_success);
230*dcdfe824SRobert Mustacchi 
231*dcdfe824SRobert Mustacchi 	return (0);
232*dcdfe824SRobert Mustacchi }
233*dcdfe824SRobert Mustacchi 
234*dcdfe824SRobert Mustacchi static void
cthr_test_broadcast(void)235*dcdfe824SRobert Mustacchi cthr_test_broadcast(void)
236*dcdfe824SRobert Mustacchi {
237*dcdfe824SRobert Mustacchi 	int i;
238*dcdfe824SRobert Mustacchi 	thrd_t threads[BROADCAST_NTHREADS];
239*dcdfe824SRobert Mustacchi 
240*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_init(&broadcast_mtx, mtx_plain), ==, thrd_success);
241*dcdfe824SRobert Mustacchi 	VERIFY3S(cnd_init(&broadcast_cnd), ==, thrd_success);
242*dcdfe824SRobert Mustacchi 	for (i = 0; i < BROADCAST_NTHREADS; i++) {
243*dcdfe824SRobert Mustacchi 		VERIFY3S(thrd_create(&threads[i], cthr_test_broadcast_thr,
244*dcdfe824SRobert Mustacchi 		    NULL),  ==, thrd_success);
245*dcdfe824SRobert Mustacchi 	}
246*dcdfe824SRobert Mustacchi 
247*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_lock(&broadcast_mtx), ==, thrd_success);
248*dcdfe824SRobert Mustacchi 	broadcast_done = B_TRUE;
249*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_unlock(&broadcast_mtx), ==, thrd_success);
250*dcdfe824SRobert Mustacchi 	VERIFY3S(cnd_broadcast(&broadcast_cnd), ==, thrd_success);
251*dcdfe824SRobert Mustacchi 
252*dcdfe824SRobert Mustacchi 	for (i = 0; i < STRESS_NTHREADS; i++) {
253*dcdfe824SRobert Mustacchi 		VERIFY3S(thrd_join(threads[i], NULL), ==, thrd_success);
254*dcdfe824SRobert Mustacchi 	}
255*dcdfe824SRobert Mustacchi 
256*dcdfe824SRobert Mustacchi 	mtx_destroy(&broadcast_mtx);
257*dcdfe824SRobert Mustacchi 	cnd_destroy(&broadcast_cnd);
258*dcdfe824SRobert Mustacchi }
259*dcdfe824SRobert Mustacchi 
260*dcdfe824SRobert Mustacchi 
261*dcdfe824SRobert Mustacchi static int
cthr_test_signal_thr(void * arg)262*dcdfe824SRobert Mustacchi cthr_test_signal_thr(void *arg)
263*dcdfe824SRobert Mustacchi {
264*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_lock(&signal_mtx), ==, thrd_success);
265*dcdfe824SRobert Mustacchi 	while (signal_done == B_FALSE)
266*dcdfe824SRobert Mustacchi 		VERIFY3S(cnd_wait(&signal_cnd, &signal_mtx), ==,
267*dcdfe824SRobert Mustacchi 		    thrd_success);
268*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_unlock(&signal_mtx), ==, thrd_success);
269*dcdfe824SRobert Mustacchi 	VERIFY3S(cnd_signal(&signal_cnd), ==, thrd_success);
270*dcdfe824SRobert Mustacchi 
271*dcdfe824SRobert Mustacchi 	return (0);
272*dcdfe824SRobert Mustacchi }
273*dcdfe824SRobert Mustacchi 
274*dcdfe824SRobert Mustacchi static void
cthr_test_signal(void)275*dcdfe824SRobert Mustacchi cthr_test_signal(void)
276*dcdfe824SRobert Mustacchi {
277*dcdfe824SRobert Mustacchi 	int i;
278*dcdfe824SRobert Mustacchi 	thrd_t threads[SIGNAL_NTHREADS];
279*dcdfe824SRobert Mustacchi 
280*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_init(&signal_mtx, mtx_plain), ==, thrd_success);
281*dcdfe824SRobert Mustacchi 	VERIFY3S(cnd_init(&signal_cnd), ==, thrd_success);
282*dcdfe824SRobert Mustacchi 	for (i = 0; i < SIGNAL_NTHREADS; i++) {
283*dcdfe824SRobert Mustacchi 		VERIFY3S(thrd_create(&threads[i], cthr_test_signal_thr, NULL),
284*dcdfe824SRobert Mustacchi 		    ==, thrd_success);
285*dcdfe824SRobert Mustacchi 	}
286*dcdfe824SRobert Mustacchi 
287*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_lock(&signal_mtx), ==, thrd_success);
288*dcdfe824SRobert Mustacchi 	signal_done = B_TRUE;
289*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_unlock(&signal_mtx), ==, thrd_success);
290*dcdfe824SRobert Mustacchi 	VERIFY3S(cnd_signal(&signal_cnd), ==, thrd_success);
291*dcdfe824SRobert Mustacchi 
292*dcdfe824SRobert Mustacchi 	for (i = 0; i < STRESS_NTHREADS; i++) {
293*dcdfe824SRobert Mustacchi 		VERIFY3S(thrd_join(threads[i], NULL), ==, thrd_success);
294*dcdfe824SRobert Mustacchi 	}
295*dcdfe824SRobert Mustacchi 
296*dcdfe824SRobert Mustacchi 	mtx_destroy(&signal_mtx);
297*dcdfe824SRobert Mustacchi 	cnd_destroy(&signal_cnd);
298*dcdfe824SRobert Mustacchi }
299*dcdfe824SRobert Mustacchi 
300*dcdfe824SRobert Mustacchi static void
cthr_test_cndtime(void)301*dcdfe824SRobert Mustacchi cthr_test_cndtime(void)
302*dcdfe824SRobert Mustacchi {
303*dcdfe824SRobert Mustacchi 	mtx_t mtx;
304*dcdfe824SRobert Mustacchi 	cnd_t cnd;
305*dcdfe824SRobert Mustacchi 	struct timespec ts;
306*dcdfe824SRobert Mustacchi 
307*dcdfe824SRobert Mustacchi 	ts.tv_sec = 0;
308*dcdfe824SRobert Mustacchi 	ts.tv_nsec = 1 * NANOSEC / MILLISEC;
309*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_init(&mtx, mtx_plain), ==, thrd_success);
310*dcdfe824SRobert Mustacchi 	VERIFY3S(cnd_init(&cnd), ==, thrd_success);
311*dcdfe824SRobert Mustacchi 
312*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_lock(&mtx), ==, thrd_success);
313*dcdfe824SRobert Mustacchi 	VERIFY3S(cnd_timedwait(&cnd, &mtx, &ts), ==, thrd_timedout);
314*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_unlock(&mtx), ==, thrd_success);
315*dcdfe824SRobert Mustacchi 
316*dcdfe824SRobert Mustacchi 	mtx_destroy(&mtx);
317*dcdfe824SRobert Mustacchi 	cnd_destroy(&cnd);
318*dcdfe824SRobert Mustacchi }
319*dcdfe824SRobert Mustacchi 
320*dcdfe824SRobert Mustacchi static void
cthr_test_mtx_selftime(void)321*dcdfe824SRobert Mustacchi cthr_test_mtx_selftime(void)
322*dcdfe824SRobert Mustacchi {
323*dcdfe824SRobert Mustacchi 	mtx_t mtx;
324*dcdfe824SRobert Mustacchi 	struct timespec ts;
325*dcdfe824SRobert Mustacchi 
326*dcdfe824SRobert Mustacchi 	ts.tv_sec = 0;
327*dcdfe824SRobert Mustacchi 	ts.tv_nsec = 1 * NANOSEC / MILLISEC;
328*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_init(&mtx, mtx_timed), ==, thrd_success);
329*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_lock(&mtx), ==, thrd_success);
330*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_timedlock(&mtx, &ts), ==, thrd_timedout);
331*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_unlock(&mtx), ==, thrd_success);
332*dcdfe824SRobert Mustacchi 	mtx_destroy(&mtx);
333*dcdfe824SRobert Mustacchi }
334*dcdfe824SRobert Mustacchi 
335*dcdfe824SRobert Mustacchi static int
cthr_test_mtx_busy_thr(void * arg)336*dcdfe824SRobert Mustacchi cthr_test_mtx_busy_thr(void *arg)
337*dcdfe824SRobert Mustacchi {
338*dcdfe824SRobert Mustacchi 	mtx_t *mtx = arg;
339*dcdfe824SRobert Mustacchi 	struct timespec ts;
340*dcdfe824SRobert Mustacchi 
341*dcdfe824SRobert Mustacchi 	ts.tv_sec = 0;
342*dcdfe824SRobert Mustacchi 	ts.tv_nsec = 1 * NANOSEC / MILLISEC;
343*dcdfe824SRobert Mustacchi 
344*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_trylock(mtx), ==, thrd_busy);
345*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_timedlock(mtx, &ts), ==, thrd_timedout);
346*dcdfe824SRobert Mustacchi 
347*dcdfe824SRobert Mustacchi 	return (0);
348*dcdfe824SRobert Mustacchi }
349*dcdfe824SRobert Mustacchi 
350*dcdfe824SRobert Mustacchi static void
cthr_test_mtx_busy(void)351*dcdfe824SRobert Mustacchi cthr_test_mtx_busy(void)
352*dcdfe824SRobert Mustacchi {
353*dcdfe824SRobert Mustacchi 	mtx_t mtx;
354*dcdfe824SRobert Mustacchi 	thrd_t thrd;
355*dcdfe824SRobert Mustacchi 
356*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_init(&mtx, mtx_timed), ==, thrd_success);
357*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_lock(&mtx), ==, thrd_success);
358*dcdfe824SRobert Mustacchi 
359*dcdfe824SRobert Mustacchi 	VERIFY3S(thrd_create(&thrd, cthr_test_mtx_busy_thr, &mtx), ==,
360*dcdfe824SRobert Mustacchi 	    thrd_success);
361*dcdfe824SRobert Mustacchi 	VERIFY3S(thrd_join(thrd, NULL), ==, thrd_success);
362*dcdfe824SRobert Mustacchi 
363*dcdfe824SRobert Mustacchi 	VERIFY3S(mtx_unlock(&mtx), ==, thrd_success);
364*dcdfe824SRobert Mustacchi 	mtx_destroy(&mtx);
365*dcdfe824SRobert Mustacchi }
366*dcdfe824SRobert Mustacchi 
367*dcdfe824SRobert Mustacchi int
main(void)368*dcdfe824SRobert Mustacchi main(void)
369*dcdfe824SRobert Mustacchi {
370*dcdfe824SRobert Mustacchi 	cthr_test_mtx_init();
371*dcdfe824SRobert Mustacchi 	cthr_test_mtx_lockrec();
372*dcdfe824SRobert Mustacchi 	cthr_test_mtx_trylock();
373*dcdfe824SRobert Mustacchi 	cthr_test_stress();
374*dcdfe824SRobert Mustacchi 	cthr_test_equal();
375*dcdfe824SRobert Mustacchi 	cthr_test_detach_err();
376*dcdfe824SRobert Mustacchi 	cthr_test_detach();
377*dcdfe824SRobert Mustacchi 	cthr_test_sleep();
378*dcdfe824SRobert Mustacchi 	cthr_test_broadcast();
379*dcdfe824SRobert Mustacchi 	cthr_test_signal();
380*dcdfe824SRobert Mustacchi 	cthr_test_cndtime();
381*dcdfe824SRobert Mustacchi 	cthr_test_mtx_selftime();
382*dcdfe824SRobert Mustacchi 	cthr_test_mtx_busy();
383*dcdfe824SRobert Mustacchi 
384*dcdfe824SRobert Mustacchi 	return (0);
385*dcdfe824SRobert Mustacchi }
386