Rename chunks_{cached,retained,mtx} to extents_{cached,retained,mtx}.
This commit is contained in:
parent
127026ad98
commit
c9a76481d8
@ -235,20 +235,20 @@ struct arena_s {
|
|||||||
malloc_mutex_t large_mtx;
|
malloc_mutex_t large_mtx;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Heaps of chunks that were previously allocated. These are used when
|
* Heaps of extents that were previously allocated. These are used when
|
||||||
* allocating chunks, in an attempt to re-use address space.
|
* allocating extents, in an attempt to re-use address space.
|
||||||
*/
|
*/
|
||||||
extent_heap_t chunks_cached[NPSIZES];
|
extent_heap_t extents_cached[NPSIZES];
|
||||||
extent_heap_t chunks_retained[NPSIZES];
|
extent_heap_t extents_retained[NPSIZES];
|
||||||
|
/* User-configurable extent hook functions. */
|
||||||
|
extent_hooks_t extent_hooks;
|
||||||
|
/* Protects extents_cached, extents_retained, and extent_hooks. */
|
||||||
|
malloc_mutex_t extents_mtx;
|
||||||
|
|
||||||
malloc_mutex_t chunks_mtx;
|
|
||||||
/* Cache of extent structures that were allocated via base_alloc(). */
|
/* Cache of extent structures that were allocated via base_alloc(). */
|
||||||
ql_head(extent_t) extent_cache;
|
ql_head(extent_t) extent_cache;
|
||||||
malloc_mutex_t extent_cache_mtx;
|
malloc_mutex_t extent_cache_mtx;
|
||||||
|
|
||||||
/* User-configurable extent hook functions. */
|
|
||||||
extent_hooks_t extent_hooks;
|
|
||||||
|
|
||||||
/* bins is used to store heaps of free regions. */
|
/* bins is used to store heaps of free regions. */
|
||||||
arena_bin_t bins[NBINS];
|
arena_bin_t bins[NBINS];
|
||||||
};
|
};
|
||||||
|
@ -24,7 +24,7 @@ typedef int witness_comp_t (const witness_t *, void *, const witness_t *,
|
|||||||
#define WITNESS_RANK_PROF_GCTX 7U
|
#define WITNESS_RANK_PROF_GCTX 7U
|
||||||
|
|
||||||
#define WITNESS_RANK_ARENA 8U
|
#define WITNESS_RANK_ARENA 8U
|
||||||
#define WITNESS_RANK_ARENA_CHUNKS 9U
|
#define WITNESS_RANK_ARENA_EXTENTS 9U
|
||||||
#define WITNESS_RANK_ARENA_EXTENT_CACHE 10
|
#define WITNESS_RANK_ARENA_EXTENT_CACHE 10
|
||||||
|
|
||||||
#define WITNESS_RANK_RTREE_ELM 11U
|
#define WITNESS_RANK_RTREE_ELM 11U
|
||||||
|
19
src/arena.c
19
src/arena.c
@ -1793,20 +1793,21 @@ arena_new(tsdn_t *tsdn, unsigned ind)
|
|||||||
return (NULL);
|
return (NULL);
|
||||||
|
|
||||||
for (i = 0; i < NPSIZES; i++) {
|
for (i = 0; i < NPSIZES; i++) {
|
||||||
extent_heap_new(&arena->chunks_cached[i]);
|
extent_heap_new(&arena->extents_cached[i]);
|
||||||
extent_heap_new(&arena->chunks_retained[i]);
|
extent_heap_new(&arena->extents_retained[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (malloc_mutex_init(&arena->chunks_mtx, "arena_chunks",
|
arena->extent_hooks = extent_hooks_default;
|
||||||
WITNESS_RANK_ARENA_CHUNKS))
|
|
||||||
|
if (malloc_mutex_init(&arena->extents_mtx, "arena_extents",
|
||||||
|
WITNESS_RANK_ARENA_EXTENTS))
|
||||||
return (NULL);
|
return (NULL);
|
||||||
|
|
||||||
ql_new(&arena->extent_cache);
|
ql_new(&arena->extent_cache);
|
||||||
if (malloc_mutex_init(&arena->extent_cache_mtx, "arena_extent_cache",
|
if (malloc_mutex_init(&arena->extent_cache_mtx, "arena_extent_cache",
|
||||||
WITNESS_RANK_ARENA_EXTENT_CACHE))
|
WITNESS_RANK_ARENA_EXTENT_CACHE))
|
||||||
return (NULL);
|
return (NULL);
|
||||||
|
|
||||||
arena->extent_hooks = extent_hooks_default;
|
|
||||||
|
|
||||||
/* Initialize bins. */
|
/* Initialize bins. */
|
||||||
for (i = 0; i < NBINS; i++) {
|
for (i = 0; i < NBINS; i++) {
|
||||||
arena_bin_t *bin = &arena->bins[i];
|
arena_bin_t *bin = &arena->bins[i];
|
||||||
@ -1843,7 +1844,7 @@ void
|
|||||||
arena_prefork1(tsdn_t *tsdn, arena_t *arena)
|
arena_prefork1(tsdn_t *tsdn, arena_t *arena)
|
||||||
{
|
{
|
||||||
|
|
||||||
malloc_mutex_prefork(tsdn, &arena->chunks_mtx);
|
malloc_mutex_prefork(tsdn, &arena->extents_mtx);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -1872,7 +1873,7 @@ arena_postfork_parent(tsdn_t *tsdn, arena_t *arena)
|
|||||||
for (i = 0; i < NBINS; i++)
|
for (i = 0; i < NBINS; i++)
|
||||||
malloc_mutex_postfork_parent(tsdn, &arena->bins[i].lock);
|
malloc_mutex_postfork_parent(tsdn, &arena->bins[i].lock);
|
||||||
malloc_mutex_postfork_parent(tsdn, &arena->extent_cache_mtx);
|
malloc_mutex_postfork_parent(tsdn, &arena->extent_cache_mtx);
|
||||||
malloc_mutex_postfork_parent(tsdn, &arena->chunks_mtx);
|
malloc_mutex_postfork_parent(tsdn, &arena->extents_mtx);
|
||||||
malloc_mutex_postfork_parent(tsdn, &arena->lock);
|
malloc_mutex_postfork_parent(tsdn, &arena->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1885,6 +1886,6 @@ arena_postfork_child(tsdn_t *tsdn, arena_t *arena)
|
|||||||
for (i = 0; i < NBINS; i++)
|
for (i = 0; i < NBINS; i++)
|
||||||
malloc_mutex_postfork_child(tsdn, &arena->bins[i].lock);
|
malloc_mutex_postfork_child(tsdn, &arena->bins[i].lock);
|
||||||
malloc_mutex_postfork_child(tsdn, &arena->extent_cache_mtx);
|
malloc_mutex_postfork_child(tsdn, &arena->extent_cache_mtx);
|
||||||
malloc_mutex_postfork_child(tsdn, &arena->chunks_mtx);
|
malloc_mutex_postfork_child(tsdn, &arena->extents_mtx);
|
||||||
malloc_mutex_postfork_child(tsdn, &arena->lock);
|
malloc_mutex_postfork_child(tsdn, &arena->lock);
|
||||||
}
|
}
|
||||||
|
32
src/chunk.c
32
src/chunk.c
@ -83,9 +83,9 @@ extent_hooks_get(tsdn_t *tsdn, arena_t *arena)
|
|||||||
{
|
{
|
||||||
extent_hooks_t extent_hooks;
|
extent_hooks_t extent_hooks;
|
||||||
|
|
||||||
malloc_mutex_lock(tsdn, &arena->chunks_mtx);
|
malloc_mutex_lock(tsdn, &arena->extents_mtx);
|
||||||
extent_hooks = extent_hooks_get_locked(arena);
|
extent_hooks = extent_hooks_get_locked(arena);
|
||||||
malloc_mutex_unlock(tsdn, &arena->chunks_mtx);
|
malloc_mutex_unlock(tsdn, &arena->extents_mtx);
|
||||||
|
|
||||||
return (extent_hooks);
|
return (extent_hooks);
|
||||||
}
|
}
|
||||||
@ -96,7 +96,7 @@ extent_hooks_set(tsdn_t *tsdn, arena_t *arena,
|
|||||||
{
|
{
|
||||||
extent_hooks_t old_extent_hooks;
|
extent_hooks_t old_extent_hooks;
|
||||||
|
|
||||||
malloc_mutex_lock(tsdn, &arena->chunks_mtx);
|
malloc_mutex_lock(tsdn, &arena->extents_mtx);
|
||||||
old_extent_hooks = arena->extent_hooks;
|
old_extent_hooks = arena->extent_hooks;
|
||||||
/*
|
/*
|
||||||
* Copy each field atomically so that it is impossible for readers to
|
* Copy each field atomically so that it is impossible for readers to
|
||||||
@ -121,7 +121,7 @@ extent_hooks_set(tsdn_t *tsdn, arena_t *arena,
|
|||||||
ATOMIC_COPY_HOOK(split);
|
ATOMIC_COPY_HOOK(split);
|
||||||
ATOMIC_COPY_HOOK(merge);
|
ATOMIC_COPY_HOOK(merge);
|
||||||
#undef ATOMIC_COPY_HOOK
|
#undef ATOMIC_COPY_HOOK
|
||||||
malloc_mutex_unlock(tsdn, &arena->chunks_mtx);
|
malloc_mutex_unlock(tsdn, &arena->extents_mtx);
|
||||||
|
|
||||||
return (old_extent_hooks);
|
return (old_extent_hooks);
|
||||||
}
|
}
|
||||||
@ -330,7 +330,7 @@ chunk_recycle(tsdn_t *tsdn, arena_t *arena, extent_hooks_t *extent_hooks,
|
|||||||
/* Beware size_t wrap-around. */
|
/* Beware size_t wrap-around. */
|
||||||
if (alloc_size < usize)
|
if (alloc_size < usize)
|
||||||
return (NULL);
|
return (NULL);
|
||||||
malloc_mutex_lock(tsdn, &arena->chunks_mtx);
|
malloc_mutex_lock(tsdn, &arena->extents_mtx);
|
||||||
extent_hooks_assure_initialized_locked(tsdn, arena, extent_hooks);
|
extent_hooks_assure_initialized_locked(tsdn, arena, extent_hooks);
|
||||||
if (new_addr != NULL) {
|
if (new_addr != NULL) {
|
||||||
rtree_elm_t *elm;
|
rtree_elm_t *elm;
|
||||||
@ -350,7 +350,7 @@ chunk_recycle(tsdn_t *tsdn, arena_t *arena, extent_hooks_t *extent_hooks,
|
|||||||
extent = chunk_first_best_fit(arena, extent_heaps, alloc_size);
|
extent = chunk_first_best_fit(arena, extent_heaps, alloc_size);
|
||||||
if (extent == NULL || (new_addr != NULL && extent_size_get(extent) <
|
if (extent == NULL || (new_addr != NULL && extent_size_get(extent) <
|
||||||
size)) {
|
size)) {
|
||||||
malloc_mutex_unlock(tsdn, &arena->chunks_mtx);
|
malloc_mutex_unlock(tsdn, &arena->extents_mtx);
|
||||||
return (NULL);
|
return (NULL);
|
||||||
}
|
}
|
||||||
extent_heaps_remove(extent_heaps, extent);
|
extent_heaps_remove(extent_heaps, extent);
|
||||||
@ -373,7 +373,7 @@ chunk_recycle(tsdn_t *tsdn, arena_t *arena, extent_hooks_t *extent_hooks,
|
|||||||
leadsize, leadsize, size + trailsize, usize + trailsize);
|
leadsize, leadsize, size + trailsize, usize + trailsize);
|
||||||
if (extent == NULL) {
|
if (extent == NULL) {
|
||||||
chunk_leak(tsdn, arena, extent_hooks, cache, lead);
|
chunk_leak(tsdn, arena, extent_hooks, cache, lead);
|
||||||
malloc_mutex_unlock(tsdn, &arena->chunks_mtx);
|
malloc_mutex_unlock(tsdn, &arena->extents_mtx);
|
||||||
return (NULL);
|
return (NULL);
|
||||||
}
|
}
|
||||||
extent_heaps_insert(extent_heaps, lead);
|
extent_heaps_insert(extent_heaps, lead);
|
||||||
@ -386,7 +386,7 @@ chunk_recycle(tsdn_t *tsdn, arena_t *arena, extent_hooks_t *extent_hooks,
|
|||||||
extent, size, usize, trailsize, trailsize);
|
extent, size, usize, trailsize, trailsize);
|
||||||
if (trail == NULL) {
|
if (trail == NULL) {
|
||||||
chunk_leak(tsdn, arena, extent_hooks, cache, extent);
|
chunk_leak(tsdn, arena, extent_hooks, cache, extent);
|
||||||
malloc_mutex_unlock(tsdn, &arena->chunks_mtx);
|
malloc_mutex_unlock(tsdn, &arena->extents_mtx);
|
||||||
return (NULL);
|
return (NULL);
|
||||||
}
|
}
|
||||||
extent_heaps_insert(extent_heaps, trail);
|
extent_heaps_insert(extent_heaps, trail);
|
||||||
@ -402,7 +402,7 @@ chunk_recycle(tsdn_t *tsdn, arena_t *arena, extent_hooks_t *extent_hooks,
|
|||||||
if (!extent_committed_get(extent) &&
|
if (!extent_committed_get(extent) &&
|
||||||
extent_hooks->commit(extent_base_get(extent),
|
extent_hooks->commit(extent_base_get(extent),
|
||||||
extent_size_get(extent), 0, extent_size_get(extent), arena->ind)) {
|
extent_size_get(extent), 0, extent_size_get(extent), arena->ind)) {
|
||||||
malloc_mutex_unlock(tsdn, &arena->chunks_mtx);
|
malloc_mutex_unlock(tsdn, &arena->extents_mtx);
|
||||||
chunk_record(tsdn, arena, extent_hooks, extent_heaps, cache,
|
chunk_record(tsdn, arena, extent_hooks, extent_heaps, cache,
|
||||||
extent);
|
extent);
|
||||||
return (NULL);
|
return (NULL);
|
||||||
@ -416,7 +416,7 @@ chunk_recycle(tsdn_t *tsdn, arena_t *arena, extent_hooks_t *extent_hooks,
|
|||||||
chunk_interior_register(tsdn, extent);
|
chunk_interior_register(tsdn, extent);
|
||||||
}
|
}
|
||||||
|
|
||||||
malloc_mutex_unlock(tsdn, &arena->chunks_mtx);
|
malloc_mutex_unlock(tsdn, &arena->extents_mtx);
|
||||||
|
|
||||||
if (*zero) {
|
if (*zero) {
|
||||||
if (!extent_zeroed_get(extent)) {
|
if (!extent_zeroed_get(extent)) {
|
||||||
@ -480,7 +480,7 @@ chunk_alloc_cache(tsdn_t *tsdn, arena_t *arena, extent_hooks_t *extent_hooks,
|
|||||||
assert(alignment != 0);
|
assert(alignment != 0);
|
||||||
|
|
||||||
commit = true;
|
commit = true;
|
||||||
extent = chunk_recycle(tsdn, arena, extent_hooks, arena->chunks_cached,
|
extent = chunk_recycle(tsdn, arena, extent_hooks, arena->extents_cached,
|
||||||
true, new_addr, usize, pad, alignment, zero, &commit, slab);
|
true, new_addr, usize, pad, alignment, zero, &commit, slab);
|
||||||
if (extent == NULL)
|
if (extent == NULL)
|
||||||
return (NULL);
|
return (NULL);
|
||||||
@ -531,7 +531,7 @@ chunk_alloc_retained(tsdn_t *tsdn, arena_t *arena, extent_hooks_t *extent_hooks,
|
|||||||
assert(alignment != 0);
|
assert(alignment != 0);
|
||||||
|
|
||||||
extent = chunk_recycle(tsdn, arena, extent_hooks,
|
extent = chunk_recycle(tsdn, arena, extent_hooks,
|
||||||
arena->chunks_retained, false, new_addr, usize, pad, alignment,
|
arena->extents_retained, false, new_addr, usize, pad, alignment,
|
||||||
zero, commit, slab);
|
zero, commit, slab);
|
||||||
if (extent != NULL && config_stats) {
|
if (extent != NULL && config_stats) {
|
||||||
size_t size = usize + pad;
|
size_t size = usize + pad;
|
||||||
@ -640,7 +640,7 @@ chunk_record(tsdn_t *tsdn, arena_t *arena, extent_hooks_t *extent_hooks,
|
|||||||
|
|
||||||
assert(!cache || !extent_zeroed_get(extent));
|
assert(!cache || !extent_zeroed_get(extent));
|
||||||
|
|
||||||
malloc_mutex_lock(tsdn, &arena->chunks_mtx);
|
malloc_mutex_lock(tsdn, &arena->extents_mtx);
|
||||||
extent_hooks_assure_initialized_locked(tsdn, arena, extent_hooks);
|
extent_hooks_assure_initialized_locked(tsdn, arena, extent_hooks);
|
||||||
|
|
||||||
extent_usize_set(extent, 0);
|
extent_usize_set(extent, 0);
|
||||||
@ -671,7 +671,7 @@ chunk_record(tsdn_t *tsdn, arena_t *arena, extent_hooks_t *extent_hooks,
|
|||||||
extent_heaps, cache);
|
extent_heaps, cache);
|
||||||
}
|
}
|
||||||
|
|
||||||
malloc_mutex_unlock(tsdn, &arena->chunks_mtx);
|
malloc_mutex_unlock(tsdn, &arena->extents_mtx);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -685,7 +685,7 @@ chunk_dalloc_cache(tsdn_t *tsdn, arena_t *arena, extent_hooks_t *extent_hooks,
|
|||||||
extent_addr_set(extent, extent_base_get(extent));
|
extent_addr_set(extent, extent_base_get(extent));
|
||||||
extent_zeroed_set(extent, false);
|
extent_zeroed_set(extent, false);
|
||||||
|
|
||||||
chunk_record(tsdn, arena, extent_hooks, arena->chunks_cached, true,
|
chunk_record(tsdn, arena, extent_hooks, arena->extents_cached, true,
|
||||||
extent);
|
extent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -732,7 +732,7 @@ chunk_dalloc_wrapper(tsdn_t *tsdn, arena_t *arena, extent_hooks_t *extent_hooks,
|
|||||||
if (config_stats)
|
if (config_stats)
|
||||||
arena->stats.retained += extent_size_get(extent);
|
arena->stats.retained += extent_size_get(extent);
|
||||||
|
|
||||||
chunk_record(tsdn, arena, extent_hooks, arena->chunks_retained, false,
|
chunk_record(tsdn, arena, extent_hooks, arena->extents_retained, false,
|
||||||
extent);
|
extent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user