consisten align small blocks in first segment page

This commit is contained in:
kickunderscore 2019-07-01 23:35:07 +02:00 committed by GitHub
parent b22aeb86b6
commit 6b6488587a
WARNING! Although there is a key with this ID in the database it does not verify this commit! This commit is SUSPICIOUS.
GPG key ID: 4AEE18F83AFDEB23

View file

@ -127,10 +127,20 @@ uint8_t* _mi_segment_page_start(const mi_segment_t* segment, const mi_page_t* pa
size_t psize = (segment->page_kind == MI_PAGE_HUGE ? segment->segment_size : (size_t)1 << segment->page_shift); size_t psize = (segment->page_kind == MI_PAGE_HUGE ? segment->segment_size : (size_t)1 << segment->page_shift);
uint8_t* p = (uint8_t*)segment + page->segment_idx*psize; uint8_t* p = (uint8_t*)segment + page->segment_idx*psize;
if (page->segment_idx == 0) { if (page->segment_idx == 0) {
// the first page starts after the segment info (and possible guard page) // the first page starts after the segment info, optional alignment padding
p += segment->segment_info_size; // (and possible guard page). to end up with the same small block alignment
psize -= segment->segment_info_size; // as in regular pages, the page start is aligned to block_size. note that
// this does not waste memory in most cases but moves padding from the end
// of the page to the start. in addition, also in the first page the small
// blocks for powers of two are perfectly aligned to these powers of two.
mi_assert_internal(page->block_size > 0);
const size_t misalignment = segment->page_kind == MI_PAGE_SMALL
? segment->segment_info_size % page->block_size
: 0;
const size_t adjustment = misalignment ? page->block_size - misalignment : 0;
p += segment->segment_info_size + adjustment;
psize -= segment->segment_info_size + adjustment;
} }
long secure = mi_option_get(mi_option_secure); long secure = mi_option_get(mi_option_secure);
if (secure > 1 || (secure == 1 && page->segment_idx == segment->capacity - 1)) { if (secure > 1 || (secure == 1 && page->segment_idx == segment->capacity - 1)) {