odyssey/lib/ft_fiber.h

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