2017-03-21 11:25:54 +00:00
|
|
|
#ifndef MM_CALL_H_
|
|
|
|
#define MM_CALL_H_
|
|
|
|
|
|
|
|
/*
|
|
|
|
* machinarium.
|
|
|
|
*
|
|
|
|
* cocallerative multitasking engine.
|
|
|
|
*/
|
|
|
|
|
|
|
|
typedef struct mm_call_t mm_call_t;
|
|
|
|
|
|
|
|
typedef void (*mm_cancel_t)(void*, void *arg);
|
|
|
|
|
|
|
|
struct mm_call_t {
|
|
|
|
int active;
|
2017-04-20 11:56:47 +00:00
|
|
|
mm_fiber_t *fiber;
|
|
|
|
mm_timer_t timer;
|
2017-03-21 11:25:54 +00:00
|
|
|
mm_cancel_t cancel_function;
|
|
|
|
void *arg;
|
2017-04-20 11:56:47 +00:00
|
|
|
int timedout;
|
|
|
|
int status;
|
2017-03-21 11:25:54 +00:00
|
|
|
};
|
|
|
|
|
2017-04-20 11:56:47 +00:00
|
|
|
void mm_call(mm_call_t*, mm_scheduler_t*, mm_clock_t*, int);
|
2017-03-21 11:25:54 +00:00
|
|
|
|
2017-04-20 11:56:47 +00:00
|
|
|
static inline int
|
|
|
|
mm_call_is_active(mm_call_t *call)
|
2017-03-21 11:25:54 +00:00
|
|
|
{
|
2017-04-20 11:56:47 +00:00
|
|
|
return call->active;
|
2017-03-21 11:25:54 +00:00
|
|
|
}
|
|
|
|
|
2017-04-20 11:56:47 +00:00
|
|
|
static inline int
|
|
|
|
mm_call_is_aborted(mm_call_t *call)
|
2017-03-21 11:25:54 +00:00
|
|
|
{
|
2017-04-20 11:56:47 +00:00
|
|
|
return call->status != 0;
|
2017-03-21 11:25:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static inline void
|
2017-04-20 11:56:47 +00:00
|
|
|
mm_call_cancel(mm_call_t *call, void *object)
|
2017-03-21 11:25:54 +00:00
|
|
|
{
|
|
|
|
if (! call->active)
|
|
|
|
return;
|
2017-04-20 11:56:47 +00:00
|
|
|
call->cancel_function(object, call->arg);
|
2017-03-21 11:25:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|