2018-02-01 12:17:31 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* machinarium.
|
|
|
|
*
|
|
|
|
* cooperative multitasking engine.
|
2020-04-02 11:00:56 +00:00
|
|
|
*/
|
2018-02-01 12:17:31 +00:00
|
|
|
|
|
|
|
#include <machinarium.h>
|
|
|
|
#include <machinarium_private.h>
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
MACHINE_API machine_channel_t *machine_channel_create()
|
2018-02-01 12:17:31 +00:00
|
|
|
{
|
2020-11-23 09:13:28 +00:00
|
|
|
mm_channel_t *channel;
|
|
|
|
channel = malloc(sizeof(mm_channel_t));
|
2018-02-01 12:17:31 +00:00
|
|
|
if (channel == NULL) {
|
|
|
|
mm_errno_set(ENOMEM);
|
|
|
|
return NULL;
|
|
|
|
}
|
2020-11-23 09:13:28 +00:00
|
|
|
mm_channel_init(channel);
|
2021-04-21 13:11:18 +00:00
|
|
|
channel->limit_policy = MM_CHANNEL_UNLIMITED;
|
2020-04-02 11:00:56 +00:00
|
|
|
return (machine_channel_t *)channel;
|
2018-02-01 12:17:31 +00:00
|
|
|
}
|
|
|
|
|
2021-03-01 12:01:04 +00:00
|
|
|
MACHINE_API void
|
|
|
|
machine_channel_assign_limit_policy(machine_channel_t *obj, int limit,
|
2021-04-21 13:11:18 +00:00
|
|
|
mm_channel_limit_policy_t policy)
|
2021-03-01 12:01:04 +00:00
|
|
|
{
|
|
|
|
mm_channeltype_t *type;
|
|
|
|
type = mm_cast(mm_channeltype_t *, obj);
|
|
|
|
if (type->is_shared) {
|
|
|
|
mm_channel_t *channel;
|
|
|
|
channel = mm_cast(mm_channel_t *, obj);
|
|
|
|
|
|
|
|
channel->chan_limit = limit;
|
|
|
|
channel->limit_policy = policy;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: handle channel_fast case
|
|
|
|
//
|
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
MACHINE_API void machine_channel_free(machine_channel_t *obj)
|
2018-02-01 12:17:31 +00:00
|
|
|
{
|
2018-02-01 12:40:12 +00:00
|
|
|
mm_channeltype_t *type;
|
2020-04-02 11:00:56 +00:00
|
|
|
type = mm_cast(mm_channeltype_t *, obj);
|
2018-02-01 12:40:12 +00:00
|
|
|
if (type->is_shared) {
|
|
|
|
mm_channel_t *channel;
|
2020-04-02 11:00:56 +00:00
|
|
|
channel = mm_cast(mm_channel_t *, obj);
|
2018-02-01 12:40:12 +00:00
|
|
|
mm_channel_free(channel);
|
|
|
|
free(channel);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
mm_channelfast_t *channel;
|
2020-04-02 11:00:56 +00:00
|
|
|
channel = mm_cast(mm_channelfast_t *, obj);
|
2018-02-01 12:17:31 +00:00
|
|
|
mm_channelfast_free(channel);
|
|
|
|
free(channel);
|
|
|
|
}
|
|
|
|
|
2021-03-01 12:01:04 +00:00
|
|
|
MACHINE_API mm_retcode_t machine_channel_write(machine_channel_t *obj,
|
|
|
|
machine_msg_t *obj_msg)
|
2018-02-01 12:17:31 +00:00
|
|
|
{
|
2018-02-01 12:40:12 +00:00
|
|
|
mm_channeltype_t *type;
|
2020-04-02 11:00:56 +00:00
|
|
|
type = mm_cast(mm_channeltype_t *, obj);
|
2018-02-01 12:40:12 +00:00
|
|
|
if (type->is_shared) {
|
|
|
|
mm_channel_t *channel;
|
2020-12-28 10:43:31 +00:00
|
|
|
channel = mm_cast(mm_channel_t *, obj);
|
2020-04-02 11:00:56 +00:00
|
|
|
mm_msg_t *msg = mm_cast(mm_msg_t *, obj_msg);
|
2021-03-01 12:01:04 +00:00
|
|
|
return mm_channel_write(channel, msg);
|
2018-02-01 12:40:12 +00:00
|
|
|
}
|
|
|
|
mm_channelfast_t *channel;
|
2020-12-28 10:43:31 +00:00
|
|
|
channel = mm_cast(mm_channelfast_t *, obj);
|
2020-04-02 11:00:56 +00:00
|
|
|
mm_msg_t *msg = mm_cast(mm_msg_t *, obj_msg);
|
2021-03-01 12:01:04 +00:00
|
|
|
return mm_channelfast_write(channel, msg);
|
2018-02-01 12:17:31 +00:00
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
MACHINE_API machine_msg_t *machine_channel_read(machine_channel_t *obj,
|
|
|
|
uint32_t time_ms)
|
2018-02-01 12:17:31 +00:00
|
|
|
{
|
2018-02-01 12:40:12 +00:00
|
|
|
mm_channeltype_t *type;
|
2020-04-02 11:00:56 +00:00
|
|
|
type = mm_cast(mm_channeltype_t *, obj);
|
2018-02-01 12:40:12 +00:00
|
|
|
if (type->is_shared) {
|
|
|
|
mm_channel_t *channel;
|
2020-04-02 11:00:56 +00:00
|
|
|
channel = mm_cast(mm_channel_t *, obj);
|
2018-02-01 12:40:12 +00:00
|
|
|
mm_msg_t *msg;
|
|
|
|
msg = mm_channel_read(channel, time_ms);
|
2020-04-02 11:00:56 +00:00
|
|
|
return (machine_msg_t *)msg;
|
2018-02-01 12:40:12 +00:00
|
|
|
}
|
|
|
|
mm_channelfast_t *channel;
|
2020-04-02 11:00:56 +00:00
|
|
|
channel = mm_cast(mm_channelfast_t *, obj);
|
2018-02-01 12:17:31 +00:00
|
|
|
mm_msg_t *msg;
|
|
|
|
msg = mm_channelfast_read(channel, time_ms);
|
2020-04-02 11:00:56 +00:00
|
|
|
return (machine_msg_t *)msg;
|
2018-02-01 12:17:31 +00:00
|
|
|
}
|