diff options
author | Qi Wang <interwq@gwu.edu> | 2017-11-28 20:21:58 (GMT) |
---|---|---|
committer | Qi Wang <interwq@gmail.com> | 2017-11-29 05:52:49 (GMT) |
commit | 6e841f618a5ff99001a9578e9ff73602e7a94620 (patch) | |
tree | 3fccd527d356ec8967f95e84ad78b8b275f9900b | |
parent | 26a8f82c484eada4188e56daad32ed6a16b4b585 (diff) | |
download | jemalloc-6e841f618a5ff99001a9578e9ff73602e7a94620.zip jemalloc-6e841f618a5ff99001a9578e9ff73602e7a94620.tar.gz jemalloc-6e841f618a5ff99001a9578e9ff73602e7a94620.tar.bz2 |
Add more tests for extent hooks failure paths.
-rw-r--r-- | src/extent.c | 3 | ||||
-rw-r--r-- | test/include/test/extent_hooks.h | 2 | ||||
-rw-r--r-- | test/integration/extent.c | 23 |
3 files changed, 25 insertions, 3 deletions
diff --git a/src/extent.c b/src/extent.c index ee50aff..7e10b7f 100644 --- a/src/extent.c +++ b/src/extent.c @@ -988,9 +988,12 @@ extent_recycle_split(tsdn_t *tsdn, arena_t *arena, extent_deregister(tsdn, to_salvage); } if (to_leak != NULL) { + void *leak = extent_base_get(to_leak); extent_deregister(tsdn, to_leak); extents_leak(tsdn, arena, r_extent_hooks, extents, to_leak, growing_retained); + assert(extent_lock_from_addr(tsdn, rtree_ctx, leak) + == NULL); } return NULL; } diff --git a/test/include/test/extent_hooks.h b/test/include/test/extent_hooks.h index ea01285..1f06201 100644 --- a/test/include/test/extent_hooks.h +++ b/test/include/test/extent_hooks.h @@ -266,6 +266,8 @@ extent_merge_hook(extent_hooks_t *extent_hooks, void *addr_a, size_t size_a, "extent_hooks should be same as pointer used to set hooks"); assert_ptr_eq(extent_hooks->merge, extent_merge_hook, "Wrong hook function"); + assert_ptr_eq((void *)((uintptr_t)addr_a + size_a), addr_b, + "Extents not mergeable"); called_merge = true; if (!try_merge) { return true; diff --git a/test/integration/extent.c b/test/integration/extent.c index 1dcf217..7100b6a 100644 --- a/test/integration/extent.c +++ b/test/integration/extent.c @@ -98,7 +98,8 @@ test_extent_body(unsigned arena_ind) { dallocx(p, flags); } -TEST_BEGIN(test_extent_manual_hook) { +static void +test_manual_hook_body(void) { unsigned arena_ind; size_t old_size, new_size, sz; size_t hooks_mib[3]; @@ -139,8 +140,9 @@ TEST_BEGIN(test_extent_manual_hook) { assert_ptr_ne(old_hooks->merge, extent_merge_hook, "Unexpected extent_hooks error"); - test_skip_if(check_background_thread_enabled()); - test_extent_body(arena_ind); + if (check_background_thread_enabled()) { + test_extent_body(arena_ind); + } /* Restore extent hooks. */ assert_d_eq(mallctlbymib(hooks_mib, hooks_miblen, NULL, NULL, @@ -165,6 +167,21 @@ TEST_BEGIN(test_extent_manual_hook) { assert_ptr_eq(old_hooks->merge, default_hooks->merge, "Unexpected extent_hooks error"); } + +TEST_BEGIN(test_extent_manual_hook) { + test_manual_hook_body(); + + /* Test failure paths. */ + try_split = false; + test_manual_hook_body(); + try_merge = false; + test_manual_hook_body(); + try_purge_lazy = false; + try_purge_forced = false; + test_manual_hook_body(); + + try_split = try_merge = try_purge_lazy = try_purge_forced = true; +} TEST_END TEST_BEGIN(test_extent_auto_hook) { |