improve atomic operations for the thread metadata cache

This commit is contained in:
daan 2022-04-07 20:26:35 -07:00
parent 6e5788d076
commit 185f296513

View file

@ -178,10 +178,10 @@ static mi_thread_data_t* mi_thread_data_alloc(void) {
// try to find thread metadata in the cache // try to find thread metadata in the cache
mi_thread_data_t* td; mi_thread_data_t* td;
for (int i = 0; i < TD_CACHE_SIZE; i++) { for (int i = 0; i < TD_CACHE_SIZE; i++) {
td = mi_atomic_load_ptr_relaxed(mi_thread_data_t*, &td_cache[i]); td = mi_atomic_load_ptr_relaxed(mi_thread_data_t, &td_cache[i]);
if (td != NULL) {
td = mi_atomic_exchange_ptr_acq_rel(mi_thread_data_t, &td_cache[i], NULL);
if (td != NULL) { if (td != NULL) {
mi_thread_data_t* expected = td;
if (mi_atomic_cas_weak_acq_rel(&td_cache[i], &expected, NULL)) {
return td; return td;
} }
} }
@ -202,10 +202,10 @@ static mi_thread_data_t* mi_thread_data_alloc(void) {
static void mi_thread_data_free( mi_thread_data_t* tdfree ) { static void mi_thread_data_free( mi_thread_data_t* tdfree ) {
// try to add the thread metadata to the cache // try to add the thread metadata to the cache
for (int i = 0; i < TD_CACHE_SIZE; i++) { for (int i = 0; i < TD_CACHE_SIZE; i++) {
mi_thread_data_t* td = mi_atomic_load_ptr_relaxed(mi_thread_data_t*, &td_cache[i]); mi_thread_data_t* td = mi_atomic_load_ptr_relaxed(mi_thread_data_t, &td_cache[i]);
if (td == NULL) { if (td == NULL) {
mi_thread_data_t* expected = NULL; mi_thread_data_t* expected = NULL;
if (mi_atomic_cas_weak_acq_rel(&td_cache[i], &expected, tdfree)) { if (mi_atomic_cas_ptr_weak_acq_rel(mi_thread_data_t, &td_cache[i], &expected, tdfree)) {
return; return;
} }
} }
@ -217,10 +217,10 @@ static void mi_thread_data_free( mi_thread_data_t* tdfree ) {
static void mi_thread_data_collect(void) { static void mi_thread_data_collect(void) {
// free all thread metadata from the cache // free all thread metadata from the cache
for (int i = 0; i < TD_CACHE_SIZE; i++) { for (int i = 0; i < TD_CACHE_SIZE; i++) {
mi_thread_data_t* td = mi_atomic_load_ptr_relaxed(mi_thread_data_t*, &td_cache[i]); mi_thread_data_t* td = mi_atomic_load_ptr_relaxed(mi_thread_data_t, &td_cache[i]);
if (td != NULL) {
td = mi_atomic_exchange_ptr_acq_rel(mi_thread_data_t, &td_cache[i], NULL);
if (td != NULL) { if (td != NULL) {
mi_thread_data_t* expected = td;
if (mi_atomic_cas_weak_acq_rel(&td_cache[i], &expected, NULL)) {
_mi_os_free( td, sizeof(mi_thread_data_t), &_mi_stats_main ); _mi_os_free( td, sizeof(mi_thread_data_t), &_mi_stats_main );
} }
} }