Add/use chunk_commit_wrapper().

This commit is contained in:
Jason Evans 2016-05-17 18:29:08 -07:00
parent 56e0031d7d
commit 384e88f451
4 changed files with 44 additions and 30 deletions

View File

@ -66,6 +66,9 @@ void chunk_dalloc_cache(tsdn_t *tsdn, arena_t *arena,
void chunk_dalloc_wrapper(tsdn_t *tsdn, arena_t *arena, void chunk_dalloc_wrapper(tsdn_t *tsdn, arena_t *arena,
chunk_hooks_t *chunk_hooks, void *chunk, size_t size, bool zeroed, chunk_hooks_t *chunk_hooks, void *chunk, size_t size, bool zeroed,
bool committed); bool committed);
bool chunk_commit_wrapper(tsdn_t *tsdn, arena_t *arena,
chunk_hooks_t *chunk_hooks, void *chunk, size_t size, size_t offset,
size_t length);
bool chunk_decommit_wrapper(tsdn_t *tsdn, arena_t *arena, bool chunk_decommit_wrapper(tsdn_t *tsdn, arena_t *arena,
chunk_hooks_t *chunk_hooks, void *chunk, size_t size, size_t offset, chunk_hooks_t *chunk_hooks, void *chunk, size_t size, size_t offset,
size_t length); size_t length);

View File

@ -159,6 +159,7 @@ chunk_alloc_dss
chunk_alloc_mmap chunk_alloc_mmap
chunk_alloc_wrapper chunk_alloc_wrapper
chunk_boot chunk_boot
chunk_commit_wrapper
chunk_dalloc_cache chunk_dalloc_cache
chunk_dalloc_mmap chunk_dalloc_mmap
chunk_dalloc_wrapper chunk_dalloc_wrapper

View File

@ -375,8 +375,8 @@ arena_run_split_remove(arena_t *arena, arena_chunk_t *chunk, size_t run_ind,
} }
static bool static bool
arena_run_split_large_helper(arena_t *arena, extent_t *extent, arena_run_t *run, arena_run_split_large_helper(tsdn_t *tsdn, arena_t *arena, extent_t *extent,
size_t size, bool remove, bool zero) arena_run_t *run, size_t size, bool remove, bool zero)
{ {
arena_chunk_t *chunk; arena_chunk_t *chunk;
arena_chunk_map_misc_t *miscelm; arena_chunk_map_misc_t *miscelm;
@ -391,8 +391,8 @@ arena_run_split_large_helper(arena_t *arena, extent_t *extent, arena_run_t *run,
need_pages = (size >> LG_PAGE); need_pages = (size >> LG_PAGE);
assert(need_pages > 0); assert(need_pages > 0);
if (flag_decommitted != 0 && arena->chunk_hooks.commit(chunk, chunksize, if (flag_decommitted != 0 && chunk_commit_wrapper(tsdn, arena,
run_ind << LG_PAGE, size, arena->ind)) &arena->chunk_hooks, chunk, chunksize, run_ind << LG_PAGE, size))
return (true); return (true);
if (remove) { if (remove) {
@ -439,26 +439,26 @@ arena_run_split_large_helper(arena_t *arena, extent_t *extent, arena_run_t *run,
} }
static bool static bool
arena_run_split_large(arena_t *arena, extent_t *extent, arena_run_t *run, arena_run_split_large(tsdn_t *tsdn, arena_t *arena, extent_t *extent,
size_t size, bool zero) arena_run_t *run, size_t size, bool zero)
{ {
return (arena_run_split_large_helper(arena, extent, run, size, true, return (arena_run_split_large_helper(tsdn, arena, extent, run, size,
zero)); true, zero));
} }
static bool static bool
arena_run_init_large(arena_t *arena, extent_t *extent, arena_run_t *run, arena_run_init_large(tsdn_t *tsdn, arena_t *arena, extent_t *extent,
size_t size, bool zero) arena_run_t *run, size_t size, bool zero)
{ {
return (arena_run_split_large_helper(arena, extent, run, size, false, return (arena_run_split_large_helper(tsdn, arena, extent, run, size,
zero)); false, zero));
} }
static bool static bool
arena_run_split_small(arena_t *arena, extent_t *extent, arena_run_t *run, arena_run_split_small(tsdn_t *tsdn, arena_t *arena, extent_t *extent,
size_t size, szind_t binind) arena_run_t *run, size_t size, szind_t binind)
{ {
arena_chunk_t *chunk; arena_chunk_t *chunk;
arena_chunk_map_misc_t *miscelm; arena_chunk_map_misc_t *miscelm;
@ -474,8 +474,8 @@ arena_run_split_small(arena_t *arena, extent_t *extent, arena_run_t *run,
need_pages = (size >> LG_PAGE); need_pages = (size >> LG_PAGE);
assert(need_pages > 0); assert(need_pages > 0);
if (flag_decommitted != 0 && arena->chunk_hooks.commit(chunk, chunksize, if (flag_decommitted != 0 && chunk_commit_wrapper(tsdn, arena,
run_ind << LG_PAGE, size, arena->ind)) &arena->chunk_hooks, chunk, chunksize, run_ind << LG_PAGE, size))
return (true); return (true);
arena_run_split_remove(arena, chunk, run_ind, flag_dirty, arena_run_split_remove(arena, chunk, run_ind, flag_dirty,
@ -542,8 +542,8 @@ arena_chunk_alloc_internal_hard(tsdn_t *tsdn, arena_t *arena,
NULL, chunksize, chunksize, zero, commit); NULL, chunksize, chunksize, zero, commit);
if (chunk != NULL && !*commit) { if (chunk != NULL && !*commit) {
/* Commit header. */ /* Commit header. */
if (chunk_hooks->commit(chunk, chunksize, 0, map_bias << if (chunk_commit_wrapper(tsdn, arena, chunk_hooks, chunk,
LG_PAGE, arena->ind)) { chunksize, 0, map_bias << LG_PAGE)) {
chunk_dalloc_wrapper(tsdn, arena, chunk_hooks, chunk_dalloc_wrapper(tsdn, arena, chunk_hooks,
(void *)chunk, chunksize, *zero, *commit); (void *)chunk, chunksize, *zero, *commit);
chunk = NULL; chunk = NULL;
@ -1041,8 +1041,8 @@ arena_run_alloc_large_helper(tsdn_t *tsdn, arena_t *arena, size_t size,
{ {
arena_run_t *run = arena_run_first_best_fit(arena, s2u(size)); arena_run_t *run = arena_run_first_best_fit(arena, s2u(size));
if (run != NULL) { if (run != NULL) {
if (arena_run_split_large(arena, iealloc(tsdn, run), run, size, if (arena_run_split_large(tsdn, arena, iealloc(tsdn, run), run,
zero)) size, zero))
run = NULL; run = NULL;
} }
return (run); return (run);
@ -1068,8 +1068,8 @@ arena_run_alloc_large(tsdn_t *tsdn, arena_t *arena, size_t size, bool zero)
chunk = arena_chunk_alloc(tsdn, arena); chunk = arena_chunk_alloc(tsdn, arena);
if (chunk != NULL) { if (chunk != NULL) {
run = &arena_miscelm_get_mutable(chunk, map_bias)->run; run = &arena_miscelm_get_mutable(chunk, map_bias)->run;
if (arena_run_split_large(arena, iealloc(tsdn, run), run, size, if (arena_run_split_large(tsdn, arena, iealloc(tsdn, run), run,
zero)) size, zero))
run = NULL; run = NULL;
return (run); return (run);
} }
@ -1088,8 +1088,8 @@ arena_run_alloc_small_helper(tsdn_t *tsdn, arena_t *arena, size_t size,
{ {
arena_run_t *run = arena_run_first_best_fit(arena, size); arena_run_t *run = arena_run_first_best_fit(arena, size);
if (run != NULL) { if (run != NULL) {
if (arena_run_split_small(arena, iealloc(tsdn, run), run, size, if (arena_run_split_small(tsdn, arena, iealloc(tsdn, run), run,
binind)) size, binind))
run = NULL; run = NULL;
} }
return (run); return (run);
@ -1116,8 +1116,8 @@ arena_run_alloc_small(tsdn_t *tsdn, arena_t *arena, size_t size, szind_t binind)
chunk = arena_chunk_alloc(tsdn, arena); chunk = arena_chunk_alloc(tsdn, arena);
if (chunk != NULL) { if (chunk != NULL) {
run = &arena_miscelm_get_mutable(chunk, map_bias)->run; run = &arena_miscelm_get_mutable(chunk, map_bias)->run;
if (arena_run_split_small(arena, iealloc(tsdn, run), run, size, if (arena_run_split_small(tsdn, arena, iealloc(tsdn, run), run,
binind)) size, binind))
run = NULL; run = NULL;
return (run); return (run);
} }
@ -1534,8 +1534,8 @@ arena_stash_dirty(tsdn_t *tsdn, arena_t *arena, chunk_hooks_t *chunk_hooks,
arena_chunk_alloc(tsdn, arena); arena_chunk_alloc(tsdn, arena);
/* Temporarily allocate the free dirty run. */ /* Temporarily allocate the free dirty run. */
arena_run_split_large(arena, extent, run, run_size, arena_run_split_large(tsdn, arena, extent, run,
false); run_size, false);
/* Stash. */ /* Stash. */
if (false) if (false)
qr_new(rdelm, rd_link); /* Redundant. */ qr_new(rdelm, rd_link); /* Redundant. */
@ -2569,7 +2569,8 @@ arena_palloc_large(tsdn_t *tsdn, arena_t *arena, size_t usize, size_t alignment,
arena_run_trim_tail(tsdn, arena, chunk, extent, run, usize + arena_run_trim_tail(tsdn, arena, chunk, extent, run, usize +
large_pad + trailsize, usize + large_pad, false); large_pad + trailsize, usize + large_pad, false);
} }
if (arena_run_init_large(arena, extent, run, usize + large_pad, zero)) { if (arena_run_init_large(tsdn, arena, extent, run, usize + large_pad,
zero)) {
size_t run_ind = size_t run_ind =
arena_miscelm_to_pageind(arena_run_to_miscelm(run)); arena_miscelm_to_pageind(arena_run_to_miscelm(run));
bool dirty = (arena_mapbits_dirty_get(chunk, run_ind) != 0); bool dirty = (arena_mapbits_dirty_get(chunk, run_ind) != 0);
@ -2944,7 +2945,7 @@ arena_ralloc_large_grow(tsdn_t *tsdn, arena_t *arena, arena_chunk_t *chunk,
goto label_fail; goto label_fail;
run = &arena_miscelm_get_mutable(chunk, pageind+npages)->run; run = &arena_miscelm_get_mutable(chunk, pageind+npages)->run;
if (arena_run_split_large(arena, iealloc(tsdn, run), run, if (arena_run_split_large(tsdn, arena, iealloc(tsdn, run), run,
splitsize, zero)) splitsize, zero))
goto label_fail; goto label_fail;

View File

@ -743,6 +743,15 @@ chunk_commit_default(void *chunk, size_t size, size_t offset, size_t length,
length)); length));
} }
bool
chunk_commit_wrapper(tsdn_t *tsdn, arena_t *arena, chunk_hooks_t *chunk_hooks,
void *chunk, size_t size, size_t offset, size_t length)
{
chunk_hooks_assure_initialized(tsdn, arena, chunk_hooks);
return (chunk_hooks->commit(chunk, size, offset, length, arena->ind));
}
static bool static bool
chunk_decommit_default(void *chunk, size_t size, size_t offset, size_t length, chunk_decommit_default(void *chunk, size_t size, size_t offset, size_t length,
unsigned arena_ind) unsigned arena_ind)