#ifndef MM_CLOCK_H #define MM_CLOCK_H /* * machinarium. * * cooperative multitasking engine. */ typedef struct mm_clock mm_clock_t; struct mm_clock { int active; int time_cached; uint64_t time_ms; uint64_t time_us; uint64_t time_ns; mm_buf_t timers; int timers_count; int timers_seq; }; void mm_clock_init(mm_clock_t*); void mm_clock_free(mm_clock_t*); void mm_clock_update(mm_clock_t*); int mm_clock_step(mm_clock_t*); int mm_clock_timer_add(mm_clock_t*, mm_timer_t*); int mm_clock_timer_del(mm_clock_t*, mm_timer_t*); mm_timer_t* mm_clock_timer_min(mm_clock_t*); static inline void mm_clock_reset(mm_clock_t *clock) { clock->time_cached = 0; } static inline void mm_timer_start(mm_clock_t *clock, mm_timer_t *timer) { if (! clock->active) mm_clock_update(clock); clock->active = 1; mm_clock_timer_add(clock, timer); } static inline void mm_timer_stop(mm_timer_t *timer) { if (! timer->active) return; mm_clock_t *clock = timer->clock; mm_clock_timer_del(clock, timer); if (clock->timers_count == 0) clock->active = 0; } #endif /* MM_CLOCK_H */