Calculate internal system id to be stored in events
This commit is contained in:
		| @@ -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); | ||||
| @@ -176,6 +187,8 @@ Event es_register_event(EventSystem *event_system) { | ||||
|   } | ||||
|  | ||||
|   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; | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -10,6 +10,7 @@ struct event_system { | ||||
| typedef struct event Event; | ||||
| struct event { | ||||
|   u64 id; | ||||
|   u64 system; | ||||
| }; | ||||
|  | ||||
| typedef struct event_listener EventListener; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user