mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-05-07 15:59:32 +03:00
fix alignment issue #700
This commit is contained in:
parent
90f866c5bc
commit
4bf63300b3
4 changed files with 31 additions and 2 deletions
|
@ -116,7 +116,7 @@
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<ConformanceMode>Default</ConformanceMode>
|
<ConformanceMode>Default</ConformanceMode>
|
||||||
<AdditionalIncludeDirectories>../../include</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>../../include</AdditionalIncludeDirectories>
|
||||||
<PreprocessorDefinitions>MI_DEBUG=4;MI_SECURE=0;%(PreprocessorDefinitions);</PreprocessorDefinitions>
|
<PreprocessorDefinitions>MI_DEBUG=0;MI_SECURE=0;%(PreprocessorDefinitions);</PreprocessorDefinitions>
|
||||||
<CompileAs>CompileAsCpp</CompileAs>
|
<CompileAs>CompileAsCpp</CompileAs>
|
||||||
<SupportJustMyCode>false</SupportJustMyCode>
|
<SupportJustMyCode>false</SupportJustMyCode>
|
||||||
<LanguageStandard>stdcpp20</LanguageStandard>
|
<LanguageStandard>stdcpp20</LanguageStandard>
|
||||||
|
|
|
@ -316,7 +316,9 @@ static uint8_t* _mi_segment_page_start_from_slice(const mi_segment_t* segment, c
|
||||||
ptrdiff_t idx = slice - segment->slices;
|
ptrdiff_t idx = slice - segment->slices;
|
||||||
size_t psize = (size_t)slice->slice_count * MI_SEGMENT_SLICE_SIZE;
|
size_t psize = (size_t)slice->slice_count * MI_SEGMENT_SLICE_SIZE;
|
||||||
// make the start not OS page aligned for smaller blocks to avoid page/cache effects
|
// make the start not OS page aligned for smaller blocks to avoid page/cache effects
|
||||||
size_t start_offset = (xblock_size >= MI_INTPTR_SIZE && xblock_size <= 1024 ? 3*MI_MAX_ALIGN_GUARANTEE : 0);
|
// note: the offset must always be an xblock_size multiple since we assume small allocations
|
||||||
|
// are aligned (see `mi_heap_malloc_aligned`).
|
||||||
|
size_t start_offset = (xblock_size >= MI_INTPTR_SIZE && xblock_size <= 512 ? xblock_size : 0);
|
||||||
if (page_size != NULL) { *page_size = psize - start_offset; }
|
if (page_size != NULL) { *page_size = psize - start_offset; }
|
||||||
return (uint8_t*)segment + ((idx*MI_SEGMENT_SLICE_SIZE) + start_offset);
|
return (uint8_t*)segment + ((idx*MI_SEGMENT_SLICE_SIZE) + start_offset);
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@ static void negative_stat(void);
|
||||||
static void alloc_huge(void);
|
static void alloc_huge(void);
|
||||||
static void test_heap_walk(void);
|
static void test_heap_walk(void);
|
||||||
static void test_heap_arena(void);
|
static void test_heap_arena(void);
|
||||||
|
static void test_align(void);
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
mi_version();
|
mi_version();
|
||||||
|
@ -37,6 +38,7 @@ int main() {
|
||||||
// alloc_huge();
|
// alloc_huge();
|
||||||
// test_heap_walk();
|
// test_heap_walk();
|
||||||
// test_heap_arena();
|
// test_heap_arena();
|
||||||
|
test_align();
|
||||||
|
|
||||||
void* p1 = malloc(78);
|
void* p1 = malloc(78);
|
||||||
void* p2 = malloc(24);
|
void* p2 = malloc(24);
|
||||||
|
@ -68,6 +70,13 @@ int main() {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_align() {
|
||||||
|
void* p = mi_malloc_aligned(256, 256);
|
||||||
|
if (((uintptr_t)p % 256) != 0) {
|
||||||
|
fprintf(stderr, "%p is not 256 alignend!\n", p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void invalid_free() {
|
static void invalid_free() {
|
||||||
free((void*)0xBADBEEF);
|
free((void*)0xBADBEEF);
|
||||||
realloc((void*)0xBADBEEF,10);
|
realloc((void*)0xBADBEEF,10);
|
||||||
|
|
|
@ -212,6 +212,24 @@ int main(void) {
|
||||||
result = mi_heap_contains_block(heap, p);
|
result = mi_heap_contains_block(heap, p);
|
||||||
mi_heap_destroy(heap);
|
mi_heap_destroy(heap);
|
||||||
}
|
}
|
||||||
|
CHECK_BODY("malloc-aligned12") {
|
||||||
|
bool ok = true;
|
||||||
|
const size_t align = 256;
|
||||||
|
for (int j = 1; j < 1000; j++) {
|
||||||
|
void* ps[1000];
|
||||||
|
for (int i = 0; i < 1000 && ok; i++) {
|
||||||
|
ps[i] = mi_malloc_aligned(j // size
|
||||||
|
, align);
|
||||||
|
if (ps[i] == NULL || ((uintptr_t)(ps[i]) % align) != 0) {
|
||||||
|
ok = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i = 0; i < 1000 && ok; i++) {
|
||||||
|
mi_free(ps[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result = ok;
|
||||||
|
};
|
||||||
CHECK_BODY("malloc-aligned-at1") {
|
CHECK_BODY("malloc-aligned-at1") {
|
||||||
void* p = mi_malloc_aligned_at(48,32,0); result = (p != NULL && ((uintptr_t)(p) + 0) % 32 == 0); mi_free(p);
|
void* p = mi_malloc_aligned_at(48,32,0); result = (p != NULL && ((uintptr_t)(p) + 0) % 32 == 0); mi_free(p);
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Reference in a new issue