Calculate internal system id to be stored in events

This commit is contained in:
Abdelrahman Said 2025-01-26 18:13:36 +00:00
parent 000845d514
commit 44ec7317a1
2 changed files with 18 additions and 4 deletions

View File

@ -3,6 +3,7 @@
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <time.h>
#include <sys/mman.h>
#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;
}

View File

@ -10,6 +10,7 @@ struct event_system {
typedef struct event Event;
struct event {
u64 id;
u64 system;
};
typedef struct event_listener EventListener;