From 57665b9529502d1c9c7f13032b0776f05238d599 Mon Sep 17 00:00:00 2001 From: Dmitry Simonenko Date: Fri, 19 May 2017 14:47:48 +0300 Subject: [PATCH] machinarium: introduce channel api --- src/machinarium.h | 17 ++++++++++++++++- src/mm_channel.c | 36 ++++++++++++++++++++++++++++++++++++ src/mm_channel.h | 11 +++++++++++ 3 files changed, 63 insertions(+), 1 deletion(-) diff --git a/src/machinarium.h b/src/machinarium.h index ff414114..602555d2 100644 --- a/src/machinarium.h +++ b/src/machinarium.h @@ -26,6 +26,7 @@ typedef void (*machine_function_t)(void *arg); typedef void* machine_t; typedef void* machine_msg_t; +typedef void* machine_channel_t; typedef void* machine_tls_t; typedef void* machine_io_t; @@ -86,7 +87,7 @@ MACHINE_API void machine_msg_free(machine_msg_t); MACHINE_API void -machine_msg_set_data(machine_msg_t, void*); +machine_msg_set_data(machine_msg_t, void *data); MACHINE_API void* machine_msg_get_data(machine_msg_t); @@ -94,6 +95,20 @@ machine_msg_get_data(machine_msg_t); MACHINE_API int machine_msg_get_type(machine_msg_t); +/* channel */ + +MACHINE_API machine_channel_t +machine_channel_create(void); + +MACHINE_API void +machine_channel_free(machine_channel_t); + +MACHINE_API void +machine_channel_write(machine_channel_t, machine_msg_t); + +MACHINE_API machine_msg_t +machine_channel_read(machine_channel_t, int time_ms); + /* tls */ MACHINE_API machine_tls_t diff --git a/src/mm_channel.c b/src/mm_channel.c index ad3ae85a..96681172 100644 --- a/src/mm_channel.c +++ b/src/mm_channel.c @@ -7,3 +7,39 @@ #include #include + +MACHINE_API machine_channel_t +machine_channel_create(void) +{ + mm_channel_t *channel; + channel = malloc(sizeof(mm_channel_t)); + if (channel == NULL) + return NULL; + mm_channel_init(channel); + return channel; +} + +MACHINE_API void +machine_channel_free(machine_channel_t obj) +{ + mm_channel_t *channel = obj; + mm_channel_free(channel); + free(channel); +} + +MACHINE_API void +machine_channel_write(machine_channel_t obj, machine_msg_t obj_msg) +{ + mm_channel_t *channel = obj; + mm_msg_t *msg = obj_msg; + mm_channel_write(channel, msg); +} + +MACHINE_API machine_msg_t +machine_channel_read(machine_channel_t obj, int time_ms) +{ + mm_channel_t *channel = obj; + mm_msg_t *msg; + msg = mm_channel_read(channel, time_ms); + return msg; +} diff --git a/src/mm_channel.h b/src/mm_channel.h index bbe971e6..0719a49b 100644 --- a/src/mm_channel.h +++ b/src/mm_channel.h @@ -25,6 +25,17 @@ mm_channel_init(mm_channel_t *channel) channel->readers_count = 0; } +static inline void +mm_channel_free(mm_channel_t *channel) +{ + mm_list_t *i, *n; + mm_list_foreach_safe(&channel->incoming, i, n) { + mm_msg_t *msg; + msg = mm_container_of(msg, mm_msg_t, link); + mm_msg_unref(&machinarium.msg_pool, msg); + } +} + static inline void mm_channel_write(mm_channel_t *channel, mm_msg_t *msg) {