mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-05-10 09:19:31 +03:00
merge from dev-slice
This commit is contained in:
commit
5b0a07d6b6
6 changed files with 17 additions and 19 deletions
|
@ -89,7 +89,7 @@ bool _mi_os_unprotect(void* addr, size_t size);
|
||||||
bool _mi_os_commit(void* addr, size_t size, bool* is_zero, mi_stats_t* stats);
|
bool _mi_os_commit(void* addr, size_t size, bool* is_zero, mi_stats_t* stats);
|
||||||
bool _mi_os_decommit(void* p, size_t size, mi_stats_t* stats);
|
bool _mi_os_decommit(void* p, size_t size, mi_stats_t* stats);
|
||||||
bool _mi_os_reset(void* p, size_t size, mi_stats_t* stats);
|
bool _mi_os_reset(void* p, size_t size, mi_stats_t* stats);
|
||||||
bool _mi_os_unreset(void* p, size_t size, bool* is_zero, mi_stats_t* stats);
|
// bool _mi_os_unreset(void* p, size_t size, bool* is_zero, mi_stats_t* stats);
|
||||||
size_t _mi_os_good_alloc_size(size_t size);
|
size_t _mi_os_good_alloc_size(size_t size);
|
||||||
bool _mi_os_has_overcommit(void);
|
bool _mi_os_has_overcommit(void);
|
||||||
|
|
||||||
|
|
|
@ -178,21 +178,21 @@ typedef int32_t mi_ssize_t;
|
||||||
// Maximum number of size classes. (spaced exponentially in 12.5% increments)
|
// Maximum number of size classes. (spaced exponentially in 12.5% increments)
|
||||||
#define MI_BIN_HUGE (73U)
|
#define MI_BIN_HUGE (73U)
|
||||||
|
|
||||||
#if (MI_LARGE_OBJ_WSIZE_MAX >= 655360)
|
#if (MI_MEDIUM_OBJ_WSIZE_MAX >= 655360)
|
||||||
#error "mimalloc internal: define more bins"
|
#error "mimalloc internal: define more bins"
|
||||||
#endif
|
#endif
|
||||||
#if (MI_ALIGNMENT_MAX > MI_SEGMENT_SIZE/2)
|
#if (MI_ALIGNED_MAX % MI_SEGMENT_SLICE_SIZE != 0)
|
||||||
#error "mimalloc internal: the max aligned boundary is too large for the segment size"
|
#error "mimalloc internal: the max aligned boundary must be an integral multiple of the segment slice size"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Maximum slice offset (7)
|
// Maximum slice offset (15)
|
||||||
#define MI_MAX_SLICE_OFFSET ((MI_MEDIUM_PAGE_SIZE / MI_SEGMENT_SLICE_SIZE) - 1)
|
#define MI_MAX_SLICE_OFFSET ((MI_ALIGNMENT_MAX / MI_SEGMENT_SLICE_SIZE) - 1)
|
||||||
|
|
||||||
// Used as a special value to encode block sizes in 32 bits.
|
// Used as a special value to encode block sizes in 32 bits.
|
||||||
#define MI_HUGE_BLOCK_SIZE ((uint32_t)MI_HUGE_OBJ_SIZE_MAX)
|
#define MI_HUGE_BLOCK_SIZE ((uint32_t)MI_HUGE_OBJ_SIZE_MAX)
|
||||||
|
|
||||||
// blocks up to this size are always allocated aligned
|
// blocks up to this size are always allocated aligned
|
||||||
#define MI_MAX_ALIGN_GUARANTEE (8*MI_MAX_ALIGN_SIZE)
|
#define MI_MAX_ALIGN_GUARANTEE (8*MI_MAX_ALIGN_SIZE)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -32,8 +32,7 @@ terms of the MIT license. A copy of the license can be found in the file
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(MAC_OS_X_VERSION_10_6) && \
|
#if defined(MAC_OS_X_VERSION_10_6) && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6)
|
||||||
MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
|
|
||||||
// only available from OSX 10.6
|
// only available from OSX 10.6
|
||||||
extern malloc_zone_t* malloc_default_purgeable_zone(void) __attribute__((weak_import));
|
extern malloc_zone_t* malloc_default_purgeable_zone(void) __attribute__((weak_import));
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -72,7 +72,7 @@ static mi_option_desc_t options[_mi_option_last] =
|
||||||
{ 0, UNINIT, MI_OPTION(reset_decommits) }, // reset decommits memory
|
{ 0, UNINIT, MI_OPTION(reset_decommits) }, // reset decommits memory
|
||||||
#else
|
#else
|
||||||
{ 1, UNINIT, MI_OPTION(eager_region_commit) },
|
{ 1, UNINIT, MI_OPTION(eager_region_commit) },
|
||||||
{ 0, UNINIT, MI_OPTION(reset_decommits) }, // reset uses MADV_FREE/MADV_DONTNEED
|
{ 0, UNINIT, MI_OPTION(reset_decommits) }, // legacy; ignored now and reset always uses MADV_FREE/MADV_DONTNEED (issue #518)
|
||||||
#endif
|
#endif
|
||||||
{ 0, UNINIT, MI_OPTION(large_os_pages) }, // use large OS pages, use only with eager commit to prevent fragmentation of VMA's
|
{ 0, UNINIT, MI_OPTION(large_os_pages) }, // use large OS pages, use only with eager commit to prevent fragmentation of VMA's
|
||||||
{ 0, UNINIT, MI_OPTION(reserve_huge_os_pages) }, // per 1GiB huge pages
|
{ 0, UNINIT, MI_OPTION(reserve_huge_os_pages) }, // per 1GiB huge pages
|
||||||
|
|
15
src/os.c
15
src/os.c
|
@ -952,9 +952,12 @@ bool _mi_os_decommit(void* addr, size_t size, mi_stats_t* tld_stats) {
|
||||||
return mi_os_commitx(addr, size, false, true /* conservative */, &is_zero, stats);
|
return mi_os_commitx(addr, size, false, true /* conservative */, &is_zero, stats);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
static bool mi_os_commit_unreset(void* addr, size_t size, bool* is_zero, mi_stats_t* stats) {
|
static bool mi_os_commit_unreset(void* addr, size_t size, bool* is_zero, mi_stats_t* stats) {
|
||||||
return mi_os_commitx(addr, size, true, true /* conservative */, is_zero, stats);
|
return mi_os_commitx(addr, size, true, true // conservative
|
||||||
|
, is_zero, stats);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// Signal to the OS that the address range is no longer in use
|
// Signal to the OS that the address range is no longer in use
|
||||||
// but may be used later again. This will release physical memory
|
// but may be used later again. This will release physical memory
|
||||||
|
@ -1017,14 +1020,10 @@ static bool mi_os_resetx(void* addr, size_t size, bool reset, mi_stats_t* stats)
|
||||||
bool _mi_os_reset(void* addr, size_t size, mi_stats_t* tld_stats) {
|
bool _mi_os_reset(void* addr, size_t size, mi_stats_t* tld_stats) {
|
||||||
MI_UNUSED(tld_stats);
|
MI_UNUSED(tld_stats);
|
||||||
mi_stats_t* stats = &_mi_stats_main;
|
mi_stats_t* stats = &_mi_stats_main;
|
||||||
if (mi_option_is_enabled(mi_option_reset_decommits)) {
|
return mi_os_resetx(addr, size, true, stats);
|
||||||
return _mi_os_decommit(addr, size, stats);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return mi_os_resetx(addr, size, true, stats);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
bool _mi_os_unreset(void* addr, size_t size, bool* is_zero, mi_stats_t* tld_stats) {
|
bool _mi_os_unreset(void* addr, size_t size, bool* is_zero, mi_stats_t* tld_stats) {
|
||||||
MI_UNUSED(tld_stats);
|
MI_UNUSED(tld_stats);
|
||||||
mi_stats_t* stats = &_mi_stats_main;
|
mi_stats_t* stats = &_mi_stats_main;
|
||||||
|
@ -1036,7 +1035,7 @@ bool _mi_os_unreset(void* addr, size_t size, bool* is_zero, mi_stats_t* tld_stat
|
||||||
return mi_os_resetx(addr, size, false, stats);
|
return mi_os_resetx(addr, size, false, stats);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// Protect a region in memory to be not accessible.
|
// Protect a region in memory to be not accessible.
|
||||||
static bool mi_os_protectx(void* addr, size_t size, bool protect) {
|
static bool mi_os_protectx(void* addr, size_t size, bool protect) {
|
||||||
|
|
|
@ -317,7 +317,7 @@ static uint8_t* _mi_segment_page_start_from_slice(const mi_segment_t* segment, c
|
||||||
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 ? MI_MAX_ALIGN_GUARANTEE : 0);
|
size_t start_offset = (xblock_size >= MI_INTPTR_SIZE && xblock_size <= 1024 ? MI_MAX_ALIGN_GUARANTEE : 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue