2016-11-08 12:07:09 +00:00
|
|
|
#ifndef FT_SCHEDULER_H_
|
|
|
|
#define FT_SCHEDULER_H_
|
|
|
|
|
|
|
|
/*
|
2016-11-08 14:53:52 +00:00
|
|
|
* flint.
|
2016-11-08 12:07:09 +00:00
|
|
|
*
|
|
|
|
* 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*);
|
|
|
|
|
2016-11-17 10:03:42 +00:00
|
|
|
ftfiber*
|
|
|
|
ft_scheduler_match(ftscheduler*, uint64_t);
|
|
|
|
|
2016-11-08 12:07:09 +00:00
|
|
|
void ft_scheduler_set(ftfiber*, ftfiberstate);
|
|
|
|
void ft_scheduler_call(ftfiber*);
|
|
|
|
void ft_scheduler_yield(ftscheduler*);
|
2016-11-17 10:03:42 +00:00
|
|
|
void ft_scheduler_wait(ftfiber*, ftfiber*);
|
2016-11-08 12:07:09 +00:00
|
|
|
|
|
|
|
#endif
|