mirror of https://github.com/yandex/odyssey.git
62 lines
1019 B
C
62 lines
1019 B
C
#ifndef MM_COND_H
|
|
#define MM_COND_H
|
|
|
|
/*
|
|
* machinarium.
|
|
*
|
|
* cooperative multitasking engine.
|
|
*/
|
|
|
|
typedef struct mm_cond mm_cond_t;
|
|
|
|
struct mm_cond
|
|
{
|
|
uint64_t signal;
|
|
mm_call_t call;
|
|
mm_cond_t *propagate;
|
|
};
|
|
|
|
static inline void
|
|
mm_cond_init(mm_cond_t *cond)
|
|
{
|
|
cond->propagate = NULL;
|
|
cond->signal = 0;
|
|
memset(&cond->call, 0, sizeof(cond->call));
|
|
}
|
|
|
|
static inline void
|
|
mm_cond_signal(mm_cond_t *cond, mm_scheduler_t *sched)
|
|
{
|
|
if (cond->propagate)
|
|
mm_cond_signal(cond->propagate, sched);
|
|
if (cond->signal)
|
|
return;
|
|
cond->signal = 1;
|
|
if (cond->call.type == MM_CALL_COND)
|
|
mm_scheduler_wakeup(sched, cond->call.coroutine);
|
|
}
|
|
|
|
static inline int
|
|
mm_cond_try(mm_cond_t *cond)
|
|
{
|
|
int signal = cond->signal;
|
|
if (signal)
|
|
cond->signal = 0;
|
|
return signal;
|
|
}
|
|
|
|
static inline int
|
|
mm_cond_wait(mm_cond_t *cond, uint32_t time_ms)
|
|
{
|
|
if (cond->signal) {
|
|
cond->signal = 0;
|
|
return 0;
|
|
}
|
|
mm_call(&cond->call, MM_CALL_COND, time_ms);
|
|
if (cond->call.status != 0)
|
|
return -1;
|
|
return 0;
|
|
}
|
|
|
|
#endif /* MM_COND_H */
|