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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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