From 44ec7317a134e84c948f439903c83ada3857ffc4 Mon Sep 17 00:00:00 2001 From: Abdelrahman Said Date: Sun, 26 Jan 2025 18:13:36 +0000 Subject: [PATCH] Calculate internal system id to be stored in events --- src/event_system.c | 21 +++++++++++++++++---- src/event_system.h | 1 + 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/event_system.c b/src/event_system.c index 00ea014..07ef10a 100644 --- a/src/event_system.c +++ b/src/event_system.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #define MAGIC 0x4556535953 @@ -23,6 +24,7 @@ typedef struct es_internal ESInternal; struct es_internal { u64 magic; + u64 id; u64 alloc_size; u64 event_capacity; u64 event_count; @@ -57,7 +59,14 @@ internal EventInternal *get_event(const ESInternal *es, Event event); internal EventInternal *get_event_from_offset(const ESInternal *es, u64 offset); internal u64 get_largest_capacity(const ESInternal *es); +internal bool seeded = false; + EventSystem es_init(u64 initial_event_capacity, u64 initial_listeners_capacity) { + if (!seeded) { + srand(time(0)); + seeded = true; + } + // Double event capacity to reduce chances of reallocation u64 event_capacity = initial_event_capacity * 2; // Double listener capacity to reduce chances of reallocation @@ -92,6 +101,7 @@ EventSystem es_init(u64 initial_event_capacity, u64 initial_listeners_capacity) ESInternal *event_system = (ESInternal *)buffer; event_system->magic = MAGIC; + event_system->id = (u64)time(0) + (u64)rand(); event_system->alloc_size = alloc_size; event_system->event_capacity = event_capacity; event_system->event_count = 0; @@ -166,6 +176,7 @@ Event es_register_event(EventSystem *event_system) { EventSystem event_system_new = es_init(es->event_capacity, new_callback_capacity); ESInternal *es_new = get_event_system_internal(event_system_new); + es_new->id = es->id; es_new->event_count = es->event_count; copy_event_data(es, es_new); @@ -175,7 +186,9 @@ Event es_register_event(EventSystem *event_system) { es = es_new; } - event.id = ++(es->event_count); + event.id = ++(es->event_count); + event.system = es->id; + event_slots_array[event.id].registered = true; RETURN_EVENT: @@ -188,7 +201,7 @@ void es_deregister_event(EventSystem event_system, Event *event) { } ESInternal *es = get_event_system_internal(event_system); - if (!VALID_MAGIC(es) || event->id > es->event_count) { + if (!VALID_MAGIC(es) || event->system != es->id || event->id > es->event_count) { return; } @@ -213,7 +226,7 @@ EventListener es_add_event_listener(EventSystem *event_system, Event event, Even } ESInternal *es = get_event_system_internal(*event_system); - if (!VALID_MAGIC(es)) { + if (!VALID_MAGIC(es) || event.system != es->id) { goto RETURN_LISTENER; } @@ -281,7 +294,7 @@ void es_emit_event(EventSystem event_system, Event event, void *data) { } ESInternal *es = get_event_system_internal(event_system); - if (!VALID_MAGIC(es) || event.id > es->event_count) { + if (!VALID_MAGIC(es) || event.system != es->id || event.id > es->event_count) { return; } diff --git a/src/event_system.h b/src/event_system.h index adebbdc..6c18be4 100644 --- a/src/event_system.h +++ b/src/event_system.h @@ -10,6 +10,7 @@ struct event_system { typedef struct event Event; struct event { u64 id; + u64 system; }; typedef struct event_listener EventListener;