mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-05-08 16:29:31 +03:00
merge from dev-exp
This commit is contained in:
commit
62984c0a24
2 changed files with 13 additions and 25 deletions
|
@ -72,20 +72,6 @@ void* _mi_arena_alloc_aligned(size_t size, size_t alignment, bool* commit, b
|
||||||
void* _mi_arena_alloc(size_t size, bool* commit, bool* large, bool* is_zero, size_t* memid, mi_os_tld_t* tld);
|
void* _mi_arena_alloc(size_t size, bool* commit, bool* large, bool* is_zero, size_t* memid, mi_os_tld_t* tld);
|
||||||
void _mi_arena_free(void* p, size_t size, size_t memid, mi_stats_t* stats);
|
void _mi_arena_free(void* p, size_t size, size_t memid, mi_stats_t* stats);
|
||||||
|
|
||||||
/*
|
|
||||||
// memory.c
|
|
||||||
void* _mi_mem_alloc_aligned(size_t size, size_t alignment, bool* commit, bool* large, bool* is_zero, size_t* id, mi_os_tld_t* tld);
|
|
||||||
void _mi_mem_free(void* p, size_t size, size_t id, mi_stats_t* stats);
|
|
||||||
|
|
||||||
bool _mi_mem_reset(void* p, size_t size, mi_stats_t* stats);
|
|
||||||
bool _mi_mem_unreset(void* p, size_t size, bool* is_zero, mi_stats_t* stats);
|
|
||||||
bool _mi_mem_commit(void* p, size_t size, bool* is_zero, mi_stats_t* stats);
|
|
||||||
bool _mi_mem_protect(void* addr, size_t size);
|
|
||||||
bool _mi_mem_unprotect(void* addr, size_t size);
|
|
||||||
|
|
||||||
void _mi_mem_collect(mi_stats_t* stats);
|
|
||||||
*/
|
|
||||||
|
|
||||||
// "segment.c"
|
// "segment.c"
|
||||||
mi_page_t* _mi_segment_page_alloc(size_t block_wsize, mi_segments_tld_t* tld, mi_os_tld_t* os_tld);
|
mi_page_t* _mi_segment_page_alloc(size_t block_wsize, mi_segments_tld_t* tld, mi_os_tld_t* os_tld);
|
||||||
void _mi_segment_page_free(mi_page_t* page, bool force, mi_segments_tld_t* tld);
|
void _mi_segment_page_free(mi_page_t* page, bool force, mi_segments_tld_t* tld);
|
||||||
|
|
18
src/arena.c
18
src/arena.c
|
@ -14,6 +14,12 @@ terms of the MIT license. A copy of the license can be found in the file
|
||||||
|
|
||||||
#include <string.h> // memset
|
#include <string.h> // memset
|
||||||
|
|
||||||
|
// os.c
|
||||||
|
void* _mi_os_alloc_aligned(size_t size, size_t alignment, bool commit, bool* large, mi_os_tld_t* tld);
|
||||||
|
void* _mi_os_try_alloc_from_huge_reserved(size_t size, size_t try_alignment);
|
||||||
|
int _mi_os_reserve_huge_os_pages(size_t pages, double max_secs, size_t* pages_reserved) mi_attr_noexcept;
|
||||||
|
|
||||||
|
|
||||||
/* -----------------------------------------------------------
|
/* -----------------------------------------------------------
|
||||||
Arena allocation
|
Arena allocation
|
||||||
----------------------------------------------------------- */
|
----------------------------------------------------------- */
|
||||||
|
@ -47,17 +53,16 @@ static _Atomic(uintptr_t) mi_arena_count; // = 0
|
||||||
the arena index +1, and the upper bits the block index.
|
the arena index +1, and the upper bits the block index.
|
||||||
----------------------------------------------------------- */
|
----------------------------------------------------------- */
|
||||||
|
|
||||||
// Use `SIZE_MAX` as a special id for direct OS allocated memory.
|
// Use `0` as a special id for direct OS allocated memory.
|
||||||
#define MI_MEMID_OS (SIZE_MAX)
|
#define MI_MEMID_OS 0
|
||||||
|
|
||||||
static size_t mi_memid_create(size_t arena_index, size_t block_index) {
|
static size_t mi_memid_create(size_t arena_index, size_t block_index) {
|
||||||
mi_assert_internal(arena_index < 0xFE);
|
mi_assert_internal(arena_index < 0xFF);
|
||||||
return ((block_index << 8) | ((arena_index+1) & 0xFF));
|
return ((block_index << 8) | ((arena_index+1) & 0xFF));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mi_memid_indices(size_t memid, size_t* arena_index, size_t* block_index) {
|
static void mi_memid_indices(size_t memid, size_t* arena_index, size_t* block_index) {
|
||||||
mi_assert_internal(memid != MI_MEMID_OS);
|
mi_assert_internal(memid != MI_MEMID_OS);
|
||||||
mi_assert_internal(memid != 0);
|
|
||||||
*arena_index = (memid & 0xFF) - 1;
|
*arena_index = (memid & 0xFF) - 1;
|
||||||
*block_index = (memid >> 8);
|
*block_index = (memid >> 8);
|
||||||
}
|
}
|
||||||
|
@ -243,7 +248,7 @@ void* _mi_arena_alloc_aligned(size_t size, size_t alignment, bool* commit, bool*
|
||||||
mi_assert_internal(mi_block_is_in_use(binfo));
|
mi_assert_internal(mi_block_is_in_use(binfo));
|
||||||
mi_assert_internal(mi_block_count(binfo)*MI_ARENA_BLOCK_SIZE >= size);
|
mi_assert_internal(mi_block_count(binfo)*MI_ARENA_BLOCK_SIZE >= size);
|
||||||
#endif
|
#endif
|
||||||
* memid = mi_memid_create(i, block_index);
|
*memid = mi_memid_create(i, block_index);
|
||||||
*commit = true; // TODO: support commit on demand?
|
*commit = true; // TODO: support commit on demand?
|
||||||
*large = arena->is_large;
|
*large = arena->is_large;
|
||||||
mi_assert_internal((uintptr_t)p % alignment == 0);
|
mi_assert_internal((uintptr_t)p % alignment == 0);
|
||||||
|
@ -277,7 +282,6 @@ void _mi_arena_free(void* p, size_t size, size_t memid, mi_stats_t* stats) {
|
||||||
_mi_os_free(p, size, stats);
|
_mi_os_free(p, size, stats);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
mi_assert_internal(memid != 0);
|
|
||||||
// allocated in an arena
|
// allocated in an arena
|
||||||
size_t arena_idx;
|
size_t arena_idx;
|
||||||
size_t block_idx;
|
size_t block_idx;
|
||||||
|
@ -341,8 +345,6 @@ static bool mi_arena_add(mi_arena_t* arena) {
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
void* _mi_os_try_alloc_from_huge_reserved(size_t size, size_t try_alignment);
|
|
||||||
|
|
||||||
int mi_reserve_huge_os_pages(size_t pages, double max_secs, size_t* pages_reserved) mi_attr_noexcept {
|
int mi_reserve_huge_os_pages(size_t pages, double max_secs, size_t* pages_reserved) mi_attr_noexcept {
|
||||||
size_t pages_reserved_default = 0;
|
size_t pages_reserved_default = 0;
|
||||||
if (pages_reserved==NULL) pages_reserved = &pages_reserved_default;
|
if (pages_reserved==NULL) pages_reserved = &pages_reserved_default;
|
||||||
|
|
Loading…
Add table
Reference in a new issue