Jason Evans | 0f4f1ef | 2013-12-12 14:41:02 -0800 | [diff] [blame] | 1 | #include "test/jemalloc_test.h" |
| 2 | |
| 3 | #define NTHREADS 2 |
| 4 | #define NINCRS 2000000 |
| 5 | |
| 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 * |
| 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 | |
| 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 |
| 54 | main(void) |
| 55 | { |
| 56 | |
| 57 | return (test( |
| 58 | test_mtx_basic, |
| 59 | test_mtx_race)); |
| 60 | } |