xref: /netbsd-src/external/bsd/jemalloc.old/dist/test/unit/mtx.c (revision 8e33eff89e26cf71871ead62f0d5063e1313c33a)
1*8e33eff8Schristos #include "test/jemalloc_test.h"
2*8e33eff8Schristos 
3*8e33eff8Schristos #define NTHREADS	2
4*8e33eff8Schristos #define NINCRS		2000000
5*8e33eff8Schristos 
6*8e33eff8Schristos TEST_BEGIN(test_mtx_basic) {
7*8e33eff8Schristos 	mtx_t mtx;
8*8e33eff8Schristos 
9*8e33eff8Schristos 	assert_false(mtx_init(&mtx), "Unexpected mtx_init() failure");
10*8e33eff8Schristos 	mtx_lock(&mtx);
11*8e33eff8Schristos 	mtx_unlock(&mtx);
12*8e33eff8Schristos 	mtx_fini(&mtx);
13*8e33eff8Schristos }
14*8e33eff8Schristos TEST_END
15*8e33eff8Schristos 
16*8e33eff8Schristos typedef struct {
17*8e33eff8Schristos 	mtx_t		mtx;
18*8e33eff8Schristos 	unsigned	x;
19*8e33eff8Schristos } thd_start_arg_t;
20*8e33eff8Schristos 
21*8e33eff8Schristos static void *
22*8e33eff8Schristos thd_start(void *varg) {
23*8e33eff8Schristos 	thd_start_arg_t *arg = (thd_start_arg_t *)varg;
24*8e33eff8Schristos 	unsigned i;
25*8e33eff8Schristos 
26*8e33eff8Schristos 	for (i = 0; i < NINCRS; i++) {
27*8e33eff8Schristos 		mtx_lock(&arg->mtx);
28*8e33eff8Schristos 		arg->x++;
29*8e33eff8Schristos 		mtx_unlock(&arg->mtx);
30*8e33eff8Schristos 	}
31*8e33eff8Schristos 	return NULL;
32*8e33eff8Schristos }
33*8e33eff8Schristos 
34*8e33eff8Schristos TEST_BEGIN(test_mtx_race) {
35*8e33eff8Schristos 	thd_start_arg_t arg;
36*8e33eff8Schristos 	thd_t thds[NTHREADS];
37*8e33eff8Schristos 	unsigned i;
38*8e33eff8Schristos 
39*8e33eff8Schristos 	assert_false(mtx_init(&arg.mtx), "Unexpected mtx_init() failure");
40*8e33eff8Schristos 	arg.x = 0;
41*8e33eff8Schristos 	for (i = 0; i < NTHREADS; i++) {
42*8e33eff8Schristos 		thd_create(&thds[i], thd_start, (void *)&arg);
43*8e33eff8Schristos 	}
44*8e33eff8Schristos 	for (i = 0; i < NTHREADS; i++) {
45*8e33eff8Schristos 		thd_join(thds[i], NULL);
46*8e33eff8Schristos 	}
47*8e33eff8Schristos 	assert_u_eq(arg.x, NTHREADS * NINCRS,
48*8e33eff8Schristos 	    "Race-related counter corruption");
49*8e33eff8Schristos }
50*8e33eff8Schristos TEST_END
51*8e33eff8Schristos 
52*8e33eff8Schristos int
53*8e33eff8Schristos main(void) {
54*8e33eff8Schristos 	return test(
55*8e33eff8Schristos 	    test_mtx_basic,
56*8e33eff8Schristos 	    test_mtx_race);
57*8e33eff8Schristos }
58