mi_heap_t *current_object_heap;
mi_heap_t heaps[_Py_MIMALLOC_HEAP_COUNT];
mi_tld_t tld;
+ int initialized;
struct llist_node page_list;
};
#endif
// visit each thread's heaps for GC objects
for (PyThreadState *p = interp->threads.head; p != NULL; p = p->next) {
struct _mimalloc_thread_state *m = &((_PyThreadStateImpl *)p)->mimalloc;
+ if (!_Py_atomic_load_int(&m->initialized)) {
+ // The thread may not have called tstate_mimalloc_bind() yet.
+ continue;
+ }
arg->offset = offset_base;
if (!mi_heap_visit_blocks(&m->heaps[_Py_MIMALLOC_HEAP_GC], true,
// _PyObject_GC_New() and similar functions temporarily override this to
// use one of the GC heaps.
mts->current_object_heap = &mts->heaps[_Py_MIMALLOC_HEAP_OBJECT];
+
+ _Py_atomic_store_int(&mts->initialized, 1);
#endif
}
race_top:_add_to_weak_set
race_top:_in_weak_set
-race_top:_mi_heap_delayed_free_partial
race_top:_PyEval_EvalFrameDefault
race_top:_PyImport_AcquireLock
race_top:_PyImport_ReleaseLock
race_top:assign_version_tag
race_top:insertdict
race_top:lookup_tp_dict
-race_top:mi_heap_visit_pages
race_top:PyMember_GetOne
race_top:PyMember_SetOne
race_top:new_reference
race_top:add_threadstate
race_top:dump_traceback
race_top:fatal_error
-race_top:mi_page_decode_padding
race_top:_multiprocessing_SemLock_release_impl
race_top:_PyFrame_GetCode
race_top:_PyFrame_Initialize