#ifndef MM_SCHEDULER_H #define MM_SCHEDULER_H /* * machinarium. * * cooperative multitasking engine. */ typedef struct mm_scheduler mm_scheduler_t; 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; }; static inline mm_coroutine_t* mm_scheduler_current(mm_scheduler_t *scheduler) { return scheduler->current; } static inline int mm_scheduler_online(mm_scheduler_t *scheduler) { return scheduler->count_active + scheduler->count_ready; } int mm_scheduler_init(mm_scheduler_t*); 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*); 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*); void mm_scheduler_yield(mm_scheduler_t*); void mm_scheduler_join(mm_coroutine_t*, mm_coroutine_t*); static inline void mm_scheduler_wakeup(mm_scheduler_t *scheduler, mm_coroutine_t *coroutine) { mm_scheduler_set(scheduler, coroutine, MM_CREADY); } #endif /* MM_SCHEDULER_H */