machinarium: introduce channel api

This commit is contained in:
Dmitry Simonenko 2017-05-19 14:47:48 +03:00
parent a644602cd5
commit 57665b9529
3 changed files with 63 additions and 1 deletions

View File

@ -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

View File

@ -7,3 +7,39 @@
#include <machinarium.h>
#include <machinarium_private.h>
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;
}

View File

@ -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)
{