summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-09-16 16:13:19 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-09-16 16:13:19 -0400
commitd9422b3e34fd5923aabc488cf9379f698d473c12 (patch)
treeb74796905e0a44fef0c96c6fb0157ccecc88ddcd
parent9da4ad75a7395a2656ea17203197eda890e8093d (diff)
pke: update pk.h to 0.9.3
-rw-r--r--src/pk.h32
1 files changed, 22 insertions, 10 deletions
diff --git a/src/pk.h b/src/pk.h
index 0df1741..f21bc1b 100644
--- a/src/pk.h
+++ b/src/pk.h
@@ -1,7 +1,7 @@
#ifndef PK_SINGLE_HEADER_FILE_H
#define PK_SINGLE_HEADER_FILE_H
/*******************************************************************************
-* PK Single-Header-Library V0.9.2
+* PK Single-Header-Library V0.9.3
*
* Author: Jonathan Bradley
* Copyright: © 2024-2025 Jonathan Bradley
@@ -291,7 +291,7 @@
*
*******************************************************************************/
-#define PK_VERSION "0.9.2"
+#define PK_VERSION "0.9.3"
#ifdef PK_IMPL_ALL
# ifndef PK_IMPL_MEM_TYPES
@@ -364,9 +364,9 @@
((byte) & 0x02 ? '1' : '0'), \
((byte) & 0x01 ? '1' : '0')
#define PK_TO_BIN_8(u8) PK_TO_BIN(u8)
-#define PK_TO_BIN_16(u16) PK_TO_BIN((u16 >> 8)), PK_TO_BIN(u16 & 0x00FF)
-#define PK_TO_BIN_32(u32) PK_TO_BIN_16((u32 >> 16)), PK_TO_BIN_16(u32 & 0x0000FFFF)
-#define PK_TO_BIN_64(u64) PK_TO_BIN_32((u64 >> 32)), PK_TO_BIN_32(u64 & 0x00000000FFFFFFFF)
+#define PK_TO_BIN_16(u16) PK_TO_BIN((u16 >> 8)), PK_TO_BIN((u16 & 0x00FF))
+#define PK_TO_BIN_32(u32) PK_TO_BIN_16((u32 >> 16)), PK_TO_BIN_16((u32 & 0x0000FFFF))
+#define PK_TO_BIN_64(u64) PK_TO_BIN_32((u64 >> 32)), PK_TO_BIN_32((u64 & 0x00000000FFFFFFFF))
#if defined(__cplusplus)
# define CAFE_BABE(T) reinterpret_cast<T *>(0xCAFEBABE)
@@ -1526,7 +1526,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);
}
@@ -1550,7 +1550,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),
@@ -1634,14 +1634,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;
@@ -1656,11 +1656,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]);
}