odyssey/lib/ft_scheduler.h

59 lines
1.1 KiB
C

#ifndef FT_SCHEDULER_H_
#define FT_SCHEDULER_H_
/*
* flint.
*
* Cooperative multitasking engine.
*/
typedef struct ftscheduler ftscheduler;
struct ftscheduler {
ftlist list_ready;
ftlist list_active;
ftlist list_free;
int count_ready;
int count_active;
int count_free;
int size_stack;
ftfiber main;
ftfiber *current;
uint64_t seq;
void *data;
};
static inline ftfiber*
ft_scheduler_current(ftscheduler *s) {
return s->current;
}
static inline ftfiber*
ft_scheduler_next_ready(ftscheduler *s)
{
if (s->count_ready == 0)
return NULL;
return ft_container_of(s->list_ready.next, ftfiber, link);
}
static inline int
ft_scheduler_online(ftscheduler *s) {
return s->count_active + s->count_ready;
}
void ft_scheduler_init(ftscheduler*, int, void*);
void ft_scheduler_free(ftscheduler*);
ftfiber*
ft_scheduler_new(ftscheduler*, ftfiberf, void*);
ftfiber*
ft_scheduler_match(ftscheduler*, uint64_t);
void ft_scheduler_set(ftfiber*, ftfiberstate);
void ft_scheduler_call(ftfiber*);
void ft_scheduler_yield(ftscheduler*);
void ft_scheduler_wait(ftfiber*, ftfiber*);
#endif