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