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