2019-01-23 15:43:52 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* machinarium.
|
|
|
|
*
|
|
|
|
* cooperative multitasking engine.
|
2020-04-02 11:00:56 +00:00
|
|
|
*/
|
2019-01-23 15:43:52 +00:00
|
|
|
|
|
|
|
#include <machinarium.h>
|
|
|
|
#include <machinarium_private.h>
|
|
|
|
|
2020-04-02 11:00:56 +00:00
|
|
|
MACHINE_API machine_cond_t *
|
2019-01-23 15:43:52 +00:00
|
|
|
machine_cond_create(void)
|
|
|
|
{
|
|
|
|
mm_cond_t *cond = malloc(sizeof(mm_cond_t));
|
|
|
|
if (cond == NULL) {
|
|
|
|
mm_errno_set(ENOMEM);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
mm_cond_init(cond);
|
2020-04-02 11:00:56 +00:00
|
|
|
return (machine_cond_t *)cond;
|
2019-01-23 15:43:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
MACHINE_API void
|
|
|
|
machine_cond_free(machine_cond_t *obj)
|
|
|
|
{
|
|
|
|
free(obj);
|
|
|
|
}
|
|
|
|
|
|
|
|
MACHINE_API void
|
|
|
|
machine_cond_propagate(machine_cond_t *obj, machine_cond_t *prop)
|
|
|
|
{
|
2020-04-02 11:00:56 +00:00
|
|
|
mm_cond_t *cond = mm_cast(mm_cond_t *, obj);
|
|
|
|
mm_cond_t *propagate = mm_cast(mm_cond_t *, prop);
|
|
|
|
cond->propagate = propagate;
|
2019-01-23 15:43:52 +00:00
|
|
|
if (propagate && cond->signal)
|
|
|
|
mm_cond_signal(propagate, &mm_self->scheduler);
|
|
|
|
}
|
|
|
|
|
|
|
|
MACHINE_API void
|
|
|
|
machine_cond_signal(machine_cond_t *obj)
|
|
|
|
{
|
2020-04-02 11:00:56 +00:00
|
|
|
mm_cond_t *cond = mm_cast(mm_cond_t *, obj);
|
2019-01-23 15:43:52 +00:00
|
|
|
mm_cond_signal(cond, &mm_self->scheduler);
|
|
|
|
}
|
|
|
|
|
|
|
|
MACHINE_API int
|
|
|
|
machine_cond_try(machine_cond_t *obj)
|
|
|
|
{
|
2020-04-02 11:00:56 +00:00
|
|
|
mm_cond_t *cond = mm_cast(mm_cond_t *, obj);
|
2019-01-23 15:43:52 +00:00
|
|
|
return mm_cond_try(cond);
|
|
|
|
}
|
|
|
|
|
|
|
|
MACHINE_API int
|
|
|
|
machine_cond_wait(machine_cond_t *obj, uint32_t time_ms)
|
|
|
|
{
|
2020-04-02 11:00:56 +00:00
|
|
|
mm_cond_t *cond = mm_cast(mm_cond_t *, obj);
|
2019-01-23 15:43:52 +00:00
|
|
|
mm_errno_set(0);
|
|
|
|
if (cond->call.type != MM_CALL_NONE) {
|
|
|
|
mm_errno_set(EINPROGRESS);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
return mm_cond_wait(cond, time_ms);
|
|
|
|
}
|