From b22e65c8412a445fec7bd59ca15804e081b751ea Mon Sep 17 00:00:00 2001 From: Dmitry Simonenko Date: Mon, 10 Apr 2017 15:55:59 +0300 Subject: [PATCH] machinarium: set/update clock time --- src/machinarium_private.h | 1 + src/mm_clock.c | 16 +++++++++++++++- src/mm_clock.h | 1 + src/mm_loop.c | 8 ++++++++ 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/machinarium_private.h b/src/machinarium_private.h index 2620c4ce..9c6f7dc6 100644 --- a/src/machinarium_private.h +++ b/src/machinarium_private.h @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include diff --git a/src/mm_clock.c b/src/mm_clock.c index 2c6400d1..cd09d73a 100644 --- a/src/mm_clock.c +++ b/src/mm_clock.c @@ -29,7 +29,7 @@ void mm_clock_init(mm_clock_t *clock) mm_buf_init(&clock->timers); clock->timers_count = 0; clock->timers_seq = 0; - clock->time = 0; + clock->time = 0; } void mm_clock_free(mm_clock_t *clock) @@ -118,3 +118,17 @@ int mm_clock_step(mm_clock_t *clock) clock->timers_count -= timers_hit; return timers_hit; } + +static uint64_t +mm_clock_gettime(void) +{ + struct timespec t; + clock_gettime(CLOCK_MONOTONIC, &t); + return t.tv_sec * (uint64_t) 1e9 + t.tv_nsec; +} + +void mm_clock_update(mm_clock_t *clock) +{ + /* set current time in millisecond precision */ + clock->time = mm_clock_gettime() / 1000000; +} diff --git a/src/mm_clock.h b/src/mm_clock.h index 36e4be01..4cd55c40 100644 --- a/src/mm_clock.h +++ b/src/mm_clock.h @@ -18,6 +18,7 @@ struct mm_clock_t { 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*); diff --git a/src/mm_loop.c b/src/mm_loop.c index 9057066b..84398141 100644 --- a/src/mm_loop.c +++ b/src/mm_loop.c @@ -30,15 +30,23 @@ int mm_loop_shutdown(mm_loop_t *loop) int mm_loop_step(mm_loop_t *loop) { + /* update clock time */ + mm_clock_update(&loop->clock); + + /* get minimal timer timeout */ int timeout = INT_MAX; mm_timer_t *min; min = mm_clock_timer_min(&loop->clock); if (min == NULL) timeout = min->timeout; + + /* poll for events */ int rc; rc = loop->poll->iface->step(loop->poll, timeout); if (rc == -1) return -1; + + /* run timers */ mm_clock_step(&loop->clock); return 0; }