diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-09-16 16:13:19 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-09-16 16:13:19 -0400 |
| commit | d9422b3e34fd5923aabc488cf9379f698d473c12 (patch) | |
| tree | b74796905e0a44fef0c96c6fb0157ccecc88ddcd | |
| parent | 9da4ad75a7395a2656ea17203197eda890e8093d (diff) | |
pke: update pk.h to 0.9.3
| -rw-r--r-- | src/pk.h | 32 |
1 files changed, 22 insertions, 10 deletions
@@ -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]); } |
