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 | |
| parent | 5b7f401e9f6478f21208f842d6acd3fecffed712 (diff) | |
pkev: pk_ev_emit user_data + ev grow cpp test
Diffstat (limited to 'test')
| -rw-r--r-- | test/pkev.c | 54 | ||||
| -rw-r--r-- | test/pkev.cpp | 107 |
2 files changed, 130 insertions, 31 deletions
diff --git a/test/pkev.c b/test/pkev.c index c3bfeb9..a738e70 100644 --- a/test/pkev.c +++ b/test/pkev.c @@ -6,6 +6,8 @@ #include <stdio.h> struct ev { + pk_ev_mgr_id_T evmgr; + pk_ev_id_T evid; bool handled; }; @@ -13,17 +15,31 @@ struct ev ev_one = {0}; struct ev ev_two = {0}; void -handle_ev_one() +handle_ev_one(void *) { ev_one.handled = true; } void -handle_ev_two() +handle_ev_two(void *) { ev_two.handled = true; } +int +thrd_ev_emit_one(void *) +{ + pk_ev_emit(ev_one.evmgr, ev_one.evid, NULL); + return 0; +} + +int +thrd_ev_emit_two(void *) +{ + pk_ev_emit(ev_two.evmgr, ev_two.evid, NULL); + return 0; +} + const pk_ev_mgr_id_T test_setup() { @@ -35,6 +51,8 @@ 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; } @@ -43,18 +61,34 @@ int main(int argc, char *argv[]) (void)argc; (void)argv; (void)stdout; - pk_ev_id_T custom_ev_one; - pk_ev_id_T custom_ev_two; + int i; // register, emit, catch { const 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, handle_ev_one); + pk_ev_register_cb(evmgr, ev_two.evid, handle_ev_two); + pk_ev_emit(evmgr, ev_one.evid, NULL); + pk_ev_emit(evmgr, ev_two.evid, NULL); + PK_LOGV_INF("%s: ev_one: %b, ev_two: %b\n", __FILE__, ev_one.handled, ev_two.handled); + pk_ev_teardown(); + if (ev_one.handled == false || ev_two.handled == false) exit(1); + } + + // threaded register, emit, catch + { + thrd_t t1, t2; + 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, handle_ev_one); + pk_ev_register_cb(evmgr, ev_two.evid, handle_ev_two); + thrd_create(&t1, thrd_ev_emit_one, NULL); + thrd_create(&t2, thrd_ev_emit_two, NULL); + thrd_join(t1, &i); + thrd_join(t2, &i); PK_LOGV_INF("%s: ev_one: %b, ev_two: %b\n", __FILE__, ev_one.handled, ev_two.handled); pk_ev_teardown(); if (ev_one.handled == false || ev_two.handled == false) exit(1); 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; } |
