diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-09-12 08:55:40 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-09-12 08:55:40 -0400 |
| commit | 317abaf7d87d2ece1834a66512c0110a906f80dc (patch) | |
| tree | 3a44f7559b9ad458a78336323dc2bc4ee733073e | |
| parent | a1d67326e095846d79f181807c8d4b80c61a8035 (diff) | |
pkev: unset flg_mgrs for index on destroy
| -rw-r--r-- | pkev.h | 22 |
1 files changed, 17 insertions, 5 deletions
@@ -109,7 +109,7 @@ pk_ev_init(struct pk_membucket* bkt) for (i = 0; i < PK_EV_INIT_MGR_COUNT; ++i) { mtx_init(&pk_ev_mstr.mtxs[i], mtx_plain); } - atomic_store(&pk_ev_mstr.flg_mgrs, 0); + atomic_store(&pk_ev_mstr.flg_mgrs, 0lu); atomic_store(&pk_ev_mstr.rn_mgrs, PK_EV_INIT_MGR_COUNT); } @@ -133,7 +133,7 @@ pk_ev_teardown() { long unsigned int i; for (i = 0; i < atomic_load(&pk_ev_mstr.rn_mgrs); ++i) { - if ((atomic_load(&pk_ev_mstr.flg_mgrs) & (1lu << i)) == 0) continue; + if ((atomic_load(&pk_ev_mstr.flg_mgrs) & (1lu << i)) == 0lu) continue; mtx_lock(&pk_ev_mstr.mtxs[i]); size_t sz = pk_ev_inner_calc_sz( atomic_load(&pk_ev_mstr.mgrs[i]->rn_ev), @@ -217,14 +217,14 @@ start: while (1) { flg_new = flg; for (i = 0; i < atomic_load(&pk_ev_mstr.rn_mgrs); ++i) { - if ((flg & (1u << i)) == 0) break; + if ((flg & (1lu << i)) == 0) break; } if (i == atomic_load(&pk_ev_mstr.rn_mgrs)) { goto recreate; } id = i; - flg_new |= (1u << i); - if (atomic_compare_exchange_strong(&pk_ev_mstr.flg_mgrs, &flg, flg_new)) break; + flg_new |= (1lu << i); + if (atomic_compare_exchange_weak(&pk_ev_mstr.flg_mgrs, &flg, flg_new)) break; thrd_yield(); } pk_ev_mstr.mgrs[id]= mgr; @@ -239,11 +239,23 @@ recreate: void pk_ev_destroy_mgr(pk_ev_mgr_id_T evmgr) { + pk_ev_mgr_id_T flg; + pk_ev_mgr_id_T flg_new; assert(evmgr < pk_ev_mstr.rn_mgrs); mtx_lock(&pk_ev_mstr.mtxs[evmgr]); + size_t old_sz = pk_ev_inner_calc_sz(pk_ev_mstr.mgrs[evmgr]->rn_ev, pk_ev_mstr.mgrs[evmgr]->rn_cb, NULL, NULL); PK_EV_MEM_FREE(pk_ev_mstr.mgrs[evmgr], old_sz, pk_ev_mstr.bkt); pk_ev_mstr.mgrs[evmgr] = NULL; + + flg = atomic_load(&pk_ev_mstr.flg_mgrs); + while (1) { + flg_new = flg; + flg_new &= ~(1lu << evmgr); + if (atomic_compare_exchange_weak(&pk_ev_mstr.flg_mgrs, &flg, flg_new)) break; + thrd_yield(); + } + mtx_unlock(&pk_ev_mstr.mtxs[evmgr]); } |
