mirror of https://github.com/yandex/odyssey.git
44 lines
878 B
C
44 lines
878 B
C
#ifndef MM_COROUTINE_H
|
|
#define MM_COROUTINE_H
|
|
|
|
/*
|
|
* machinarium.
|
|
*
|
|
* cooperative multitasking engine.
|
|
*/
|
|
|
|
typedef struct mm_coroutine mm_coroutine_t;
|
|
|
|
typedef void (*mm_function_t)(void *arg);
|
|
|
|
typedef enum { MM_CNEW, MM_CREADY, MM_CACTIVE, MM_CFREE } mm_coroutinestate_t;
|
|
|
|
struct mm_coroutine {
|
|
uint64_t id;
|
|
mm_coroutinestate_t state;
|
|
int cancel;
|
|
int errno_;
|
|
mm_function_t function;
|
|
void *function_arg;
|
|
mm_contextstack_t stack;
|
|
mm_context_t context;
|
|
mm_coroutine_t *resume;
|
|
void *call_ptr;
|
|
mm_list_t joiners;
|
|
mm_list_t link_join;
|
|
mm_list_t link;
|
|
};
|
|
|
|
mm_coroutine_t *mm_coroutine_allocate(int, int);
|
|
|
|
void mm_coroutine_init(mm_coroutine_t *);
|
|
void mm_coroutine_free(mm_coroutine_t *);
|
|
void mm_coroutine_cancel(mm_coroutine_t *);
|
|
|
|
static inline int mm_coroutine_is_cancelled(mm_coroutine_t *coroutine)
|
|
{
|
|
return coroutine->cancel;
|
|
}
|
|
|
|
#endif /* MM_COROUTINE_H */
|