Add EventSystem reference in Event and magic to ESInteral
This commit is contained in:
		| @@ -5,6 +5,10 @@ | |||||||
| #include <stdbool.h> | #include <stdbool.h> | ||||||
| #include <sys/mman.h> | #include <sys/mman.h> | ||||||
|  |  | ||||||
|  | #define MAGIC 0x4556535953 | ||||||
|  |  | ||||||
|  | #define VALID_MAGIC(ESINT_PTR) (ESINT_PTR->magic == MAGIC) | ||||||
|  |  | ||||||
| #define INVALID_SYSTEM ((EventSystem){ .id = 0 }) | #define INVALID_SYSTEM ((EventSystem){ .id = 0 }) | ||||||
| #define INVALID_EVENT ((Event) { .id = 0 }) | #define INVALID_EVENT ((Event) { .id = 0 }) | ||||||
| #define INVALID_LISTENER ((EventListener){ .event = INVALID_EVENT, .id = 0 }) | #define INVALID_LISTENER ((EventListener){ .event = INVALID_EVENT, .id = 0 }) | ||||||
| @@ -15,6 +19,7 @@ | |||||||
|  |  | ||||||
| typedef struct es_internal ESInternal; | typedef struct es_internal ESInternal; | ||||||
| struct es_internal { | struct es_internal { | ||||||
|  |   u64 magic; | ||||||
|   u64  alloc_size; |   u64  alloc_size; | ||||||
|   u64  event_capacity; |   u64  event_capacity; | ||||||
|   u64  event_count; |   u64  event_count; | ||||||
| @@ -81,6 +86,7 @@ EventSystem es_init(u64 initial_event_capacity, u64 initial_listeners_capacity) | |||||||
|  |  | ||||||
|   ESInternal *event_system = (ESInternal *)buffer; |   ESInternal *event_system = (ESInternal *)buffer; | ||||||
|  |  | ||||||
|  |   event_system->magic                     = MAGIC; | ||||||
|   event_system->alloc_size                = alloc_size; |   event_system->alloc_size                = alloc_size; | ||||||
|   event_system->event_capacity            = event_capacity; |   event_system->event_capacity            = event_capacity; | ||||||
|   event_system->event_count               = 0; |   event_system->event_count               = 0; | ||||||
| @@ -116,6 +122,9 @@ void es_deinit(EventSystem *event_system) { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   ESInternal *es = get_event_system_internal(*event_system); |   ESInternal *es = get_event_system_internal(*event_system); | ||||||
|  | 	if (!VALID_MAGIC(es)) { | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|   munmap(system, es->alloc_size); |   munmap(system, es->alloc_size); | ||||||
|  |  | ||||||
| @@ -129,8 +138,14 @@ Event es_register_event(EventSystem event_system) { | |||||||
|     goto RETURN_EVENT; |     goto RETURN_EVENT; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   ESInternal *es                = get_event_system_internal(event_system); |   ESInternal *es = get_event_system_internal(event_system); | ||||||
|   EventSlot *event_slots_array  = get_event_slots_array(es); | 	if (!VALID_MAGIC(es)) { | ||||||
|  | 		goto RETURN_EVENT; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  |   event.system = event_system; | ||||||
|  |  | ||||||
|  |   EventSlot *event_slots_array = get_event_slots_array(es); | ||||||
|  |  | ||||||
|   if (es->free_count > 0) { |   if (es->free_count > 0) { | ||||||
|     u64 *free_array = get_free_array(es); |     u64 *free_array = get_free_array(es); | ||||||
| @@ -155,35 +170,41 @@ RETURN_EVENT: | |||||||
|   return event; |   return event; | ||||||
| } | } | ||||||
|  |  | ||||||
| void es_deregister_event(EventSystem event_system, Event event) { | void es_deregister_event(EventSystem event_system, Event *event) { | ||||||
|   if (IS_INVALID_SYSTEM(event_system) || IS_INVALID_EVENT(event)) { |   if (IS_INVALID_SYSTEM(event_system) || IS_INVALID_EVENT((*event)) || event_system.id != event->system.id) { | ||||||
|     return; |     return; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   ESInternal *es = get_event_system_internal(event_system); |   ESInternal *es = get_event_system_internal(event_system); | ||||||
|   if (event.id > es->event_count) { |   if (!VALID_MAGIC(es) || event->id > es->event_count) { | ||||||
|     return; |     return; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   EventSlot *event_slots_array = get_event_slots_array(es); |   EventSlot *event_slots_array = get_event_slots_array(es); | ||||||
|   u64 *free_array              = get_free_array(es); |   u64 *free_array              = get_free_array(es); | ||||||
|  |  | ||||||
|   event_slots_array[event.id].registered = false; |   event_slots_array[event->id].registered = false; | ||||||
|   free_array[(es->free_count)++]         = event.id; |   free_array[(es->free_count)++]         = event->id; | ||||||
|  |  | ||||||
|   if (event.id == es->event_count) { |   if (event->id == es->event_count) { | ||||||
|     es->event_count -= 1; |     es->event_count -= 1; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   event->id = 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| EventListener es_add_event_listener(EventSystem event_system, Event event, EventCallback callback) { | EventListener es_add_event_listener(EventSystem event_system, Event event, EventCallback callback) { | ||||||
|   EventListener listener = INVALID_LISTENER; |   EventListener listener = INVALID_LISTENER; | ||||||
|  |  | ||||||
|   if (IS_INVALID_SYSTEM(event_system) || IS_INVALID_EVENT(event) || !callback) { |   if (IS_INVALID_SYSTEM(event_system) || IS_INVALID_EVENT(event) || event_system.id != event.system.id || !callback) { | ||||||
|     goto RETURN_LISTENER; |     goto RETURN_LISTENER; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   ESInternal *es    = get_event_system_internal(event_system); |   ESInternal *es = get_event_system_internal(event_system); | ||||||
|  | 	if (!VALID_MAGIC(es)) { | ||||||
|  |     goto RETURN_LISTENER; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|   EventInternal *ev = get_event(es, event); |   EventInternal *ev = get_event(es, event); | ||||||
|  |  | ||||||
|   if (ev->free_count > 0) { |   if (ev->free_count > 0) { | ||||||
| @@ -215,12 +236,12 @@ RETURN_LISTENER: | |||||||
| } | } | ||||||
|  |  | ||||||
| void es_remove_event_listener(EventSystem event_system, EventListener listener) { | void es_remove_event_listener(EventSystem event_system, EventListener listener) { | ||||||
|   if (IS_INVALID_SYSTEM(event_system) || IS_INVALID_LISTENER(listener)) { |   if (IS_INVALID_SYSTEM(event_system) || IS_INVALID_LISTENER(listener) || event_system.id != listener.event.system.id) { | ||||||
|     return; |     return; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   ESInternal *es = get_event_system_internal(event_system); |   ESInternal *es = get_event_system_internal(event_system); | ||||||
|   if (listener.event.id > es->event_count) { |   if (!VALID_MAGIC(es) || listener.event.id > es->event_count) { | ||||||
|     return; |     return; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -243,12 +264,12 @@ void es_remove_event_listener(EventSystem event_system, EventListener listener) | |||||||
| } | } | ||||||
|  |  | ||||||
| void es_emit_event(EventSystem event_system, Event event, void *data) { | void es_emit_event(EventSystem event_system, Event event, void *data) { | ||||||
|   if (IS_INVALID_SYSTEM(event_system) || IS_INVALID_EVENT(event)) { |   if (IS_INVALID_SYSTEM(event_system) || IS_INVALID_EVENT(event) || event_system.id != event.system.id) { | ||||||
|     return; |     return; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   ESInternal *es = get_event_system_internal(event_system); |   ESInternal *es = get_event_system_internal(event_system); | ||||||
|   if (event.id > es->event_count) { |   if (!VALID_MAGIC(es) || event.id > es->event_count) { | ||||||
|     return; |     return; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -16,6 +16,7 @@ struct event_system { | |||||||
|  |  | ||||||
| typedef struct event Event; | typedef struct event Event; | ||||||
| struct event { | struct event { | ||||||
|  |   EventSystem system; | ||||||
|   u64 id; |   u64 id; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| @@ -30,7 +31,7 @@ typedef void (*EventCallback)(void *data); | |||||||
| EventSystem   es_init(u64 initial_event_capacity, u64 initial_listeners_capacity); | EventSystem   es_init(u64 initial_event_capacity, u64 initial_listeners_capacity); | ||||||
| void          es_deinit(EventSystem *event_system); | void          es_deinit(EventSystem *event_system); | ||||||
| Event         es_register_event(EventSystem event_system); | Event         es_register_event(EventSystem event_system); | ||||||
| void          es_deregister_event(EventSystem event_system, Event event); | void          es_deregister_event(EventSystem event_system, Event *event); | ||||||
| EventListener es_add_event_listener(EventSystem event_system, Event event, EventCallback callback); | EventListener es_add_event_listener(EventSystem event_system, Event event, EventCallback callback); | ||||||
| void          es_remove_event_listener(EventSystem event_system, EventListener listener); | void          es_remove_event_listener(EventSystem event_system, EventListener listener); | ||||||
| void          es_emit_event(EventSystem event_system, Event event, void *data); | void          es_emit_event(EventSystem event_system, Event event, void *data); | ||||||
|   | |||||||
| @@ -65,11 +65,11 @@ int main(void) { | |||||||
|   EventListener listener    = es_add_event_listener(es, extra_event, extra_event_handler); |   EventListener listener    = es_add_event_listener(es, extra_event, extra_event_handler); | ||||||
|   es_emit_event(es, extra_event, NULL); |   es_emit_event(es, extra_event, NULL); | ||||||
|   es_remove_event_listener(es, listener); |   es_remove_event_listener(es, listener); | ||||||
|   es_deregister_event(es, extra_event); |   es_deregister_event(es, &extra_event); | ||||||
|  |  | ||||||
|   for (int i = 0; i < COUNT_EVENTS; ++i) { |   for (int i = 0; i < COUNT_EVENTS; ++i) { | ||||||
|     es_remove_event_listener(es, listeners[i]); |     es_remove_event_listener(es, listeners[i]); | ||||||
|     es_deregister_event(es, events[i]); |     es_deregister_event(es, &events[i]); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   es_deinit(&es); |   es_deinit(&es); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user