Calculate internal system id to be stored in events
This commit is contained in:
parent
000845d514
commit
44ec7317a1
@ -3,6 +3,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include <time.h>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
|
|
||||||
#define MAGIC 0x4556535953
|
#define MAGIC 0x4556535953
|
||||||
@ -23,6 +24,7 @@
|
|||||||
typedef struct es_internal ESInternal;
|
typedef struct es_internal ESInternal;
|
||||||
struct es_internal {
|
struct es_internal {
|
||||||
u64 magic;
|
u64 magic;
|
||||||
|
u64 id;
|
||||||
u64 alloc_size;
|
u64 alloc_size;
|
||||||
u64 event_capacity;
|
u64 event_capacity;
|
||||||
u64 event_count;
|
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 EventInternal *get_event_from_offset(const ESInternal *es, u64 offset);
|
||||||
internal u64 get_largest_capacity(const ESInternal *es);
|
internal u64 get_largest_capacity(const ESInternal *es);
|
||||||
|
|
||||||
|
internal bool seeded = false;
|
||||||
|
|
||||||
EventSystem es_init(u64 initial_event_capacity, u64 initial_listeners_capacity) {
|
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
|
// Double event capacity to reduce chances of reallocation
|
||||||
u64 event_capacity = initial_event_capacity * 2;
|
u64 event_capacity = initial_event_capacity * 2;
|
||||||
// Double listener capacity to reduce chances of reallocation
|
// 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;
|
ESInternal *event_system = (ESInternal *)buffer;
|
||||||
|
|
||||||
event_system->magic = MAGIC;
|
event_system->magic = MAGIC;
|
||||||
|
event_system->id = (u64)time(0) + (u64)rand();
|
||||||
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;
|
||||||
@ -166,6 +176,7 @@ Event es_register_event(EventSystem *event_system) {
|
|||||||
EventSystem event_system_new = es_init(es->event_capacity, new_callback_capacity);
|
EventSystem event_system_new = es_init(es->event_capacity, new_callback_capacity);
|
||||||
ESInternal *es_new = get_event_system_internal(event_system_new);
|
ESInternal *es_new = get_event_system_internal(event_system_new);
|
||||||
|
|
||||||
|
es_new->id = es->id;
|
||||||
es_new->event_count = es->event_count;
|
es_new->event_count = es->event_count;
|
||||||
|
|
||||||
copy_event_data(es, es_new);
|
copy_event_data(es, es_new);
|
||||||
@ -176,6 +187,8 @@ Event es_register_event(EventSystem *event_system) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
event.id = ++(es->event_count);
|
event.id = ++(es->event_count);
|
||||||
|
event.system = es->id;
|
||||||
|
|
||||||
event_slots_array[event.id].registered = true;
|
event_slots_array[event.id].registered = true;
|
||||||
|
|
||||||
RETURN_EVENT:
|
RETURN_EVENT:
|
||||||
@ -188,7 +201,7 @@ void es_deregister_event(EventSystem event_system, Event *event) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ESInternal *es = get_event_system_internal(event_system);
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -213,7 +226,7 @@ EventListener es_add_event_listener(EventSystem *event_system, Event event, Even
|
|||||||
}
|
}
|
||||||
|
|
||||||
ESInternal *es = get_event_system_internal(*event_system);
|
ESInternal *es = get_event_system_internal(*event_system);
|
||||||
if (!VALID_MAGIC(es)) {
|
if (!VALID_MAGIC(es) || event.system != es->id) {
|
||||||
goto RETURN_LISTENER;
|
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);
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@ struct event_system {
|
|||||||
typedef struct event Event;
|
typedef struct event Event;
|
||||||
struct event {
|
struct event {
|
||||||
u64 id;
|
u64 id;
|
||||||
|
u64 system;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct event_listener EventListener;
|
typedef struct event_listener EventListener;
|
||||||
|
Loading…
Reference in New Issue
Block a user