diff options
author | Qi Wang <interwq@gwu.edu> | 2023-03-28 23:12:55 -0700 |
---|---|---|
committer | Qi Wang <interwq@gmail.com> | 2023-04-05 10:03:12 -0700 |
commit | 6cab460a45411316426fb44bd476214d6af36d47 (patch) | |
tree | 4b1902ddd030864af5f14dc28e1a713c8a211be4 | |
parent | 5266152d7922fc76fdaaa39ded9381a4fa7b4b9d (diff) | |
download | jemalloc-6cab460a45411316426fb44bd476214d6af36d47.tar.gz |
Add a multithreaded test for prof_sys_thread_name.
Verified that this catches the issue being fixed in 5fd5583.
-rw-r--r-- | test/unit/prof_sys_thread_name.c | 50 |
1 files changed, 49 insertions, 1 deletions
diff --git a/test/unit/prof_sys_thread_name.c b/test/unit/prof_sys_thread_name.c index affc788a..3aeb8cf1 100644 --- a/test/unit/prof_sys_thread_name.c +++ b/test/unit/prof_sys_thread_name.c @@ -3,6 +3,7 @@ #include "jemalloc/internal/prof_sys.h" static const char *test_thread_name = "test_name"; +static const char *dump_filename = "/dev/null"; static int test_prof_sys_thread_name_read_error(char *buf, size_t limit) { @@ -25,6 +26,7 @@ test_prof_sys_thread_name_read_clear(char *buf, size_t limit) { TEST_BEGIN(test_prof_sys_thread_name) { test_skip_if(!config_prof); + test_skip_if(!opt_prof_sys_thread_name); bool oldval; size_t sz = sizeof(oldval); @@ -44,6 +46,8 @@ TEST_BEGIN(test_prof_sys_thread_name) { assert_ptr_eq(thread_name, test_thread_name, "Thread name should not be touched"); + prof_sys_thread_name_read_t *orig_prof_sys_thread_name_read = + prof_sys_thread_name_read; prof_sys_thread_name_read = test_prof_sys_thread_name_read_error; void *p = malloc(1); free(p); @@ -67,11 +71,55 @@ TEST_BEGIN(test_prof_sys_thread_name) { "mallctl read for thread name should not fail"); expect_str_eq(thread_name, "", "Thread name should be updated if the " "system call returns a different name"); + + prof_sys_thread_name_read = orig_prof_sys_thread_name_read; +} +TEST_END + +#define ITER (16*1024) +static void * +thd_start(void *unused) { + /* Triggering samples which loads thread names. */ + for (unsigned i = 0; i < ITER; i++) { + void *p = mallocx(4096, 0); + assert_ptr_not_null(p, "Unexpected mallocx() failure"); + dallocx(p, 0); + } + + return NULL; +} + +TEST_BEGIN(test_prof_sys_thread_name_mt) { + test_skip_if(!config_prof); + test_skip_if(!opt_prof_sys_thread_name); + +#define NTHREADS 4 + thd_t thds[NTHREADS]; + unsigned thd_args[NTHREADS]; + unsigned i; + + for (i = 0; i < NTHREADS; i++) { + thd_args[i] = i; + thd_create(&thds[i], thd_start, (void *)&thd_args[i]); + } + /* Prof dump which reads the thread names. */ + for (i = 0; i < ITER; i++) { + expect_d_eq(mallctl("prof.dump", NULL, NULL, + (void *)&dump_filename, sizeof(dump_filename)), 0, + "Unexpected mallctl failure while dumping"); + } + + for (i = 0; i < NTHREADS; i++) { + thd_join(thds[i], NULL); + } } +#undef NTHREADS +#undef ITER TEST_END int main(void) { return test( - test_prof_sys_thread_name); + test_prof_sys_thread_name, + test_prof_sys_thread_name_mt); } |