summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2024-11-05 20:23:38 -0500
committerJonathan Bradley <jcb@pikum.xyz>2024-11-05 20:23:38 -0500
commitfce5a4841f725cecaae5925b0e63144c24e5dc81 (patch)
tree1f82a7edf773f92e428d6e83d091d15addbd2850
parent06677d6aa1d477253e65015101d1185e74ee8054 (diff)
pkev: data at every level
-rw-r--r--pkev.h51
-rw-r--r--test/pkev.c20
-rw-r--r--test/pkev.cpp24
3 files changed, 54 insertions, 41 deletions
diff --git a/pkev.h b/pkev.h
index a9ec199..75090b5 100644
--- a/pkev.h
+++ b/pkev.h
@@ -14,11 +14,11 @@ void pk_ev_teardown();
const pk_ev_mgr_id_T pk_ev_create_mgr();
void pk_ev_destroy_mgr(pk_ev_mgr_id_T evmgr);
-typedef void (pk_ev_cb)(void *);
+typedef void (pk_ev_cb_fn)(void *user_event_data, void *user_cb_data, void *user_ev_data);
-const pk_ev_id_T pk_ev_register_ev(pk_ev_mgr_id_T evmgr);
-bool pk_ev_register_cb(pk_ev_mgr_id_T evmgr, pk_ev_id_T evid, pk_ev_cb *cb);
-void pk_ev_emit(pk_ev_mgr_id_T evmgr, pk_ev_id_T evid, void *user_data);
+const pk_ev_id_T pk_ev_register_ev(pk_ev_mgr_id_T evmgr, void *user_ev_data);
+bool pk_ev_register_cb(pk_ev_mgr_id_T evmgr, pk_ev_id_T evid, pk_ev_cb_fn *cb, void *user_cb_data);
+void pk_ev_emit(pk_ev_mgr_id_T evmgr, pk_ev_id_T evid, void *user_emit_data);
#endif /* PK_EV_H */
@@ -48,9 +48,15 @@ void pk_ev_emit(pk_ev_mgr_id_T evmgr, pk_ev_id_T evid, void *user_data);
# define PK_EV_GROW_RATIO 1.5
#endif
+struct pk_ev_cb {
+ pk_ev_cb_fn *cb;
+ void *user_cb_data;
+};
+
struct pk_ev {
- pk_ev_cb **cb;
- atomic_uint_fast8_t n_cb;
+ struct pk_ev_cb *ev_cbs;
+ void *user_ev_data;
+ atomic_uint_fast8_t n_ev_cbs;
};
struct pk_ev_mgr {
@@ -107,8 +113,8 @@ pk_ev_inner_ev_mgr_create(uint64_t ev_count, uint64_t cb_count)
{
int i;
struct pk_ev *ev;
- size_t sz = sizeof(struct pk_ev_mgr) + ((sizeof(struct pk_ev) * ev_count)) + (sizeof (void *) * ev_count * cb_count);
- size_t sz_ev = (sizeof(pk_ev_cb*) * cb_count);
+ size_t sz = sizeof(struct pk_ev_mgr) + ((sizeof(struct pk_ev) * ev_count)) + (sizeof (struct pk_ev_cb) * ev_count * cb_count);
+ size_t sz_ev = (sizeof(struct pk_ev_cb) * cb_count);
size_t sz_evs = sizeof(struct pk_ev) * ev_count;
struct pk_ev_mgr *mgr = (struct pk_ev_mgr*)malloc(sz);
@@ -121,8 +127,8 @@ pk_ev_inner_ev_mgr_create(uint64_t ev_count, uint64_t cb_count)
atomic_init(&mgr->n_ev, 0);
for (i = 0; i < mgr->rn_ev; ++i) {
ev = &mgr->ev[i];
- atomic_init(&ev->n_cb, 0);
- ev->cb = (pk_ev_cb**)(((char *)mgr) + sizeof(struct pk_ev_mgr) + sz_evs + (sz_ev * i));
+ atomic_init(&ev->n_ev_cbs, 0);
+ ev->ev_cbs = (struct pk_ev_cb*)(((char *)mgr) + sizeof(struct pk_ev_mgr) + sz_evs + (sz_ev * i));
}
early_exit:
@@ -139,8 +145,8 @@ pk_ev_inner_ev_mgr_clone(struct pk_ev_mgr *old, struct pk_ev_mgr *mgr)
for (i = 0; i < old->n_ev; ++i) {
ev_old = &old->ev[i];
ev = &mgr->ev[i];
- memcpy(ev->cb, ev_old->cb, sizeof(pk_ev_cb*) * atomic_load(&ev_old->n_cb));
- atomic_store(&ev->n_cb, atomic_load(&ev_old->n_cb));
+ memcpy(ev->ev_cbs, ev_old->ev_cbs, sizeof(struct pk_ev_cb) * atomic_load(&ev_old->n_ev_cbs));
+ atomic_store(&ev->n_ev_cbs, atomic_load(&ev_old->n_ev_cbs));
}
}
@@ -188,7 +194,7 @@ pk_ev_destroy_mgr(pk_ev_mgr_id_T evmgr)
}
inline const pk_ev_id_T
-pk_ev_register_ev(pk_ev_mgr_id_T evmgr)
+pk_ev_register_ev(pk_ev_mgr_id_T evmgr, void *user_ev_data)
{
assert(evmgr < 64);
pk_ev_id_T id;
@@ -201,34 +207,41 @@ pk_ev_register_ev(pk_ev_mgr_id_T evmgr)
pk_ev_mstr.mgrs[evmgr] = mgr;
}
id = pk_ev_mstr.mgrs[evmgr]->n_ev++;
+ pk_ev_mstr.mgrs[evmgr]->ev[id].user_ev_data = user_ev_data;
mtx_unlock(&pk_ev_mstr.mtxs[evmgr]);
return id;
}
inline bool
-pk_ev_register_cb(pk_ev_mgr_id_T evmgr, pk_ev_id_T evid, pk_ev_cb *cb)
+pk_ev_register_cb(pk_ev_mgr_id_T evmgr, pk_ev_id_T evid, pk_ev_cb_fn *cb, void *user_cb_data)
{
assert(evmgr < 64);
struct pk_ev_mgr *mgr;
+ uint8_t cb_index;
mtx_lock(&pk_ev_mstr.mtxs[evmgr]);
- if (pk_ev_mstr.mgrs[evmgr]->ev[evid].n_cb == pk_ev_mstr.mgrs[evmgr]->rn_cb) {
+ if (pk_ev_mstr.mgrs[evmgr]->ev[evid].n_ev_cbs == pk_ev_mstr.mgrs[evmgr]->rn_cb) {
mgr = pk_ev_inner_ev_mgr_create(pk_ev_mstr.mgrs[evmgr]->rn_ev, pk_ev_mstr.mgrs[evmgr]->rn_cb * PK_EV_GROW_RATIO);
pk_ev_inner_ev_mgr_clone(pk_ev_mstr.mgrs[evmgr], mgr);
free(pk_ev_mstr.mgrs[evmgr]);
pk_ev_mstr.mgrs[evmgr] = mgr;
}
- pk_ev_mstr.mgrs[evmgr]->ev[evid].cb[pk_ev_mstr.mgrs[evmgr]->ev[evid].n_cb++] = cb;
+ cb_index = pk_ev_mstr.mgrs[evmgr]->ev[evid].n_ev_cbs++;
+ pk_ev_mstr.mgrs[evmgr]->ev[evid].ev_cbs[cb_index].cb = cb;
+ pk_ev_mstr.mgrs[evmgr]->ev[evid].ev_cbs[cb_index].user_cb_data = user_cb_data;
mtx_unlock(&pk_ev_mstr.mtxs[evmgr]);
return true;
}
inline void
-pk_ev_emit(pk_ev_mgr_id_T evmgr, pk_ev_id_T evid, void *user_data)
+pk_ev_emit(pk_ev_mgr_id_T evmgr, pk_ev_id_T evid, void *user_emit_data)
{
assert(evmgr < 64);
uint8_t i;
- for (i = 0; i < pk_ev_mstr.mgrs[evmgr]->ev[evid].n_cb; ++i) {
- (*pk_ev_mstr.mgrs[evmgr]->ev[evid].cb[i])(user_data);
+ for (i = 0; i < pk_ev_mstr.mgrs[evmgr]->ev[evid].n_ev_cbs; ++i) {
+ (*pk_ev_mstr.mgrs[evmgr]->ev[evid].ev_cbs[i].cb)(
+ pk_ev_mstr.mgrs[evmgr]->ev[evid].user_ev_data,
+ pk_ev_mstr.mgrs[evmgr]->ev[evid].ev_cbs[i].user_cb_data,
+ user_emit_data);
}
}
diff --git a/test/pkev.c b/test/pkev.c
index a738e70..55c3f85 100644
--- a/test/pkev.c
+++ b/test/pkev.c
@@ -15,13 +15,13 @@ struct ev ev_one = {0};
struct ev ev_two = {0};
void
-handle_ev_one(void *)
+handle_ev_one(void *, void *, void *)
{
ev_one.handled = true;
}
void
-handle_ev_two(void *)
+handle_ev_two(void *, void *, void *)
{
ev_two.handled = true;
}
@@ -66,10 +66,10 @@ int main(int argc, char *argv[])
// register, emit, catch
{
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);
+ ev_one.evid = pk_ev_register_ev(evmgr, NULL);
+ ev_two.evid = pk_ev_register_ev(evmgr, NULL);
+ pk_ev_register_cb(evmgr, ev_one.evid, handle_ev_one, NULL);
+ pk_ev_register_cb(evmgr, ev_two.evid, handle_ev_two, NULL);
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);
@@ -81,10 +81,10 @@ int main(int argc, char *argv[])
{
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);
+ ev_one.evid = pk_ev_register_ev(evmgr, NULL);
+ ev_two.evid = pk_ev_register_ev(evmgr, NULL);
+ pk_ev_register_cb(evmgr, ev_one.evid, handle_ev_one, NULL);
+ pk_ev_register_cb(evmgr, ev_two.evid, handle_ev_two, NULL);
thrd_create(&t1, thrd_ev_emit_one, NULL);
thrd_create(&t2, thrd_ev_emit_two, NULL);
thrd_join(t1, &i);
diff --git a/test/pkev.cpp b/test/pkev.cpp
index 3d8745a..5842b94 100644
--- a/test/pkev.cpp
+++ b/test/pkev.cpp
@@ -38,13 +38,13 @@ struct cb_data {
struct ev *ev;
};
-void stress_cb(void *user_data) {
+void stress_cb(void *, void *, 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) {
+void invoke_packged_task(void *, void *, void* ptr) {
(*static_cast<std::packaged_task<void()>*>(ptr))();
}
@@ -61,10 +61,10 @@ 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();
- 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);
+ ev_one.evid = pk_ev_register_ev(evmgr, NULL);
+ ev_two.evid = pk_ev_register_ev(evmgr, NULL);
+ 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_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);
@@ -79,10 +79,10 @@ 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; });
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);
+ ev_one.evid = pk_ev_register_ev(evmgr, NULL);
+ ev_two.evid = pk_ev_register_ev(evmgr, NULL);
+ pk_ev_register_cb(evmgr, ev_one.evid, &invoke_packged_task, NULL);
+ pk_ev_register_cb(evmgr, ev_two.evid, &invoke_packged_task, NULL);
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();
@@ -102,9 +102,9 @@ int main(int argc, char *argv[])
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);
+ evs[i].evid = pk_ev_register_ev(evmgr, NULL);
for (ii = 0; ii < cb_count; ++ii) {
- pk_ev_register_cb(evmgr, evs[i].evid, &stress_cb);
+ pk_ev_register_cb(evmgr, evs[i].evid, &stress_cb, NULL);
}
}