summaryrefslogtreecommitdiffstats
path: root/src/arena.c
diff options
context:
space:
mode:
authorJason Evans <jasone@canonware.com>2016-11-15 18:31:06 (GMT)
committerJason Evans <jasone@canonware.com>2016-11-15 18:34:02 (GMT)
commitc0a667112cf33968b425dfbb50594aba54ea850b (patch)
treeb2439b243e9e4bcf5f44d5b66a47ed5f538d571d /src/arena.c
parenta2e601a2236315fb6f994ff364ea442ed0aed07b (diff)
downloadjemalloc-c0a667112cf33968b425dfbb50594aba54ea850b.zip
jemalloc-c0a667112cf33968b425dfbb50594aba54ea850b.tar.gz
jemalloc-c0a667112cf33968b425dfbb50594aba54ea850b.tar.bz2
Fix arena_reset() crashing bug.
This regression was caused by 498856f44a30b31fe713a18eb2fc7c6ecf3a9f63 (Move slabs out of chunks.).
Diffstat (limited to 'src/arena.c')
-rw-r--r--src/arena.c83
1 files changed, 42 insertions, 41 deletions
diff --git a/src/arena.c b/src/arena.c
index ff7b0cd..ef374d3 100644
--- a/src/arena.c
+++ b/src/arena.c
@@ -799,6 +799,47 @@ arena_slab_dalloc(tsdn_t *tsdn, arena_t *arena, extent_t *slab)
arena_extent_cache_dalloc_locked(tsdn, arena, &extent_hooks, slab);
}
+static void
+arena_bin_slabs_nonfull_insert(arena_bin_t *bin, extent_t *slab)
+{
+
+ assert(extent_slab_data_get(slab)->nfree > 0);
+ extent_heap_insert(&bin->slabs_nonfull, slab);
+}
+
+static void
+arena_bin_slabs_nonfull_remove(arena_bin_t *bin, extent_t *slab)
+{
+
+ extent_heap_remove(&bin->slabs_nonfull, slab);
+}
+
+static extent_t *
+arena_bin_slabs_nonfull_tryget(arena_bin_t *bin)
+{
+ extent_t *slab = extent_heap_remove_first(&bin->slabs_nonfull);
+ if (slab == NULL)
+ return (NULL);
+ if (config_stats)
+ bin->stats.reslabs++;
+ return (slab);
+}
+
+static void
+arena_bin_slabs_full_insert(arena_bin_t *bin, extent_t *slab)
+{
+
+ assert(extent_slab_data_get(slab)->nfree == 0);
+ extent_ring_insert(&bin->slabs_full, slab);
+}
+
+static void
+arena_bin_slabs_full_remove(extent_t *slab)
+{
+
+ extent_ring_remove(slab);
+}
+
void
arena_reset(tsd_t *tsd, arena_t *arena)
{
@@ -863,6 +904,7 @@ arena_reset(tsd_t *tsd, arena_t *arena)
for (slab = qr_next(&bin->slabs_full, qr_link); slab !=
&bin->slabs_full; slab = qr_next(&bin->slabs_full,
qr_link)) {
+ arena_bin_slabs_full_remove(slab);
malloc_mutex_unlock(tsd_tsdn(tsd), &bin->lock);
arena_slab_dalloc(tsd_tsdn(tsd), arena, slab);
malloc_mutex_lock(tsd_tsdn(tsd), &bin->lock);
@@ -880,47 +922,6 @@ arena_reset(tsd_t *tsd, arena_t *arena)
malloc_mutex_unlock(tsd_tsdn(tsd), &arena->lock);
}
-static void
-arena_bin_slabs_nonfull_insert(arena_bin_t *bin, extent_t *slab)
-{
-
- assert(extent_slab_data_get(slab)->nfree > 0);
- extent_heap_insert(&bin->slabs_nonfull, slab);
-}
-
-static void
-arena_bin_slabs_nonfull_remove(arena_bin_t *bin, extent_t *slab)
-{
-
- extent_heap_remove(&bin->slabs_nonfull, slab);
-}
-
-static extent_t *
-arena_bin_slabs_nonfull_tryget(arena_bin_t *bin)
-{
- extent_t *slab = extent_heap_remove_first(&bin->slabs_nonfull);
- if (slab == NULL)
- return (NULL);
- if (config_stats)
- bin->stats.reslabs++;
- return (slab);
-}
-
-static void
-arena_bin_slabs_full_insert(arena_bin_t *bin, extent_t *slab)
-{
-
- assert(extent_slab_data_get(slab)->nfree == 0);
- extent_ring_insert(&bin->slabs_full, slab);
-}
-
-static void
-arena_bin_slabs_full_remove(extent_t *slab)
-{
-
- extent_ring_remove(slab);
-}
-
static extent_t *
arena_slab_alloc_hard(tsdn_t *tsdn, arena_t *arena,
extent_hooks_t **r_extent_hooks, const arena_bin_info_t *bin_info)