odyssey/third_party/machinarium/sources/clock.h

56 lines
1.1 KiB
C
Raw Normal View History

2017-05-24 11:04:19 +00:00
#ifndef MM_CLOCK_H
#define MM_CLOCK_H
2017-04-10 12:11:06 +00:00
/*
* machinarium.
*
* cooperative multitasking engine.
*/
2017-04-10 12:11:06 +00:00
2017-05-24 11:04:19 +00:00
typedef struct mm_clock mm_clock_t;
2017-04-10 12:11:06 +00:00
struct mm_clock {
int active;
int time_cached;
2018-11-27 13:19:16 +00:00
uint64_t time_ms;
uint64_t time_us;
2018-11-27 13:19:16 +00:00
uint64_t time_ns;
2017-04-10 12:11:06 +00:00
mm_buf_t timers;
int timers_count;
int timers_seq;
2017-04-10 12:11:06 +00:00
};
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 *);
2017-04-10 12:11:06 +00:00
static inline void mm_clock_reset(mm_clock_t *clock)
2018-11-27 13:19:16 +00:00
{
clock->time_cached = 0;
}
static inline void mm_timer_start(mm_clock_t *clock, mm_timer_t *timer)
{
if (!clock->active)
2018-11-27 13:19:16 +00:00
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;
2018-11-27 13:19:16 +00:00
mm_clock_t *clock = timer->clock;
mm_clock_timer_del(clock, timer);
if (clock->timers_count == 0)
clock->active = 0;
}
2017-05-24 11:04:19 +00:00
#endif /* MM_CLOCK_H */