2017-03-21 10:56:02 +00:00
|
|
|
#ifndef MM_SCHEDULER_H_
|
|
|
|
#define MM_SCHEDULER_H_
|
|
|
|
|
|
|
|
/*
|
|
|
|
* machinarium.
|
|
|
|
*
|
|
|
|
* cooperative multitasking engine.
|
|
|
|
*/
|
|
|
|
|
|
|
|
typedef struct mm_scheduler_t mm_scheduler_t;
|
|
|
|
|
|
|
|
struct mm_scheduler_t {
|
|
|
|
mm_fiber_t *current;
|
|
|
|
mm_fiber_t main;
|
|
|
|
int count_ready;
|
|
|
|
int count_active;
|
|
|
|
int count_free;
|
|
|
|
mm_list_t list_ready;
|
|
|
|
mm_list_t list_active;
|
|
|
|
mm_list_t list_free;
|
|
|
|
int size_stack;
|
2017-03-21 13:32:54 +00:00
|
|
|
uint64_t id_seq;
|
2017-03-21 10:56:02 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
static inline mm_fiber_t*
|
|
|
|
mm_scheduler_current(mm_scheduler_t *scheduler) {
|
|
|
|
return scheduler->current;
|
|
|
|
}
|
|
|
|
|
2017-03-21 11:21:25 +00:00
|
|
|
static inline int
|
|
|
|
mm_scheduler_online(mm_scheduler_t *scheduler) {
|
|
|
|
return scheduler->count_active + scheduler->count_ready;
|
2017-03-21 10:56:02 +00:00
|
|
|
}
|
|
|
|
|
2017-05-18 10:27:10 +00:00
|
|
|
int mm_scheduler_init(mm_scheduler_t*, int);
|
2017-03-21 10:56:02 +00:00
|
|
|
void mm_scheduler_free(mm_scheduler_t*);
|
2017-05-18 12:07:16 +00:00
|
|
|
void mm_scheduler_run(mm_scheduler_t*);
|
2017-03-21 10:56:02 +00:00
|
|
|
|
|
|
|
mm_fiber_t*
|
|
|
|
mm_scheduler_new(mm_scheduler_t*, mm_function_t, void*);
|
|
|
|
|
2017-03-21 13:32:54 +00:00
|
|
|
mm_fiber_t*
|
|
|
|
mm_scheduler_find(mm_scheduler_t*, uint64_t);
|
|
|
|
|
2017-05-18 12:07:16 +00:00
|
|
|
void mm_scheduler_set(mm_scheduler_t*, mm_fiber_t*, mm_fiberstate_t);
|
|
|
|
void mm_scheduler_call(mm_scheduler_t*, mm_fiber_t*);
|
2017-03-21 10:56:02 +00:00
|
|
|
void mm_scheduler_yield(mm_scheduler_t*);
|
2017-05-18 12:07:16 +00:00
|
|
|
void mm_scheduler_join(mm_fiber_t*, mm_fiber_t*);
|
2017-03-21 10:56:02 +00:00
|
|
|
|
|
|
|
static inline void
|
2017-05-18 12:07:16 +00:00
|
|
|
mm_scheduler_wakeup(mm_scheduler_t *scheduler, mm_fiber_t *fiber)
|
2017-03-21 10:56:02 +00:00
|
|
|
{
|
2017-05-18 12:07:16 +00:00
|
|
|
mm_scheduler_set(scheduler, fiber, MM_FIBER_READY);
|
2017-03-21 10:56:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|