mirror of https://github.com/yandex/odyssey.git
103 lines
1.7 KiB
C
103 lines
1.7 KiB
C
#ifndef FT_FIBER_H_
|
|
#define FT_FIBER_H_
|
|
|
|
/*
|
|
* flint.
|
|
*
|
|
* Cooperative multitasking engine.
|
|
*/
|
|
|
|
typedef struct ftfiberop ftfiberop;
|
|
typedef struct ftfiber ftfiber;
|
|
|
|
typedef enum {
|
|
FT_FNEW,
|
|
FT_FREADY,
|
|
FT_FACTIVE,
|
|
FT_FFREE
|
|
} ftfiberstate;
|
|
|
|
typedef void (*ftfiberf)(void *arg);
|
|
typedef void (*ftfibercancelf)(ftfiber*, void *arg);
|
|
|
|
struct ftfiberop {
|
|
int in_progress;
|
|
ftfibercancelf cancel;
|
|
void *arg;
|
|
};
|
|
|
|
struct ftfiber {
|
|
uint64_t id;
|
|
ftfiberstate state;
|
|
ftfiberf function;
|
|
ftfiberop op;
|
|
int cancel;
|
|
void *arg;
|
|
ftcontext context;
|
|
ftfiber *resume;
|
|
uv_timer_t timer;
|
|
void *scheduler;
|
|
void *data;
|
|
ftlist waiters;
|
|
ftlist link_wait;
|
|
ftlist link;
|
|
};
|
|
|
|
void ft_fiber_init(ftfiber*);
|
|
|
|
static inline int
|
|
ft_fiber_is_cancel(ftfiber *fiber) {
|
|
return fiber->cancel;
|
|
}
|
|
|
|
static inline char*
|
|
ft_fiber_stackof(ftfiber *fiber) {
|
|
return (char*)fiber + sizeof(ftfiber);
|
|
}
|
|
|
|
ftfiber*
|
|
ft_fiber_alloc(int);
|
|
|
|
void
|
|
ft_fiber_free(ftfiber*);
|
|
|
|
static inline void
|
|
ft_fiber_timer_stop(ftfiber *fiber)
|
|
{
|
|
if (! uv_is_closing((uv_handle_t*)&fiber->timer))
|
|
uv_close((uv_handle_t*)&fiber->timer, NULL);
|
|
}
|
|
|
|
static inline void
|
|
ft_fiber_opbegin(ftfiber *fiber, ftfibercancelf cancel, void *arg)
|
|
{
|
|
ftfiberop *op = &fiber->op;
|
|
op->in_progress = 1;
|
|
op->cancel = cancel;
|
|
op->arg = arg;
|
|
}
|
|
|
|
static inline void
|
|
ft_fiber_opend(ftfiber *fiber)
|
|
{
|
|
ftfiberop *op = &fiber->op;
|
|
op->in_progress = 0;
|
|
op->cancel = NULL;
|
|
op->arg = NULL;
|
|
}
|
|
|
|
static inline void
|
|
ft_fiber_opcancel(ftfiber *fiber)
|
|
{
|
|
ftfiberop *op = &fiber->op;
|
|
if (fiber->cancel)
|
|
return;
|
|
fiber->cancel++;
|
|
if (! op->in_progress)
|
|
return;
|
|
assert(op->cancel);
|
|
op->cancel(fiber, op->arg);
|
|
}
|
|
|
|
#endif
|