diff options
author | daan <daan@effp.org> | 2022-04-07 20:26:35 -0700 |
---|---|---|
committer | daan <daan@effp.org> | 2022-04-07 20:26:35 -0700 |
commit | 185f296513da2bfcdb413f7c4821bf238c35e035 (patch) | |
tree | b61a94d25e49fa031bdcbda58fd316c79229babe /src | |
parent | 6e5788d076f78b25d19c1afbc3b9a3434c38dcfa (diff) |
improve atomic operations for the thread metadata cache
Diffstat (limited to 'src')
-rw-r--r-- | src/init.c | 16 |
1 files changed, 8 insertions, 8 deletions
@@ -178,10 +178,10 @@ static mi_thread_data_t* mi_thread_data_alloc(void) { // try to find thread metadata in the cache mi_thread_data_t* td; 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) { - mi_thread_data_t* expected = td; - if (mi_atomic_cas_weak_acq_rel(&td_cache[i], &expected, NULL)) { + td = mi_atomic_exchange_ptr_acq_rel(mi_thread_data_t, &td_cache[i], NULL); + if (td != NULL) { 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 ) { // try to add the thread metadata to the cache 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) { 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; } } @@ -217,10 +217,10 @@ static void mi_thread_data_free( mi_thread_data_t* tdfree ) { static void mi_thread_data_collect(void) { // free all thread metadata from the cache 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) { - mi_thread_data_t* expected = td; - if (mi_atomic_cas_weak_acq_rel(&td_cache[i], &expected, NULL)) { + td = mi_atomic_exchange_ptr_acq_rel(mi_thread_data_t, &td_cache[i], NULL); + if (td != NULL) { _mi_os_free( td, sizeof(mi_thread_data_t), &_mi_stats_main ); } } |