odyssey/third_party/machinarium/sources/scheduler.h

53 lines
1.3 KiB
C
Raw Normal View History

2017-05-24 11:04:19 +00:00
#ifndef MM_SCHEDULER_H
#define MM_SCHEDULER_H
2017-03-21 10:56:02 +00:00
/*
* machinarium.
*
* cooperative multitasking engine.
*/
2017-05-24 11:04:19 +00:00
typedef struct mm_scheduler mm_scheduler_t;
2017-03-21 10:56:02 +00:00
2017-05-24 11:04:19 +00:00
struct mm_scheduler
{
mm_coroutine_t *current;
mm_coroutine_t main;
int count_ready;
int count_active;
mm_list_t list_ready;
mm_list_t list_active;
uint64_t id_seq;
2017-03-21 10:56:02 +00:00
};
static inline mm_coroutine_t*
2017-03-21 10:56:02 +00:00
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
}
int mm_scheduler_init(mm_scheduler_t*);
2017-03-21 10:56:02 +00:00
void mm_scheduler_free(mm_scheduler_t*);
void mm_scheduler_run(mm_scheduler_t*, mm_coroutine_cache_t*);
void mm_scheduler_new(mm_scheduler_t*, mm_coroutine_t*, mm_function_t, void*);
2017-03-21 10:56:02 +00:00
mm_coroutine_t*
mm_scheduler_find(mm_scheduler_t*, uint64_t);
void mm_scheduler_set(mm_scheduler_t*, mm_coroutine_t*, mm_coroutinestate_t);
void mm_scheduler_call(mm_scheduler_t*, mm_coroutine_t*);
2017-03-21 10:56:02 +00:00
void mm_scheduler_yield(mm_scheduler_t*);
void mm_scheduler_join(mm_coroutine_t*, mm_coroutine_t*);
2017-03-21 10:56:02 +00:00
static inline void
mm_scheduler_wakeup(mm_scheduler_t *scheduler, mm_coroutine_t *coroutine)
2017-03-21 10:56:02 +00:00
{
mm_scheduler_set(scheduler, coroutine, MM_CREADY);
2017-03-21 10:56:02 +00:00
}
2017-05-24 11:04:19 +00:00
#endif /* MM_SCHEDULER_H */