summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2024-11-05 14:29:38 -0500
committerJonathan Bradley <jcb@pikum.xyz>2024-11-05 14:29:38 -0500
commit97ebed50299030af9930413f8abed7a5f52e8d68 (patch)
tree8a3f751b2baed282ff9d3d9b790371ee418d909f /test
parent5b7f401e9f6478f21208f842d6acd3fecffed712 (diff)
pkev: pk_ev_emit user_data + ev grow cpp test
Diffstat (limited to 'test')
-rw-r--r--test/pkev.c54
-rw-r--r--test/pkev.cpp107
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;
}