Merge branch 'dev' into dev-debug

This commit is contained in:
daan 2020-06-17 19:20:52 -07:00
commit 1759f57d7a
2 changed files with 13 additions and 10 deletions

View file

@ -106,10 +106,6 @@ const mi_heap_t _mi_heap_empty = {
// the thread-local default heap for allocation // the thread-local default heap for allocation
mi_decl_thread mi_heap_t* _mi_heap_default = (mi_heap_t*)&_mi_heap_empty; mi_decl_thread mi_heap_t* _mi_heap_default = (mi_heap_t*)&_mi_heap_empty;
#define tld_main_stats ((mi_stats_t*)((uint8_t*)&tld_main + offsetof(mi_tld_t,stats)))
#define tld_main_os ((mi_os_tld_t*)((uint8_t*)&tld_main + offsetof(mi_tld_t,os)))
extern mi_heap_t _mi_heap_main; extern mi_heap_t _mi_heap_main;
static mi_tld_t tld_main = { static mi_tld_t tld_main = {
@ -117,9 +113,9 @@ static mi_tld_t tld_main = {
&_mi_heap_main, &_mi_heap_main, &_mi_heap_main, &_mi_heap_main,
{ { NULL, NULL }, {NULL ,NULL}, {NULL ,NULL, 0}, { { NULL, NULL }, {NULL ,NULL}, {NULL ,NULL, 0},
0, 0, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 0, 0, NULL,
tld_main_stats, tld_main_os &tld_main.stats, &tld_main.os
}, // segments }, // segments
{ 0, tld_main_stats }, // os { 0, &tld_main.stats }, // os
{ MI_STATS_NULL } // stats { MI_STATS_NULL } // stats
}; };
@ -183,10 +179,15 @@ static bool _mi_heap_init(void) {
} }
else { else {
// use `_mi_os_alloc` to allocate directly from the OS // use `_mi_os_alloc` to allocate directly from the OS
mi_thread_data_t* td = (mi_thread_data_t*)_mi_os_alloc(sizeof(mi_thread_data_t),&_mi_stats_main); // Todo: more efficient allocation? mi_thread_data_t* td = (mi_thread_data_t*)_mi_os_alloc(sizeof(mi_thread_data_t), &_mi_stats_main); // Todo: more efficient allocation?
if (td == NULL) { if (td == NULL) {
_mi_error_message(ENOMEM, "failed to allocate thread local heap memory\n"); // if this fails, try once more. (issue #257)
return false; td = (mi_thread_data_t*)_mi_os_alloc(sizeof(mi_thread_data_t), &_mi_stats_main);
if (td == NULL) {
// really out of memory
_mi_error_message(ENOMEM, "unable to allocate thread local heap metadata (%zu bytes)\n", sizeof(mi_thread_data_t));
return false;
}
} }
// OS allocated so already zero initialized // OS allocated so already zero initialized
mi_tld_t* tld = &td->tld; mi_tld_t* tld = &td->tld;
@ -349,7 +350,8 @@ void mi_thread_init(void) mi_attr_noexcept
// don't further initialize for the main thread // don't further initialize for the main thread
if (_mi_is_main_thread()) return; if (_mi_is_main_thread()) return;
_mi_stat_increase(&mi_get_default_heap()->tld->stats.threads, 1); mi_heap_t* heap = mi_get_default_heap();
if (mi_heap_is_initialized(heap)) { _mi_stat_increase(&mi_get_default_heap()->tld->stats.threads, 1); }
//_mi_verbose_message("thread init: 0x%zx\n", _mi_thread_id()); //_mi_verbose_message("thread init: 0x%zx\n", _mi_thread_id());
} }

View file

@ -816,6 +816,7 @@ void* _mi_malloc_generic(mi_heap_t* heap, size_t size MI_SOURCE_XPARAM) mi_attr
if (mi_unlikely(!mi_heap_is_initialized(heap))) { if (mi_unlikely(!mi_heap_is_initialized(heap))) {
mi_thread_init(); // calls `_mi_heap_init` in turn mi_thread_init(); // calls `_mi_heap_init` in turn
heap = mi_get_default_heap(); heap = mi_get_default_heap();
if (mi_unlikely(!mi_heap_is_initialized(heap))) { return NULL; }
} }
mi_assert_internal(mi_heap_is_initialized(heap)); mi_assert_internal(mi_heap_is_initialized(heap));