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