diff options
Diffstat (limited to 'pkev.h')
| -rw-r--r-- | pkev.h | 14 |
1 files changed, 4 insertions, 10 deletions
@@ -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; |
