mirror of
https://github.com/jemalloc/jemalloc.git
synced 2026-07-23 21:23:06 +00:00
Improve unit test coverage for jemalloc_init, arenas_management, and jemalloc_fork modules
This commit is contained in:
74
test/unit/jemalloc_init.c
Normal file
74
test/unit/jemalloc_init.c
Normal file
@@ -0,0 +1,74 @@
|
||||
#include "test/jemalloc_test.h"
|
||||
|
||||
#include "jemalloc/internal/jemalloc_init.h"
|
||||
|
||||
TEST_BEGIN(test_malloc_init_hard_idempotent) {
|
||||
expect_false(malloc_init_hard(),
|
||||
"malloc_init_hard should return false when already initialized");
|
||||
expect_true(malloc_initialized(),
|
||||
"malloc_initialized should still be true after re-calling "
|
||||
"malloc_init_hard");
|
||||
}
|
||||
TEST_END
|
||||
|
||||
TEST_BEGIN(test_malloc_initializer_set_idempotent_on_main) {
|
||||
test_skip_if(!malloc_is_initializer());
|
||||
|
||||
malloc_initializer_set();
|
||||
|
||||
expect_true(malloc_is_initializer(),
|
||||
"malloc_is_initializer should still be true after re-setting "
|
||||
"from the same thread");
|
||||
expect_true(malloc_initializer_is_set(),
|
||||
"malloc_initializer_is_set should still be true after re-setting");
|
||||
}
|
||||
TEST_END
|
||||
|
||||
#ifdef JEMALLOC_THREADED_INIT
|
||||
static atomic_b_t initializer_worker_done;
|
||||
static atomic_b_t initializer_worker_result;
|
||||
|
||||
static void *
|
||||
is_initializer_worker(void *unused) {
|
||||
atomic_store_b(&initializer_worker_result, malloc_is_initializer(),
|
||||
ATOMIC_RELEASE);
|
||||
atomic_store_b(&initializer_worker_done, true, ATOMIC_RELEASE);
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
TEST_BEGIN(test_malloc_is_initializer_false_in_worker) {
|
||||
#ifndef JEMALLOC_THREADED_INIT
|
||||
/*
|
||||
* Without JEMALLOC_THREADED_INIT (e.g. macOS), malloc_initializer
|
||||
* is a process-wide bool and malloc_is_initializer() returns true
|
||||
* for every thread after init. The per-thread distinction this
|
||||
* test exercises only exists in threaded-init builds.
|
||||
*/
|
||||
test_skip_if(true);
|
||||
#else
|
||||
test_skip_if(!malloc_is_initializer());
|
||||
|
||||
atomic_store_b(&initializer_worker_done, false, ATOMIC_RELEASE);
|
||||
atomic_store_b(&initializer_worker_result, false, ATOMIC_RELEASE);
|
||||
|
||||
thd_t thd;
|
||||
thd_create(&thd, is_initializer_worker, NULL);
|
||||
thd_join(thd, NULL);
|
||||
|
||||
expect_true(
|
||||
atomic_load_b(&initializer_worker_done, ATOMIC_ACQUIRE),
|
||||
"Worker should have completed");
|
||||
expect_false(
|
||||
atomic_load_b(&initializer_worker_result, ATOMIC_ACQUIRE),
|
||||
"malloc_is_initializer should be false in a non-init thread");
|
||||
#endif
|
||||
}
|
||||
TEST_END
|
||||
|
||||
int
|
||||
main(void) {
|
||||
return test(test_malloc_init_hard_idempotent,
|
||||
test_malloc_initializer_set_idempotent_on_main,
|
||||
test_malloc_is_initializer_false_in_worker);
|
||||
}
|
||||
Reference in New Issue
Block a user