mirror of https://github.com/yandex/odyssey.git
59 lines
1.1 KiB
C
59 lines
1.1 KiB
C
#ifndef MM_SCHEDULER_H_
|
|
#define MM_SCHEDULER_H_
|
|
|
|
/*
|
|
* machinarium.
|
|
*
|
|
* Cooperative multitasking engine.
|
|
*/
|
|
|
|
typedef struct mmscheduler mmscheduler;
|
|
|
|
struct mmscheduler {
|
|
mmlist list_ready;
|
|
mmlist list_active;
|
|
mmlist list_free;
|
|
int count_ready;
|
|
int count_active;
|
|
int count_free;
|
|
int size_stack;
|
|
mmfiber main;
|
|
mmfiber *current;
|
|
uint64_t seq;
|
|
void *data;
|
|
};
|
|
|
|
static inline mmfiber*
|
|
mm_scheduler_current(mmscheduler *s) {
|
|
return s->current;
|
|
}
|
|
|
|
static inline mmfiber*
|
|
mm_scheduler_next_ready(mmscheduler *s)
|
|
{
|
|
if (s->count_ready == 0)
|
|
return NULL;
|
|
return mm_container_of(s->list_ready.next, mmfiber, link);
|
|
}
|
|
|
|
static inline int
|
|
mm_scheduler_online(mmscheduler *s) {
|
|
return s->count_active + s->count_ready;
|
|
}
|
|
|
|
void mm_scheduler_init(mmscheduler*, int, void*);
|
|
void mm_scheduler_free(mmscheduler*);
|
|
|
|
mmfiber*
|
|
mm_scheduler_new(mmscheduler*, mmfiberf, void*);
|
|
|
|
mmfiber*
|
|
mm_scheduler_match(mmscheduler*, uint64_t);
|
|
|
|
void mm_scheduler_set(mmfiber*, mmfiberstate);
|
|
void mm_scheduler_call(mmfiber*);
|
|
void mm_scheduler_yield(mmscheduler*);
|
|
void mm_scheduler_wait(mmfiber*, mmfiber*);
|
|
|
|
#endif
|