mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-05-08 00:09:31 +03:00
use physical memory in kib to avoid overflow of size_t (issue #1010)
This commit is contained in:
parent
78dd3f0e38
commit
ec4aa62b65
4 changed files with 18 additions and 18 deletions
|
@ -25,7 +25,7 @@ typedef struct mi_os_mem_config_s {
|
||||||
size_t page_size; // default to 4KiB
|
size_t page_size; // default to 4KiB
|
||||||
size_t large_page_size; // 0 if not supported, usually 2MiB (4MiB on Windows)
|
size_t large_page_size; // 0 if not supported, usually 2MiB (4MiB on Windows)
|
||||||
size_t alloc_granularity; // smallest allocation size (usually 4KiB, on Windows 64KiB)
|
size_t alloc_granularity; // smallest allocation size (usually 4KiB, on Windows 64KiB)
|
||||||
size_t physical_memory; // physical memory size
|
size_t physical_memory_in_kib; // physical memory size in KiB
|
||||||
size_t virtual_address_bits; // usually 48 or 56 bits on 64-bit systems. (used to determine secure randomization)
|
size_t virtual_address_bits; // usually 48 or 56 bits on 64-bit systems. (used to determine secure randomization)
|
||||||
bool has_overcommit; // can we reserve more memory than can be actually committed?
|
bool has_overcommit; // can we reserve more memory than can be actually committed?
|
||||||
bool has_partial_free; // can allocated blocks be freed partially? (true for mmap, false for VirtualAlloc)
|
bool has_partial_free; // can allocated blocks be freed partially? (true for mmap, false for VirtualAlloc)
|
||||||
|
|
8
src/os.c
8
src/os.c
|
@ -24,11 +24,11 @@ terms of the MIT license. A copy of the license can be found in the file
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef MI_DEFAULT_PHYSICAL_MEMORY
|
#ifndef MI_DEFAULT_PHYSICAL_MEMORY_IN_KIB
|
||||||
#if MI_INTPTR_SIZE < 8
|
#if MI_INTPTR_SIZE < 8
|
||||||
#define MI_DEFAULT_PHYSICAL_MEMORY 4*MI_GiB
|
#define MI_DEFAULT_PHYSICAL_MEMORY_IN_KIB 4*MI_MiB // 4 GiB
|
||||||
#else
|
#else
|
||||||
#define MI_DEFAULT_PHYSICAL_MEMORY 32*MI_GiB
|
#define MI_DEFAULT_PHYSICAL_MEMORY_IN_KIB 32*MI_MiB // 32 GiB
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ static mi_os_mem_config_t mi_os_mem_config = {
|
||||||
4096, // page size
|
4096, // page size
|
||||||
0, // large page size (usually 2MiB)
|
0, // large page size (usually 2MiB)
|
||||||
4096, // allocation granularity
|
4096, // allocation granularity
|
||||||
MI_DEFAULT_PHYSICAL_MEMORY,
|
MI_DEFAULT_PHYSICAL_MEMORY_IN_KIB,
|
||||||
MI_DEFAULT_VIRTUAL_ADDRESS_BITS,
|
MI_DEFAULT_VIRTUAL_ADDRESS_BITS,
|
||||||
true, // has overcommit? (if true we use MAP_NORESERVE on mmap systems)
|
true, // has overcommit? (if true we use MAP_NORESERVE on mmap systems)
|
||||||
false, // can we partially free allocated blocks? (on mmap systems we can free anywhere in a mapped range, but on Windows we must free the entire span)
|
false, // can we partially free allocated blocks? (on mmap systems we can free anywhere in a mapped range, but on Windows we must free the entire span)
|
||||||
|
|
|
@ -143,7 +143,7 @@ void _mi_prim_mem_init( mi_os_mem_config_t* config )
|
||||||
#if defined(_SC_PHYS_PAGES)
|
#if defined(_SC_PHYS_PAGES)
|
||||||
long pphys = sysconf(_SC_PHYS_PAGES);
|
long pphys = sysconf(_SC_PHYS_PAGES);
|
||||||
if (pphys > 0 && (size_t)pphys < (SIZE_MAX/(size_t)psize)) {
|
if (pphys > 0 && (size_t)pphys < (SIZE_MAX/(size_t)psize)) {
|
||||||
config->physical_memory = (size_t)pphys * (size_t)psize;
|
config->physical_memory_in_kib = (size_t)pphys * ((size_t)psize / MI_KiB);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -155,7 +155,7 @@ void _mi_prim_mem_init( mi_os_mem_config_t* config )
|
||||||
ULONGLONG memInKiB = 0;
|
ULONGLONG memInKiB = 0;
|
||||||
if ((*pGetPhysicallyInstalledSystemMemory)(&memInKiB)) {
|
if ((*pGetPhysicallyInstalledSystemMemory)(&memInKiB)) {
|
||||||
if (memInKiB > 0 && memInKiB < (SIZE_MAX / MI_KiB)) {
|
if (memInKiB > 0 && memInKiB < (SIZE_MAX / MI_KiB)) {
|
||||||
config->physical_memory = (size_t)memInKiB * MI_KiB;
|
config->physical_memory_in_kib = memInKiB;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue