summaryrefslogtreecommitdiff
path: root/pkev.h
diff options
context:
space:
mode:
Diffstat (limited to 'pkev.h')
-rw-r--r--pkev.h14
1 files changed, 4 insertions, 10 deletions
diff --git a/pkev.h b/pkev.h
index d0a18a6..17e04ac 100644
--- a/pkev.h
+++ b/pkev.h
@@ -299,7 +299,6 @@ pk_ev_register_ev(pk_ev_mgr_id_T evmgr, void *user_ev_data)
uint64_t new_size;
uint64_t i, ii, flg;
pk_ev_id_T id;
- bool found = false;
struct pk_ev_mgr *mgr = nullptr;
mtx_lock(&pk_ev_mstr.mtxs[evmgr]);
mgr = pk_ev_mstr.mgrs[evmgr];
@@ -317,26 +316,21 @@ pk_ev_register_ev(pk_ev_mgr_id_T evmgr, void *user_ev_data)
pk_ev_mstr.mgrs[evmgr] = mgr;
}
id = atomic_load(&mgr->left_evs);
+ flg = atomic_load(&mgr->unused_evs);
if (mgr->left_evs != mgr->right_evs) {
- i = atomic_load(&mgr->left_evs);
+ i = atomic_load(&mgr->left_evs) + 1;
ii = atomic_load(&mgr->rn_ev);
- flg = atomic_load(&mgr->unused_evs);
- for (; i < ii; ++i) {
+ for (; i <= ii; ++i) {
if (flg & (1lu << i)) {
- if (!found) {
- found = true;
- flg &= ~(1lu << i);
- continue;
- }
break;
}
}
atomic_store(&mgr->left_evs, i);
- atomic_store(&mgr->unused_evs, flg);
} else {
atomic_store(&mgr->left_evs, atomic_load(&mgr->left_evs) + 1);
atomic_store(&mgr->right_evs, atomic_load(&mgr->right_evs) + 1);
}
+ atomic_store(&mgr->unused_evs, flg & ~(1lu << id));
mtx_unlock(&pk_ev_mstr.mtxs[evmgr]);
mgr->ev[id].user_ev_data = user_ev_data;
return id;