merge from dev-exp

This commit is contained in:
daan 2019-10-31 18:44:48 -07:00
commit 62984c0a24
2 changed files with 13 additions and 25 deletions

View file

@ -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_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"
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);

View file

@ -14,6 +14,12 @@ terms of the MIT license. A copy of the license can be found in the file
#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
----------------------------------------------------------- */
@ -47,17 +53,16 @@ static _Atomic(uintptr_t) mi_arena_count; // = 0
the arena index +1, and the upper bits the block index.
----------------------------------------------------------- */
// Use `SIZE_MAX` as a special id for direct OS allocated memory.
#define MI_MEMID_OS (SIZE_MAX)
// Use `0` as a special id for direct OS allocated memory.
#define MI_MEMID_OS 0
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));
}
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 != 0);
*arena_index = (memid & 0xFF) - 1;
*block_index = (memid >> 8);
}
@ -173,7 +178,7 @@ static void* mi_arena_allocx(mi_arena_t* arena, size_t start_idx, size_t end_idx
continue;
}
else {
// got it, now split off the needed part
// got it, now split off the needed part
if (needed_bcount < bcount) {
mi_atomic_write(block + needed_bcount, mi_block_info_create(bcount - needed_bcount, false));
mi_atomic_write(block, mi_block_info_create(needed_bcount, true));
@ -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_count(binfo)*MI_ARENA_BLOCK_SIZE >= size);
#endif
* memid = mi_memid_create(i, block_index);
*memid = mi_memid_create(i, block_index);
*commit = true; // TODO: support commit on demand?
*large = arena->is_large;
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);
}
else {
mi_assert_internal(memid != 0);
// allocated in an arena
size_t arena_idx;
size_t block_idx;
@ -322,7 +326,7 @@ static bool mi_arena_add(mi_arena_t* arena) {
mi_assert_internal((uintptr_t)arena->start % MI_SEGMENT_ALIGN == 0);
mi_assert_internal(arena->block_count > 0);
mi_assert_internal(mi_mem_is_zero(arena->blocks,arena->block_count*sizeof(mi_block_info_t)));
uintptr_t i = mi_atomic_addu(&mi_arena_count,1);
if (i >= MI_MAX_ARENAS) {
mi_atomic_subu(&mi_arena_count, 1);
@ -341,8 +345,6 @@ static bool mi_arena_add(mi_arena_t* arena) {
#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 {
size_t pages_reserved_default = 0;
if (pages_reserved==NULL) pages_reserved = &pages_reserved_default;
@ -365,4 +367,4 @@ int mi_reserve_huge_os_pages(size_t pages, double max_secs, size_t* pages_reserv
//mi_atomic_write(&arena->blocks[0], mi_block_info_create(bcount, false));
mi_arena_add(arena);
return 0;
}
}