Changeset View
Changeset View
Standalone View
Standalone View
head/contrib/jemalloc/src/extent_dss.c
Show First 20 Lines • Show All 107 Lines • ▼ Show 20 Lines | |||||
void * | void * | ||||
extent_alloc_dss(tsdn_t *tsdn, arena_t *arena, void *new_addr, size_t size, | extent_alloc_dss(tsdn_t *tsdn, arena_t *arena, void *new_addr, size_t size, | ||||
size_t alignment, bool *zero, bool *commit) { | size_t alignment, bool *zero, bool *commit) { | ||||
extent_t *gap; | extent_t *gap; | ||||
cassert(have_dss); | cassert(have_dss); | ||||
assert(size > 0); | assert(size > 0); | ||||
assert(alignment > 0); | assert(alignment == ALIGNMENT_CEILING(alignment, PAGE)); | ||||
/* | /* | ||||
* sbrk() uses a signed increment argument, so take care not to | * sbrk() uses a signed increment argument, so take care not to | ||||
* interpret a large allocation request as a negative increment. | * interpret a large allocation request as a negative increment. | ||||
*/ | */ | ||||
if ((intptr_t)size < 0) { | if ((intptr_t)size < 0) { | ||||
return NULL; | return NULL; | ||||
} | } | ||||
Show All 24 Lines | while (true) { | ||||
void *gap_addr_page = (void *)(PAGE_CEILING( | void *gap_addr_page = (void *)(PAGE_CEILING( | ||||
(uintptr_t)max_cur)); | (uintptr_t)max_cur)); | ||||
void *ret = (void *)ALIGNMENT_CEILING( | void *ret = (void *)ALIGNMENT_CEILING( | ||||
(uintptr_t)gap_addr_page, alignment); | (uintptr_t)gap_addr_page, alignment); | ||||
size_t gap_size_page = (uintptr_t)ret - | size_t gap_size_page = (uintptr_t)ret - | ||||
(uintptr_t)gap_addr_page; | (uintptr_t)gap_addr_page; | ||||
if (gap_size_page != 0) { | if (gap_size_page != 0) { | ||||
extent_init(gap, arena, gap_addr_page, | extent_init(gap, arena, gap_addr_page, | ||||
gap_size_page, false, NSIZES, | gap_size_page, false, SC_NSIZES, | ||||
arena_extent_sn_next(arena), | arena_extent_sn_next(arena), | ||||
extent_state_active, false, true, true); | extent_state_active, false, true, true, | ||||
EXTENT_NOT_HEAD); | |||||
} | } | ||||
/* | /* | ||||
* Compute the address just past the end of the desired | * Compute the address just past the end of the desired | ||||
* allocation space. | * allocation space. | ||||
*/ | */ | ||||
void *dss_next = (void *)((uintptr_t)ret + size); | void *dss_next = (void *)((uintptr_t)ret + size); | ||||
if ((uintptr_t)ret < (uintptr_t)max_cur || | if ((uintptr_t)ret < (uintptr_t)max_cur || | ||||
(uintptr_t)dss_next < (uintptr_t)max_cur) { | (uintptr_t)dss_next < (uintptr_t)max_cur) { | ||||
Show All 25 Lines | while (true) { | ||||
*commit = pages_decommit(ret, size); | *commit = pages_decommit(ret, size); | ||||
} | } | ||||
if (*zero && *commit) { | if (*zero && *commit) { | ||||
extent_hooks_t *extent_hooks = | extent_hooks_t *extent_hooks = | ||||
EXTENT_HOOKS_INITIALIZER; | EXTENT_HOOKS_INITIALIZER; | ||||
extent_t extent; | extent_t extent; | ||||
extent_init(&extent, arena, ret, size, | extent_init(&extent, arena, ret, size, | ||||
size, false, NSIZES, | size, false, SC_NSIZES, | ||||
extent_state_active, false, true, | extent_state_active, false, true, | ||||
true); | true, EXTENT_NOT_HEAD); | ||||
if (extent_purge_forced_wrapper(tsdn, | if (extent_purge_forced_wrapper(tsdn, | ||||
arena, &extent_hooks, &extent, 0, | arena, &extent_hooks, &extent, 0, | ||||
size)) { | size)) { | ||||
memset(ret, 0, size); | memset(ret, 0, size); | ||||
} | } | ||||
} | } | ||||
return ret; | return ret; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 59 Lines • Show Last 20 Lines |