From 5d902de564b085b322ec68a8396711f430dc0bce Mon Sep 17 00:00:00 2001 From: Ulysse Cura Date: Mon, 10 Aug 2026 18:22:45 +0200 Subject: [PATCH] Corrected event bus event handling : removed events history. --- src/event_bus.c | 46 ++++++++++++++--------------------------- src/headers/event_bus.h | 13 +++--------- 2 files changed, 18 insertions(+), 41 deletions(-) diff --git a/src/event_bus.c b/src/event_bus.c index 0d966e9..8a813c6 100644 --- a/src/event_bus.c +++ b/src/event_bus.c @@ -5,14 +5,6 @@ #include "memory_alloc.h" #include "errors.h" -// Arg : void *payload -int create_event(event_t *event, va_list args) -{ - event->payload = va_arg(args, void *); - - return EXIT_SUCCESS; -} - // Arg : callback_t callback int create_subscription(subscription_t *subscription, va_list args) { @@ -21,23 +13,18 @@ int create_subscription(subscription_t *subscription, va_list args) return EXIT_SUCCESS; } -// Args : size_t id, size_t max_history_size +// Arg : size_t id int create_topic(topic_t *topic, va_list args) { topic->id = va_arg(args, size_t); - topic->max_history_size = va_arg(args, size_t); - linked_list_init(&topic->events, sizeof(event_t), (allocator_t)create_event, NULL); linked_list_init(&topic->subscriptions, sizeof(subscription_t), (allocator_t)create_subscription, NULL); - if(linked_list_reserve(&topic->events, topic->max_history_size)) return EXIT_FAILURE; - return EXIT_SUCCESS; } int destroy_topic(topic_t *topic) { - if(linked_list_exit(&topic->events)) return EXIT_FAILURE; if(linked_list_exit(&topic->subscriptions)) return EXIT_FAILURE; return EXIT_SUCCESS; @@ -96,17 +83,22 @@ int event_bus_change_topic_id(event_bus_t *event_bus, size_t old_id, size_t new_ return EXIT_SUCCESS; } -// Args : void *payload +// Args : va_list_args static inline int action_execute_callback(elem_t *elem, va_list args) { subscription_t *subscription = elem->data; - if(subscription->callback(va_arg(args, void *))) return EXIT_FAILURE; + va_list args_copy; + va_copy(args_copy, args); + + if(subscription->callback(args_copy)) return EXIT_FAILURE; + + va_end(args_copy); return EXIT_SUCCESS; } -int event_bus_publish(event_bus_t *event_bus, size_t id, void *payload) +int event_bus_publish(event_bus_t *event_bus, size_t id, ...) { elem_t *topic_elem = linked_list_get_if(&event_bus->topics, condition_is_topic_id, id); if(!topic_elem) @@ -117,22 +109,14 @@ int event_bus_publish(event_bus_t *event_bus, size_t id, void *payload) topic_t *topic = topic_elem->data; - if(topic->events.size + 1 > topic->max_history_size) - { - elem_t *removed_event_elem = linked_list_pop_back(&topic->events); - if(!removed_event_elem) return EXIT_FAILURE; + va_list args, args_copy; + va_start(args, id); + va_copy(args_copy, args); - destroy_elem(&topic->events, removed_event_elem); - } + if(linked_list_for_eachv(&topic->subscriptions, action_execute_callback, args_copy)) return EXIT_FAILURE; - elem_t *event_elem = create_elem(&topic->events, payload); - if(!event_elem) return EXIT_FAILURE; - - if(linked_list_push_front(&topic->events, event_elem)) return EXIT_FAILURE; - - if(linked_list_for_each(&topic->subscriptions, action_execute_callback, payload)) return EXIT_FAILURE; - - debug_printf("Event published, id = %lu, payload = %d", id, *(bool*)payload); + va_end(args_copy); + va_end(args); return EXIT_SUCCESS; } diff --git a/src/headers/event_bus.h b/src/headers/event_bus.h index d161229..35f3366 100644 --- a/src/headers/event_bus.h +++ b/src/headers/event_bus.h @@ -2,15 +2,10 @@ #define EVENT_BUS_H #include +#include "ecs.h" #include "linked_list.h" -typedef int (*callback_t)(void *payload); - -typedef struct event_t { - void *payload; -} event_t; - -int create_event(event_t *event, va_list args); +typedef int (*callback_t)(va_list args); typedef struct subscription_t { callback_t callback; @@ -20,9 +15,7 @@ int create_subscription(subscription_t *subscription, va_list args); typedef struct topic_t { size_t id; - linked_list_t events; linked_list_t subscriptions; - size_t max_history_size; } topic_t; int create_topic(topic_t *topic, va_list args); @@ -39,7 +32,7 @@ int event_bus_new_topic(event_bus_t *event_bus, size_t id, size_t max_history_si int event_bus_remove_topic(event_bus_t *event_bus, size_t id); int event_bus_change_topic_id(event_bus_t *event_bus, size_t old_id, size_t new_id); -int event_bus_publish(event_bus_t *event_bus, size_t id, void *payload); +int event_bus_publish(event_bus_t *event_bus, size_t id, ...); int event_bus_subscribe(event_bus_t *event_bus, size_t id, callback_t callback); #endif // EVENT_BUS_H \ No newline at end of file