Merge pull request #70 from bmaurer/bitsplitrefactor
refactoring for bits splitting
This commit is contained in:
commit
f4e026f525
76
src/arena.c
76
src/arena.c
@ -53,6 +53,22 @@ static void arena_bin_lower_run(arena_t *arena, arena_chunk_t *chunk,
|
|||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
|
JEMALLOC_INLINE_C size_t
|
||||||
|
arena_mapelm_to_pageind(arena_chunk_map_t *mapelm)
|
||||||
|
{
|
||||||
|
uintptr_t map_offset =
|
||||||
|
CHUNK_ADDR2OFFSET(mapelm) - offsetof(arena_chunk_t, map);
|
||||||
|
|
||||||
|
return ((map_offset / sizeof(arena_chunk_map_t)) + map_bias);
|
||||||
|
}
|
||||||
|
|
||||||
|
JEMALLOC_INLINE_C size_t
|
||||||
|
arena_mapelm_to_bits(arena_chunk_map_t *mapelm)
|
||||||
|
{
|
||||||
|
|
||||||
|
return (mapelm->bits);
|
||||||
|
}
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
arena_run_comp(arena_chunk_map_t *a, arena_chunk_map_t *b)
|
arena_run_comp(arena_chunk_map_t *a, arena_chunk_map_t *b)
|
||||||
{
|
{
|
||||||
@ -73,26 +89,19 @@ static inline int
|
|||||||
arena_avail_comp(arena_chunk_map_t *a, arena_chunk_map_t *b)
|
arena_avail_comp(arena_chunk_map_t *a, arena_chunk_map_t *b)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
size_t a_size = a->bits & ~PAGE_MASK;
|
size_t a_size;
|
||||||
size_t b_size = b->bits & ~PAGE_MASK;
|
size_t b_size = arena_mapelm_to_bits(b) & ~PAGE_MASK;
|
||||||
|
uintptr_t a_mapelm = (uintptr_t)a;
|
||||||
|
uintptr_t b_mapelm = (uintptr_t)b;
|
||||||
|
|
||||||
|
if (a_mapelm & CHUNK_MAP_KEY)
|
||||||
|
a_size = a_mapelm & ~PAGE_MASK;
|
||||||
|
else
|
||||||
|
a_size = arena_mapelm_to_bits(a) & ~PAGE_MASK;
|
||||||
|
|
||||||
ret = (a_size > b_size) - (a_size < b_size);
|
ret = (a_size > b_size) - (a_size < b_size);
|
||||||
if (ret == 0) {
|
if (ret == 0 && (!(a_mapelm & CHUNK_MAP_KEY)))
|
||||||
uintptr_t a_mapelm, b_mapelm;
|
|
||||||
|
|
||||||
if ((a->bits & CHUNK_MAP_KEY) != CHUNK_MAP_KEY)
|
|
||||||
a_mapelm = (uintptr_t)a;
|
|
||||||
else {
|
|
||||||
/*
|
|
||||||
* Treat keys as though they are lower than anything
|
|
||||||
* else.
|
|
||||||
*/
|
|
||||||
a_mapelm = 0;
|
|
||||||
}
|
|
||||||
b_mapelm = (uintptr_t)b;
|
|
||||||
|
|
||||||
ret = (a_mapelm > b_mapelm) - (a_mapelm < b_mapelm);
|
ret = (a_mapelm > b_mapelm) - (a_mapelm < b_mapelm);
|
||||||
}
|
|
||||||
|
|
||||||
return (ret);
|
return (ret);
|
||||||
}
|
}
|
||||||
@ -663,15 +672,14 @@ static arena_run_t *
|
|||||||
arena_run_alloc_large_helper(arena_t *arena, size_t size, bool zero)
|
arena_run_alloc_large_helper(arena_t *arena, size_t size, bool zero)
|
||||||
{
|
{
|
||||||
arena_run_t *run;
|
arena_run_t *run;
|
||||||
arena_chunk_map_t *mapelm, key;
|
arena_chunk_map_t *mapelm;
|
||||||
|
arena_chunk_map_t *key;
|
||||||
|
|
||||||
key.bits = size | CHUNK_MAP_KEY;
|
key = (arena_chunk_map_t *)(size | CHUNK_MAP_KEY);
|
||||||
mapelm = arena_avail_tree_nsearch(&arena->runs_avail, &key);
|
mapelm = arena_avail_tree_nsearch(&arena->runs_avail, key);
|
||||||
if (mapelm != NULL) {
|
if (mapelm != NULL) {
|
||||||
arena_chunk_t *run_chunk = CHUNK_ADDR2BASE(mapelm);
|
arena_chunk_t *run_chunk = CHUNK_ADDR2BASE(mapelm);
|
||||||
size_t pageind = (((uintptr_t)mapelm -
|
size_t pageind = arena_mapelm_to_pageind(mapelm);
|
||||||
(uintptr_t)run_chunk->map) / sizeof(arena_chunk_map_t))
|
|
||||||
+ map_bias;
|
|
||||||
|
|
||||||
run = (arena_run_t *)((uintptr_t)run_chunk + (pageind <<
|
run = (arena_run_t *)((uintptr_t)run_chunk + (pageind <<
|
||||||
LG_PAGE));
|
LG_PAGE));
|
||||||
@ -718,15 +726,14 @@ static arena_run_t *
|
|||||||
arena_run_alloc_small_helper(arena_t *arena, size_t size, size_t binind)
|
arena_run_alloc_small_helper(arena_t *arena, size_t size, size_t binind)
|
||||||
{
|
{
|
||||||
arena_run_t *run;
|
arena_run_t *run;
|
||||||
arena_chunk_map_t *mapelm, key;
|
arena_chunk_map_t *mapelm;
|
||||||
|
arena_chunk_map_t *key;
|
||||||
|
|
||||||
key.bits = size | CHUNK_MAP_KEY;
|
key = (arena_chunk_map_t *)(size | CHUNK_MAP_KEY);
|
||||||
mapelm = arena_avail_tree_nsearch(&arena->runs_avail, &key);
|
mapelm = arena_avail_tree_nsearch(&arena->runs_avail, key);
|
||||||
if (mapelm != NULL) {
|
if (mapelm != NULL) {
|
||||||
arena_chunk_t *run_chunk = CHUNK_ADDR2BASE(mapelm);
|
arena_chunk_t *run_chunk = CHUNK_ADDR2BASE(mapelm);
|
||||||
size_t pageind = (((uintptr_t)mapelm -
|
size_t pageind = arena_mapelm_to_pageind(mapelm);
|
||||||
(uintptr_t)run_chunk->map) / sizeof(arena_chunk_map_t))
|
|
||||||
+ map_bias;
|
|
||||||
|
|
||||||
run = (arena_run_t *)((uintptr_t)run_chunk + (pageind <<
|
run = (arena_run_t *)((uintptr_t)run_chunk + (pageind <<
|
||||||
LG_PAGE));
|
LG_PAGE));
|
||||||
@ -897,8 +904,7 @@ arena_chunk_purge_stashed(arena_t *arena, arena_chunk_t *chunk,
|
|||||||
bool unzeroed;
|
bool unzeroed;
|
||||||
size_t flag_unzeroed, i;
|
size_t flag_unzeroed, i;
|
||||||
|
|
||||||
pageind = (((uintptr_t)mapelm - (uintptr_t)chunk->map) /
|
pageind = arena_mapelm_to_pageind(mapelm);
|
||||||
sizeof(arena_chunk_map_t)) + map_bias;
|
|
||||||
npages = arena_mapbits_large_size_get(chunk, pageind) >>
|
npages = arena_mapbits_large_size_get(chunk, pageind) >>
|
||||||
LG_PAGE;
|
LG_PAGE;
|
||||||
assert(pageind + npages <= chunk_npages);
|
assert(pageind + npages <= chunk_npages);
|
||||||
@ -942,8 +948,7 @@ arena_chunk_unstash_purged(arena_t *arena, arena_chunk_t *chunk,
|
|||||||
mapelm = ql_first(mapelms)) {
|
mapelm = ql_first(mapelms)) {
|
||||||
arena_run_t *run;
|
arena_run_t *run;
|
||||||
|
|
||||||
pageind = (((uintptr_t)mapelm - (uintptr_t)chunk->map) /
|
pageind = arena_mapelm_to_pageind(mapelm);
|
||||||
sizeof(arena_chunk_map_t)) + map_bias;
|
|
||||||
run = (arena_run_t *)((uintptr_t)chunk + (uintptr_t)(pageind <<
|
run = (arena_run_t *)((uintptr_t)chunk + (uintptr_t)(pageind <<
|
||||||
LG_PAGE));
|
LG_PAGE));
|
||||||
ql_remove(mapelms, mapelm, u.ql_link);
|
ql_remove(mapelms, mapelm, u.ql_link);
|
||||||
@ -1307,8 +1312,7 @@ arena_bin_runs_first(arena_bin_t *bin)
|
|||||||
arena_run_t *run;
|
arena_run_t *run;
|
||||||
|
|
||||||
chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(mapelm);
|
chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(mapelm);
|
||||||
pageind = ((((uintptr_t)mapelm - (uintptr_t)chunk->map) /
|
pageind = arena_mapelm_to_pageind(mapelm);
|
||||||
sizeof(arena_chunk_map_t))) + map_bias;
|
|
||||||
run = (arena_run_t *)((uintptr_t)chunk + (uintptr_t)((pageind -
|
run = (arena_run_t *)((uintptr_t)chunk + (uintptr_t)((pageind -
|
||||||
arena_mapbits_small_runind_get(chunk, pageind)) <<
|
arena_mapbits_small_runind_get(chunk, pageind)) <<
|
||||||
LG_PAGE));
|
LG_PAGE));
|
||||||
@ -1882,7 +1886,7 @@ arena_dalloc_bin_locked(arena_t *arena, arena_chunk_t *chunk, void *ptr,
|
|||||||
run = (arena_run_t *)((uintptr_t)chunk + (uintptr_t)((pageind -
|
run = (arena_run_t *)((uintptr_t)chunk + (uintptr_t)((pageind -
|
||||||
arena_mapbits_small_runind_get(chunk, pageind)) << LG_PAGE));
|
arena_mapbits_small_runind_get(chunk, pageind)) << LG_PAGE));
|
||||||
bin = run->bin;
|
bin = run->bin;
|
||||||
binind = arena_ptr_small_binind_get(ptr, mapelm->bits);
|
binind = arena_ptr_small_binind_get(ptr, arena_mapbits_get(chunk, pageind));
|
||||||
bin_info = &arena_bin_info[binind];
|
bin_info = &arena_bin_info[binind];
|
||||||
if (config_fill || config_stats)
|
if (config_fill || config_stats)
|
||||||
size = bin_info->reg_size;
|
size = bin_info->reg_size;
|
||||||
|
Loading…
Reference in New Issue
Block a user