diff options
author | Jason Evans <je@fb.com> | 2012-05-02 23:11:03 (GMT) |
---|---|---|
committer | Jason Evans <je@fb.com> | 2012-05-02 23:11:03 (GMT) |
commit | 80737c3323dabc45232affcaeb99ac2bad6ea647 (patch) | |
tree | b50bac23b8e5bebeb643bea3b2474135cdd28e05 /src/arena.c | |
parent | 7bfecf412dab69e771c9bbbaa01160bb69af8ec0 (diff) | |
download | jemalloc-80737c3323dabc45232affcaeb99ac2bad6ea647.zip jemalloc-80737c3323dabc45232affcaeb99ac2bad6ea647.tar.gz jemalloc-80737c3323dabc45232affcaeb99ac2bad6ea647.tar.bz2 |
Further optimize and harden arena_salloc().
Further optimize arena_salloc() to only look at the binind chunk map
bits in the common case.
Add more sanity checks to arena_salloc() that detect chunk map
inconsistencies for large allocations (whether due to allocator bugs or
application bugs).
Diffstat (limited to 'src/arena.c')
-rw-r--r-- | src/arena.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/src/arena.c b/src/arena.c index 3ef4b8f..9f24e7c 100644 --- a/src/arena.c +++ b/src/arena.c @@ -154,7 +154,7 @@ arena_run_reg_dalloc(arena_run_t *run, void *ptr) arena_chunk_t *chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(run); size_t pageind = ((uintptr_t)ptr - (uintptr_t)chunk) >> LG_PAGE; size_t mapbits = arena_mapbits_get(chunk, pageind); - size_t binind = arena_ptr_binind(ptr, mapbits); + size_t binind = arena_ptr_small_binind_get(ptr, mapbits); arena_bin_info_t *bin_info = &arena_bin_info[binind]; unsigned regind = arena_run_regind(run, bin_info, ptr); bitmap_t *bitmap = (bitmap_t *)((uintptr_t)run + @@ -1581,7 +1581,7 @@ arena_dalloc_bin_locked(arena_t *arena, arena_chunk_t *chunk, void *ptr, run = (arena_run_t *)((uintptr_t)chunk + (uintptr_t)((pageind - arena_mapbits_small_runind_get(chunk, pageind)) << LG_PAGE)); bin = run->bin; - binind = arena_ptr_binind(ptr, mapelm->bits); + binind = arena_ptr_small_binind_get(ptr, mapelm->bits); bin_info = &arena_bin_info[binind]; if (config_fill || config_stats) size = bin_info->reg_size; @@ -1624,8 +1624,9 @@ arena_dalloc_small(arena_t *arena, arena_chunk_t *chunk, void *ptr, arena_chunk_map_t *mapelm; if (config_debug) { - assert(arena_ptr_binind(ptr, arena_mapbits_get(chunk, pageind)) - != BININD_INVALID); + /* arena_ptr_small_binind_get() does extra sanity checking. */ + assert(arena_ptr_small_binind_get(ptr, arena_mapbits_get(chunk, + pageind)) != BININD_INVALID); } mapelm = arena_mapp_get(chunk, pageind); arena_dalloc_bin(arena, chunk, ptr, pageind, mapelm); |