Simplify extent_node_t and add extent_node_init().

This commit is contained in:
Jason Evans 2015-02-17 15:13:52 -08:00
parent ee41ad409a
commit a4e1888d1a
6 changed files with 38 additions and 42 deletions

View File

@ -30,19 +30,12 @@ struct extent_node_s {
*/ */
bool en_achunk; bool en_achunk;
union {
/* Profile counters, used for huge objects. */ /* Profile counters, used for huge objects. */
prof_tctx_t *en_prof_tctx; prof_tctx_t *en_prof_tctx;
struct { /* Linkage for arena's runs_dirty and chunks_dirty rings. */
/*
* Linkage for arena's runs_dirty and chunks_dirty
* rings.
*/
qr(extent_node_t) cd_link; qr(extent_node_t) cd_link;
arena_chunk_map_misc_t runs_dirty; arena_chunk_map_misc_t runs_dirty;
};
};
union { union {
/* Linkage for the size/address-ordered tree. */ /* Linkage for the size/address-ordered tree. */
@ -82,6 +75,8 @@ void extent_node_size_set(extent_node_t *node, size_t size);
void extent_node_zeroed_set(extent_node_t *node, bool zeroed); void extent_node_zeroed_set(extent_node_t *node, bool zeroed);
void extent_node_achunk_set(extent_node_t *node, bool achunk); void extent_node_achunk_set(extent_node_t *node, bool achunk);
void extent_node_prof_tctx_set(extent_node_t *node, prof_tctx_t *tctx); void extent_node_prof_tctx_set(extent_node_t *node, prof_tctx_t *tctx);
void extent_node_init(extent_node_t *node, arena_t *arena, void *addr,
size_t size, bool zeroed);
#endif #endif
#if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_EXTENT_C_)) #if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_EXTENT_C_))
@ -168,6 +163,20 @@ extent_node_prof_tctx_set(extent_node_t *node, prof_tctx_t *tctx)
node->en_prof_tctx = tctx; node->en_prof_tctx = tctx;
} }
JEMALLOC_INLINE void
extent_node_init(extent_node_t *node, arena_t *arena, void *addr, size_t size,
bool zeroed)
{
extent_node_arena_set(node, arena);
extent_node_addr_set(node, addr);
extent_node_size_set(node, size);
extent_node_zeroed_set(node, zeroed);
extent_node_achunk_set(node, false);
if (config_prof)
extent_node_prof_tctx_set(node, NULL);
}
#endif #endif
#endif /* JEMALLOC_H_INLINES */ #endif /* JEMALLOC_H_INLINES */

View File

@ -182,6 +182,7 @@ extent_node_addr_get
extent_node_addr_set extent_node_addr_set
extent_node_arena_get extent_node_arena_get
extent_node_arena_set extent_node_arena_set
extent_node_init
extent_node_prof_tctx_get extent_node_prof_tctx_get
extent_node_prof_tctx_set extent_node_prof_tctx_set
extent_node_size_get extent_node_size_get

View File

@ -465,9 +465,7 @@ arena_chunk_alloc_internal(arena_t *arena, bool *zero)
chunk = (arena_chunk_t *)chunk_alloc_arena(chunk_alloc, chunk_dalloc, chunk = (arena_chunk_t *)chunk_alloc_arena(chunk_alloc, chunk_dalloc,
arena->ind, NULL, chunksize, chunksize, zero); arena->ind, NULL, chunksize, chunksize, zero);
if (chunk != NULL) { if (chunk != NULL) {
extent_node_arena_set(&chunk->node, arena); extent_node_init(&chunk->node, arena, chunk, chunksize, *zero);
extent_node_addr_set(&chunk->node, chunk);
extent_node_size_set(&chunk->node, chunksize);
extent_node_achunk_set(&chunk->node, true); extent_node_achunk_set(&chunk->node, true);
if (chunk_register(chunk, &chunk->node)) { if (chunk_register(chunk, &chunk->node)) {
chunk_dalloc((void *)chunk, chunksize, arena->ind); chunk_dalloc((void *)chunk, chunksize, arena->ind);
@ -1055,10 +1053,7 @@ arena_stash_dirty(arena_t *arena, bool all, size_t npurge,
* just cached a node. * just cached a node.
*/ */
assert(tnode != NULL); assert(tnode != NULL);
extent_node_arena_set(tnode, arena); extent_node_init(tnode, arena, addr, size, zeroed);
extent_node_addr_set(tnode, addr);
extent_node_size_set(tnode, size);
extent_node_zeroed_set(tnode, zeroed);
arena_chunk_dirty_node_init(tnode); arena_chunk_dirty_node_init(tnode);
/* Stash. */ /* Stash. */
arena_chunk_dirty_insert(purge_runs_sentinel, arena_chunk_dirty_insert(purge_runs_sentinel,

View File

@ -60,8 +60,7 @@ base_chunk_alloc(size_t minsize)
if (config_stats) if (config_stats)
base_allocated += nsize; base_allocated += nsize;
} }
extent_node_addr_set(node, addr); extent_node_init(node, NULL, addr, csize, true);
extent_node_size_set(node, csize);
return (node); return (node);
} }
@ -84,8 +83,7 @@ base_alloc(size_t size)
*/ */
csize = CACHELINE_CEILING(size); csize = CACHELINE_CEILING(size);
extent_node_addr_set(&key, NULL); extent_node_init(&key, NULL, NULL, csize, false);
extent_node_size_set(&key, csize);
malloc_mutex_lock(&base_mtx); malloc_mutex_lock(&base_mtx);
node = extent_tree_szad_nsearch(&base_avail_szad, &key); node = extent_tree_szad_nsearch(&base_avail_szad, &key);
if (node != NULL) { if (node != NULL) {

View File

@ -79,8 +79,7 @@ chunk_recycle(arena_t *arena, extent_tree_t *chunks_szad,
/* Beware size_t wrap-around. */ /* Beware size_t wrap-around. */
if (alloc_size < size) if (alloc_size < size)
return (NULL); return (NULL);
extent_node_addr_set(&key, new_addr); extent_node_init(&key, arena, new_addr, alloc_size, false);
extent_node_size_set(&key, alloc_size);
malloc_mutex_lock(&arena->chunks_mtx); malloc_mutex_lock(&arena->chunks_mtx);
node = (new_addr != NULL) ? extent_tree_ad_search(chunks_ad, &key) : node = (new_addr != NULL) ? extent_tree_ad_search(chunks_ad, &key) :
extent_tree_szad_nsearch(chunks_szad, &key); extent_tree_szad_nsearch(chunks_szad, &key);
@ -121,9 +120,8 @@ chunk_recycle(arena_t *arena, extent_tree_t *chunks_szad,
return (NULL); return (NULL);
} }
} }
extent_node_addr_set(node, (void *)((uintptr_t)(ret) + size)); extent_node_init(node, arena, (void *)((uintptr_t)(ret) + size),
extent_node_size_set(node, trailsize); trailsize, zeroed);
extent_node_zeroed_set(node, zeroed);
extent_tree_szad_insert(chunks_szad, node); extent_tree_szad_insert(chunks_szad, node);
extent_tree_ad_insert(chunks_ad, node); extent_tree_ad_insert(chunks_ad, node);
arena_chunk_dirty_maybe_insert(arena, node, dirty); arena_chunk_dirty_maybe_insert(arena, node, dirty);
@ -288,7 +286,8 @@ chunk_record(arena_t *arena, extent_tree_t *chunks_szad,
JEMALLOC_VALGRIND_MAKE_MEM_NOACCESS(chunk, size); JEMALLOC_VALGRIND_MAKE_MEM_NOACCESS(chunk, size);
malloc_mutex_lock(&arena->chunks_mtx); malloc_mutex_lock(&arena->chunks_mtx);
extent_node_addr_set(&key, (void *)((uintptr_t)chunk + size)); extent_node_init(&key, arena, (void *)((uintptr_t)chunk + size), 0,
false);
node = extent_tree_ad_nsearch(chunks_ad, &key); node = extent_tree_ad_nsearch(chunks_ad, &key);
/* Try to coalesce forward. */ /* Try to coalesce forward. */
if (node != NULL && extent_node_addr_get(node) == if (node != NULL && extent_node_addr_get(node) ==
@ -301,7 +300,7 @@ chunk_record(arena_t *arena, extent_tree_t *chunks_szad,
extent_tree_szad_remove(chunks_szad, node); extent_tree_szad_remove(chunks_szad, node);
arena_chunk_dirty_maybe_remove(arena, node, dirty); arena_chunk_dirty_maybe_remove(arena, node, dirty);
extent_node_addr_set(node, chunk); extent_node_addr_set(node, chunk);
extent_node_size_set(node, extent_node_size_get(node) + size); extent_node_size_set(node, size + extent_node_size_get(node));
extent_node_zeroed_set(node, extent_node_zeroed_get(node) && extent_node_zeroed_set(node, extent_node_zeroed_get(node) &&
!unzeroed); !unzeroed);
extent_tree_szad_insert(chunks_szad, node); extent_tree_szad_insert(chunks_szad, node);
@ -320,9 +319,7 @@ chunk_record(arena_t *arena, extent_tree_t *chunks_szad,
pages_purge(chunk, size); pages_purge(chunk, size);
goto label_return; goto label_return;
} }
extent_node_addr_set(node, chunk); extent_node_init(node, arena, chunk, size, !unzeroed);
extent_node_size_set(node, size);
extent_node_zeroed_set(node, !unzeroed);
extent_tree_ad_insert(chunks_ad, node); extent_tree_ad_insert(chunks_ad, node);
extent_tree_szad_insert(chunks_szad, node); extent_tree_szad_insert(chunks_szad, node);
arena_chunk_dirty_maybe_insert(arena, node, dirty); arena_chunk_dirty_maybe_insert(arena, node, dirty);
@ -343,10 +340,10 @@ chunk_record(arena_t *arena, extent_tree_t *chunks_szad,
extent_tree_szad_remove(chunks_szad, node); extent_tree_szad_remove(chunks_szad, node);
arena_chunk_dirty_maybe_remove(arena, node, dirty); arena_chunk_dirty_maybe_remove(arena, node, dirty);
extent_node_addr_set(node, extent_node_addr_get(prev)); extent_node_addr_set(node, extent_node_addr_get(prev));
extent_node_size_set(node, extent_node_size_get(node) + extent_node_size_set(node, extent_node_size_get(prev) +
extent_node_size_get(prev)); extent_node_size_get(node));
extent_node_zeroed_set(node, extent_node_zeroed_get(node) && extent_node_zeroed_set(node, extent_node_zeroed_get(prev) &&
extent_node_zeroed_get(prev)); extent_node_zeroed_get(node));
extent_tree_szad_insert(chunks_szad, node); extent_tree_szad_insert(chunks_szad, node);
arena_chunk_dirty_maybe_insert(arena, node, dirty); arena_chunk_dirty_maybe_insert(arena, node, dirty);

View File

@ -73,11 +73,7 @@ huge_palloc(tsd_t *tsd, arena_t *arena, size_t usize, size_t alignment,
return (NULL); return (NULL);
} }
extent_node_arena_set(node, arena); extent_node_init(node, arena, ret, usize, is_zeroed);
extent_node_addr_set(node, ret);
extent_node_size_set(node, usize);
extent_node_achunk_set(node, false);
extent_node_zeroed_set(node, is_zeroed);
if (huge_node_set(ret, node)) { if (huge_node_set(ret, node)) {
arena_chunk_dalloc_huge(arena, ret, usize); arena_chunk_dalloc_huge(arena, ret, usize);