summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pkev.h14
-rw-r--r--test/pkev.cpp7
2 files changed, 11 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;
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);