From f99ad3f0e2eb97e43a7e04611941ae5df98c5a38 Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Fri, 9 Dec 2016 10:39:49 +0200 Subject: [PATCH] kernel: Refactor remaining time evaluation for timeouts Factor out the code for evaluating the remaining time for _timeout structs so that it can also be used for other objects besides k_timer structs (like k_delayed_work, coming in a subsequent patch). Change-Id: I243a7b29fb2831f06e95086a31f0d3a6c37dad67 Signed-off-by: Johan Hedberg --- include/kernel.h | 7 ++++++- kernel/unified/timer.c | 7 +++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/include/kernel.h b/include/kernel.h index d49f8789d38..c64a6d5ab3a 100644 --- a/include/kernel.h +++ b/include/kernel.h @@ -654,6 +654,8 @@ struct _timeout { _timeout_func_t func; }; +extern int32_t _timeout_remaining_get(struct _timeout *timeout); + /** * INTERNAL_HIDDEN @endcond */ @@ -852,7 +854,10 @@ extern uint32_t k_timer_status_sync(struct k_timer *timer); * * @return Remaining time (in milliseconds). */ -extern int32_t k_timer_remaining_get(struct k_timer *timer); +static inline int32_t k_timer_remaining_get(struct k_timer *timer) +{ + return _timeout_remaining_get(&timer->timeout); +} /** * @} end defgroup timer_apis diff --git a/kernel/unified/timer.c b/kernel/unified/timer.c index 4067c779cf6..000be24a0e7 100644 --- a/kernel/unified/timer.c +++ b/kernel/unified/timer.c @@ -196,13 +196,12 @@ uint32_t k_timer_status_sync(struct k_timer *timer) return result; } - -int32_t k_timer_remaining_get(struct k_timer *timer) +int32_t _timeout_remaining_get(struct _timeout *timeout) { unsigned int key = irq_lock(); int32_t remaining_ticks; - if (timer->timeout.delta_ticks_from_prev == -1) { + if (timeout->delta_ticks_from_prev == -1) { remaining_ticks = 0; } else { /* @@ -213,7 +212,7 @@ int32_t k_timer_remaining_get(struct k_timer *timer) (struct _timeout *)sys_dlist_peek_head(&_timeout_q); remaining_ticks = t->delta_ticks_from_prev; - while (t != &timer->timeout) { + while (t != timeout) { t = (struct _timeout *)sys_dlist_peek_next(&_timeout_q, &t->node); remaining_ticks += t->delta_ticks_from_prev;