Corrected event bus event handling : removed events history.
This commit is contained in:
parent
3605aeee27
commit
5d902de564
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,15 +2,10 @@
|
|||
#define EVENT_BUS_H
|
||||
|
||||
#include <stdarg.h>
|
||||
#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
|
||||
Loading…
Reference in New Issue