summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-09-12 08:55:40 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-09-12 08:55:40 -0400
commit317abaf7d87d2ece1834a66512c0110a906f80dc (patch)
tree3a44f7559b9ad458a78336323dc2bc4ee733073e
parenta1d67326e095846d79f181807c8d4b80c61a8035 (diff)
pkev: unset flg_mgrs for index on destroy
-rw-r--r--pkev.h22
1 files changed, 17 insertions, 5 deletions
diff --git a/pkev.h b/pkev.h
index b3a9008..0ff010f 100644
--- a/pkev.h
+++ b/pkev.h
@@ -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]);
}