diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2024-11-05 14:29:38 -0500 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2024-11-05 14:29:38 -0500 |
| commit | 97ebed50299030af9930413f8abed7a5f52e8d68 (patch) | |
| tree | 8a3f751b2baed282ff9d3d9b790371ee418d909f /test/pkev.cpp | |
| parent | 5b7f401e9f6478f21208f842d6acd3fecffed712 (diff) | |
pkev: pk_ev_emit user_data + ev grow cpp test
Diffstat (limited to 'test/pkev.cpp')
| -rw-r--r-- | test/pkev.cpp | 107 |
1 files changed, 86 insertions, 21 deletions
diff --git a/test/pkev.cpp b/test/pkev.cpp index 6a12141..3d8745a 100644 --- a/test/pkev.cpp +++ b/test/pkev.cpp @@ -4,27 +4,19 @@ #include "../pkmacros.h" #include <cstdio> -#include <string> +#include <future> +#include <thread> struct ev { + pk_ev_mgr_id_T evmgr; + pk_ev_id_T evid; + int count; bool handled; }; struct ev ev_one = {0}; struct ev ev_two = {0}; -void -handle_ev_one() -{ - ev_one.handled = true; -} - -void -handle_ev_two() -{ - ev_two.handled = true; -} - const pk_ev_mgr_id_T test_setup() { @@ -36,30 +28,103 @@ test_setup() PK_LOGV_ERR("%s: failed to create pk_ev_mgr\n", __FILE__); exit(1); } + ev_one.evmgr = evmgr; + ev_two.evmgr = evmgr; return evmgr; } +struct cb_data { + int i; + struct ev *ev; +}; + +void stress_cb(void *user_data) { + struct cb_data *data = reinterpret_cast<struct cb_data*>(user_data); + data->ev[data->i].handled = true; + data->ev[data->i].count += 1; +} + +void invoke_packged_task(void* ptr) { + (*static_cast<std::packaged_task<void()>*>(ptr))(); +} + int main(int argc, char *argv[]) { (void)argc; (void)argv; (void)stdout; - pk_ev_id_T custom_ev_one = 1; - pk_ev_id_T custom_ev_two = 2; + int i, ii; + // register, emit, catch { + 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(); - custom_ev_one = pk_ev_register_ev(evmgr); - custom_ev_two = pk_ev_register_ev(evmgr); - pk_ev_register_cb(evmgr, custom_ev_one, handle_ev_one); - pk_ev_register_cb(evmgr, custom_ev_two, handle_ev_two); - pk_ev_emit(evmgr, custom_ev_one); - pk_ev_emit(evmgr, custom_ev_two); + ev_one.evid = pk_ev_register_ev(evmgr); + ev_two.evid = pk_ev_register_ev(evmgr); + pk_ev_register_cb(evmgr, ev_one.evid, &invoke_packged_task); + pk_ev_register_cb(evmgr, ev_two.evid, &invoke_packged_task); + pk_ev_emit(evmgr, ev_one.evid, &handle_ev_one); + pk_ev_emit(evmgr, ev_two.evid, &handle_ev_two); PK_LOGV_INF("%s: ev_one: %b, ev_two: %b\n", __FILE__, ev_one.handled, ev_two.handled); pk_ev_teardown(); + fflush(stdout); + fflush(stderr); if (ev_one.handled == false || ev_two.handled == false) exit(1); } + // threaded register, emit, catch + { + std::packaged_task<void()> handle_ev_one([](){ ev_one.handled = true; }); + std::packaged_task<void()> handle_ev_two([](){ ev_two.handled = true; }); + const pk_ev_mgr_id_T evmgr = test_setup(); + ev_one.evid = pk_ev_register_ev(evmgr); + ev_two.evid = pk_ev_register_ev(evmgr); + pk_ev_register_cb(evmgr, ev_one.evid, &invoke_packged_task); + pk_ev_register_cb(evmgr, ev_two.evid, &invoke_packged_task); + auto t1 = std::thread([&handle_ev_one]() { pk_ev_emit(ev_one.evmgr, ev_one.evid, &handle_ev_one); }); + auto t2 = std::thread([&handle_ev_two]() { pk_ev_emit(ev_two.evmgr, ev_two.evid, &handle_ev_two); }); + t1.join(); + t2.join(); + PK_LOGV_INF("%s: ev_one: %b, ev_two: %b\n", __FILE__, ev_one.handled, ev_two.handled); + pk_ev_teardown(); + fflush(stdout); + fflush(stderr); + if (ev_one.handled == false || ev_two.handled == false) exit(1); + } + + // overload cbs and evs + { + const uint64_t cb_count = PK_EV_INIT_CB_COUNT + 2; + const uint64_t ev_count = PK_EV_INIT_EV_COUNT + 2; + struct ev evs[ev_count] = {{0}}; + const pk_ev_mgr_id_T evmgr = test_setup(); + for (i = 0; i < ev_count; ++i) { + evs[i].evmgr = evmgr; + evs[i].evid = pk_ev_register_ev(evmgr); + for (ii = 0; ii < cb_count; ++ii) { + pk_ev_register_cb(evmgr, evs[i].evid, &stress_cb); + } + } + + for (i = 0; i < ev_count; ++i) { + struct cb_data *d = new struct cb_data{}; + d->ev = evs; + d->i = i; + pk_ev_emit(evs[i].evmgr, evs[i].evid, d); + } + + bool any_false = false; + for (i = 0; i < ev_count; ++i) { + PK_LOGV_INF("%s: ev# %.2i: %b, called count: %i\n", __FILE__, i, evs[i].handled, evs[i].count); + any_false = any_false || !evs[i].handled; + } + pk_ev_teardown(); + fflush(stdout); + fflush(stderr); + if (any_false == true) exit(1); + } + return 0; } |
