diff options
author | Jason Evans <jasone@canonware.com> | 2014-01-22 19:11:22 (GMT) |
---|---|---|
committer | Jason Evans <jasone@canonware.com> | 2014-01-22 19:11:22 (GMT) |
commit | cc47dde16203a6ae7eb685b53e1ae501f3869bc6 (patch) | |
tree | 74e81d65651b2ca7e294a857797dda6635177454 /test/unit/mtx.c | |
parent | 0135fb806e4137dc9cdf152541926a2bc95e33f0 (diff) | |
parent | 798a48103014aabf8afb3d7efff90399a466dd8c (diff) | |
download | jemalloc-cc47dde16203a6ae7eb685b53e1ae501f3869bc6.zip jemalloc-cc47dde16203a6ae7eb685b53e1ae501f3869bc6.tar.gz jemalloc-cc47dde16203a6ae7eb685b53e1ae501f3869bc6.tar.bz2 |
Merge branch 'dev'3.5.0
Diffstat (limited to 'test/unit/mtx.c')
-rw-r--r-- | test/unit/mtx.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/test/unit/mtx.c b/test/unit/mtx.c new file mode 100644 index 0000000..96ff694 --- /dev/null +++ b/test/unit/mtx.c @@ -0,0 +1,60 @@ +#include "test/jemalloc_test.h" + +#define NTHREADS 2 +#define NINCRS 2000000 + +TEST_BEGIN(test_mtx_basic) +{ + mtx_t mtx; + + assert_false(mtx_init(&mtx), "Unexpected mtx_init() failure"); + mtx_lock(&mtx); + mtx_unlock(&mtx); + mtx_fini(&mtx); +} +TEST_END + +typedef struct { + mtx_t mtx; + unsigned x; +} thd_start_arg_t; + +static void * +thd_start(void *varg) +{ + thd_start_arg_t *arg = (thd_start_arg_t *)varg; + unsigned i; + + for (i = 0; i < NINCRS; i++) { + mtx_lock(&arg->mtx); + arg->x++; + mtx_unlock(&arg->mtx); + } + return (NULL); +} + +TEST_BEGIN(test_mtx_race) +{ + thd_start_arg_t arg; + thd_t thds[NTHREADS]; + unsigned i; + + assert_false(mtx_init(&arg.mtx), "Unexpected mtx_init() failure"); + arg.x = 0; + for (i = 0; i < NTHREADS; i++) + thd_create(&thds[i], thd_start, (void *)&arg); + for (i = 0; i < NTHREADS; i++) + thd_join(thds[i], NULL); + assert_u_eq(arg.x, NTHREADS * NINCRS, + "Race-related counter corruption"); +} +TEST_END + +int +main(void) +{ + + return (test( + test_mtx_basic, + test_mtx_race)); +} |