diff options
author | Jason Evans <jasone@canonware.com> | 2015-09-15 06:44:37 (GMT) |
---|---|---|
committer | Jason Evans <jasone@canonware.com> | 2015-09-15 06:57:52 (GMT) |
commit | ea8d97b8978a0c0423f0ed64332463a25b787c3d (patch) | |
tree | 5cdc94849fabee68f3ee003981406d24462b60c7 | |
parent | 23f6e103c871b4db5b315caf1a8d5c46d9675691 (diff) | |
download | jemalloc-ea8d97b8978a0c0423f0ed64332463a25b787c3d.zip jemalloc-ea8d97b8978a0c0423f0ed64332463a25b787c3d.tar.gz jemalloc-ea8d97b8978a0c0423f0ed64332463a25b787c3d.tar.bz2 |
Fix prof_{malloc,free}_sample_object() call order in prof_realloc().
Fix prof_realloc() to call prof_free_sampled_object() after calling
prof_malloc_sample_object(). Prior to this fix, if tctx and old_tctx
were the same, the tctx could have been prematurely destroyed.
-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | include/jemalloc/internal/prof.h | 11 |
2 files changed, 11 insertions, 3 deletions
@@ -35,6 +35,9 @@ brevity. Much more detail can be found in the git revision history: allocation events against concurrent prof_active changes. - Fix ixallocx_prof() to pass usize_max and zero to ixallocx_prof_sample() in the correct order. + - Fix prof_realloc() to call prof_free_sampled_object() after calling + prof_malloc_sample_object(). Prior to this fix, if tctx and old_tctx were + the same, the tctx could have been prematurely destroyed. * 4.0.0 (August 17, 2015) diff --git a/include/jemalloc/internal/prof.h b/include/jemalloc/internal/prof.h index c66611c..5eb5926 100644 --- a/include/jemalloc/internal/prof.h +++ b/include/jemalloc/internal/prof.h @@ -483,6 +483,7 @@ JEMALLOC_ALWAYS_INLINE void prof_realloc(tsd_t *tsd, const void *ptr, size_t usize, prof_tctx_t *tctx, bool prof_active, bool updated, size_t old_usize, prof_tctx_t *old_tctx) { + bool sampled, old_sampled; cassert(config_prof); assert(ptr != NULL || (uintptr_t)tctx <= (uintptr_t)1U); @@ -501,12 +502,16 @@ prof_realloc(tsd_t *tsd, const void *ptr, size_t usize, prof_tctx_t *tctx, } } - if (unlikely((uintptr_t)old_tctx > (uintptr_t)1U)) - prof_free_sampled_object(tsd, old_usize, old_tctx); - if (unlikely((uintptr_t)tctx > (uintptr_t)1U)) + sampled = ((uintptr_t)tctx > (uintptr_t)1U); + old_sampled = ((uintptr_t)old_tctx > (uintptr_t)1U); + + if (unlikely(sampled)) prof_malloc_sample_object(ptr, usize, tctx); else prof_tctx_set(ptr, usize, (prof_tctx_t *)(uintptr_t)1U); + + if (unlikely(old_sampled)) + prof_free_sampled_object(tsd, old_usize, old_tctx); } JEMALLOC_ALWAYS_INLINE void |