summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQi Wang <interwq@gwu.edu>2017-12-08 23:06:08 (GMT)
committerQi Wang <interwq@gmail.com>2017-12-09 06:22:03 (GMT)
commit955b1d9cc574647d3d3dfb474b47b51b3a81453d (patch)
tree9b00375493ffcb3c0ec322c4eb688ee57f3f1d1f
parentb5ab3f91ea60b16819563b09aa01a0d339aa40b4 (diff)
downloadjemalloc-955b1d9cc574647d3d3dfb474b47b51b3a81453d.zip
jemalloc-955b1d9cc574647d3d3dfb474b47b51b3a81453d.tar.gz
jemalloc-955b1d9cc574647d3d3dfb474b47b51b3a81453d.tar.bz2
Fix extent deregister on the leak path.
On leak path we should not adjust gdump when deregister.
-rw-r--r--src/extent.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/extent.c b/src/extent.c
index 7e10b7f..c531da2 100644
--- a/src/extent.c
+++ b/src/extent.c
@@ -761,7 +761,7 @@ extent_interior_deregister(tsdn_t *tsdn, rtree_ctx_t *rtree_ctx,
* Removes all pointers to the given extent from the global rtree.
*/
static void
-extent_deregister(tsdn_t *tsdn, extent_t *extent) {
+extent_deregister_impl(tsdn_t *tsdn, extent_t *extent, bool gdump) {
rtree_ctx_t rtree_ctx_fallback;
rtree_ctx_t *rtree_ctx = tsdn_rtree_ctx(tsdn, &rtree_ctx_fallback);
rtree_leaf_elm_t *elm_a, *elm_b;
@@ -778,11 +778,21 @@ extent_deregister(tsdn_t *tsdn, extent_t *extent) {
extent_unlock(tsdn, extent);
- if (config_prof) {
+ if (config_prof && gdump) {
extent_gdump_sub(tsdn, extent);
}
}
+static void
+extent_deregister(tsdn_t *tsdn, extent_t *extent) {
+ extent_deregister_impl(tsdn, extent, true);
+}
+
+static void
+extent_deregister_no_gdump_sub(tsdn_t *tsdn, extent_t *extent) {
+ extent_deregister_impl(tsdn, extent, false);
+}
+
/*
* Tries to find and remove an extent from extents that can be used for the
* given allocation request.
@@ -989,7 +999,7 @@ extent_recycle_split(tsdn_t *tsdn, arena_t *arena,
}
if (to_leak != NULL) {
void *leak = extent_base_get(to_leak);
- extent_deregister(tsdn, to_leak);
+ extent_deregister_no_gdump_sub(tsdn, to_leak);
extents_leak(tsdn, arena, r_extent_hooks, extents,
to_leak, growing_retained);
assert(extent_lock_from_addr(tsdn, rtree_ctx, leak)
@@ -1267,7 +1277,7 @@ extent_grow_retained(tsdn_t *tsdn, arena_t *arena,
*/
assert(result == extent_split_interior_error);
if (to_leak != NULL) {
- extent_deregister(tsdn, to_leak);
+ extent_deregister_no_gdump_sub(tsdn, to_leak);
extents_leak(tsdn, arena, r_extent_hooks,
&arena->extents_retained, to_leak, true);
goto label_err;