summaryrefslogtreecommitdiff
path: root/pkev.h
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2024-10-31 21:01:08 -0400
committerJonathan Bradley <jcb@pikum.xyz>2024-10-31 21:01:08 -0400
commite4d71f20517488dd48cec43a870af496b0f90c5b (patch)
tree4518595f17b62bcd697904d247d1fe5baa063ca6 /pkev.h
parentb79beeafcb2feec7fbf830034ddcd61e03297283 (diff)
pkev: checkpoint: create
Diffstat (limited to 'pkev.h')
-rw-r--r--pkev.h93
1 files changed, 93 insertions, 0 deletions
diff --git a/pkev.h b/pkev.h
new file mode 100644
index 0000000..e3dc772
--- /dev/null
+++ b/pkev.h
@@ -0,0 +1,93 @@
+#ifndef PK_EV_H
+#define PK_EV_H
+
+#include <stdint.h>
+
+struct pk_ev_mgr;
+typedef uint64_t pk_ev_id_T;
+
+struct pk_ev_mgr *pk_ev_create();
+void pk_ev_destroy(struct pk_ev_mgr *evmgr);
+
+typedef void (*pk_ev_cb)();
+
+void pk_ev_register_ev(struct pk_ev_mgr *evmgr, pk_ev_id_T evid);
+void pk_ev_register_cb(struct pk_ev_mgr *evmgr, pk_ev_id_T evid, pk_ev_cb *cb);
+void pk_ev_emit(struct pk_ev_mgr *evmgr, pk_ev_id_T evid, ...);
+
+#endif /* PK_EV_H */
+
+#ifdef PK_IMPL_EV
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef PK_EV_MAX_COUNT
+# define PK_EV_MAX_COUNT 16
+#endif
+
+struct pk_ev {
+ pk_ev_id_T evid;
+ pk_ev_cb **cb;
+ uint8_t n_cb;
+};
+
+struct pk_ev_mgr {
+ struct pk_ev *ev;
+ uint8_t n_ev;
+};
+
+inline struct pk_ev_mgr*
+pk_ev_create()
+{
+ struct pk_ev_mgr *mgr = (struct pk_ev_mgr*)malloc(sizeof(struct pk_ev_mgr));
+ if (mgr == NULL) return NULL;
+ memset(mgr, 0, sizeof(struct pk_ev_mgr));
+ mgr->ev = (struct pk_ev*)malloc(sizeof(struct pk_ev) * PK_EV_MAX_COUNT);
+ if (mgr->ev == NULL) return NULL;
+ memset(mgr->ev, 0, sizeof(struct pk_ev) * PK_EV_MAX_COUNT);
+ mgr->n_ev = 0;
+ return mgr;
+}
+
+inline void
+pk_ev_destroy(struct pk_ev_mgr *evmgr)
+{
+ memset(evmgr->ev, 0, sizeof(struct pk_ev) * PK_EV_MAX_COUNT);
+ free(evmgr->ev);
+ memset(evmgr, 0, sizeof(struct pk_ev_mgr));
+ free(evmgr);
+}
+
+inline void
+pk_ev_register_ev(struct pk_ev_mgr *evmgr, pk_ev_id_T evid)
+{
+ // TODO
+}
+
+inline void
+pk_ev_register_cb(struct pk_ev_mgr *evmgr, pk_ev_id_T evid, pk_ev_cb *cb)
+{
+ // TODO
+}
+
+inline void
+pk_ev_emit(struct pk_ev_mgr *evmgr, pk_ev_id_T evid, ...)
+{
+ assert(evmgr != NULL);
+ uint8_t i;
+ struct pk_ev *ev = {0};
+ for (i = 0; i < evmgr->n_ev; ++i) {
+ if (evmgr->ev[i].evid == evid) {
+ ev = &evmgr->ev[i];
+ break;
+ }
+ }
+ if (ev == NULL) return;
+ for (i = 0; i < ev->n_cb; ++i) {
+ (*ev->cb[i])();
+ }
+}
+
+#endif