diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-11-13 15:57:50 -0500 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-11-13 15:58:06 -0500 |
| commit | 86c6570e6b42ea9cc7d3af35bea74ca0dd8c665c (patch) | |
| tree | 43aa3b278c01d1837bcf10d68c4bdc8e0c1feed4 | |
| parent | 45dd0537446e6343bc4a975be21e0f0d1ec655cd (diff) | |
pkev: unused_evs always store, ignore left/right
| -rw-r--r-- | pkev.h | 14 | ||||
| -rw-r--r-- | test/pkev.cpp | 7 |
2 files changed, 11 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; diff --git a/test/pkev.cpp b/test/pkev.cpp index a577e66..c557d53 100644 --- a/test/pkev.cpp +++ b/test/pkev.cpp @@ -144,8 +144,11 @@ int main(int argc, char *argv[]) std::packaged_task<void()> handle_ev_one([](){ ev_one.handled = true; }); std::packaged_task<void()> handle_ev_two([](){ ev_two.handled = true; }); pk_ev_mgr_id_T evmgr = test_setup(); + PK_TEST_ASSERT_EQ_EXIT(0xFFFFFFFFFFFFFFFF, pk_ev_mstr.mgrs[evmgr]->unused_evs); ev_one.evid = pk_ev_register_ev(evmgr, NULL); + PK_TEST_ASSERT_EQ_EXIT(0xFFFFFFFFFFFFFFFE, pk_ev_mstr.mgrs[evmgr]->unused_evs); ev_two.evid = pk_ev_register_ev(evmgr, NULL); + PK_TEST_ASSERT_EQ_EXIT(0xFFFFFFFFFFFFFFFC, pk_ev_mstr.mgrs[evmgr]->unused_evs); pk_ev_register_cb(evmgr, ev_one.evid, &invoke_packged_task, NULL); pk_ev_register_cb(evmgr, ev_two.evid, &invoke_packged_task, NULL); PK_LOGV_INF("%s: ev_one: %lu, ev_two: %lu\n", __FILE__, ev_one.evid, ev_two.evid); @@ -154,6 +157,7 @@ int main(int argc, char *argv[]) PK_TEST_ASSERT_EQ_EXIT(0, ev_one.evid); PK_TEST_ASSERT_EQ_EXIT(1, ev_two.evid); pk_ev_unregister_ev(ev_one.evmgr, ev_one.evid); + PK_TEST_ASSERT_EQ_EXIT(0xFFFFFFFFFFFFFFFD, pk_ev_mstr.mgrs[evmgr]->unused_evs); pk_ev_emit(evmgr, ev_one.evid, &handle_ev_one); pk_ev_emit(evmgr, ev_two.evid, &handle_ev_two); @@ -163,13 +167,16 @@ int main(int argc, char *argv[]) PK_TEST_ASSERT_NEQ_EXIT(true, ev_one.handled); PK_TEST_ASSERT_NEQ_EXIT(false, ev_two.handled); pk_ev_unregister_ev(ev_two.evmgr, ev_two.evid); + PK_TEST_ASSERT_EQ_EXIT(0xFFFFFFFFFFFFFFFF, pk_ev_mstr.mgrs[evmgr]->unused_evs); std::packaged_task<void()> handle_ev_thr([](){ ev_one.handled = true; }); std::packaged_task<void()> handle_ev_for([](){ ev_two.handled = true; }); ev_one.handled = false; ev_two.handled = false; ev_one.evid = pk_ev_register_ev(evmgr, NULL); + PK_TEST_ASSERT_EQ_EXIT(0xFFFFFFFFFFFFFFFE, pk_ev_mstr.mgrs[evmgr]->unused_evs); ev_two.evid = pk_ev_register_ev(evmgr, NULL); + PK_TEST_ASSERT_EQ_EXIT(0xFFFFFFFFFFFFFFFC, pk_ev_mstr.mgrs[evmgr]->unused_evs); pk_ev_register_cb(evmgr, ev_one.evid, &invoke_packged_task, NULL); pk_ev_register_cb(evmgr, ev_two.evid, &invoke_packged_task, NULL); PK_LOGV_INF("%s: ev_one: %lu, ev_two: %lu\n", __FILE__, ev_one.evid, ev_two.evid); |
