diff options
author | Harald Welte <laforge@gnumonks.org> | 2012-07-13 12:21:04 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2012-07-13 12:22:20 +0200 |
commit | e30b6ac5d1127c368184232dc749cef28d0cbb6c (patch) | |
tree | 2afac8b934cc4510981cfcf00432ebabf07fd12c | |
parent | 3c16de295480f269a1610c6d2cc559718c39c202 (diff) |
timer: Add function osmo_timer_remaining() to determine remainign time
-rw-r--r-- | include/osmocom/core/timer.h | 4 | ||||
-rw-r--r-- | src/timer.c | 28 |
2 files changed, 31 insertions, 1 deletions
diff --git a/include/osmocom/core/timer.h b/include/osmocom/core/timer.h index ecb50017..d37af806 100644 --- a/include/osmocom/core/timer.h +++ b/include/osmocom/core/timer.h @@ -73,7 +73,9 @@ void osmo_timer_del(struct osmo_timer_list *timer); int osmo_timer_pending(struct osmo_timer_list *timer); - +int osmo_timer_remaining(const struct osmo_timer_list *timer, + const struct timeval *now, + struct timeval *remaining); /* * internal timer list management */ diff --git a/src/timer.c b/src/timer.c index cca2a239..6d4abc26 100644 --- a/src/timer.c +++ b/src/timer.c @@ -126,6 +126,34 @@ int osmo_timer_pending(struct osmo_timer_list *timer) return timer->active; } +/*! \brief compute the remaining time of a timer + * \param[in] timer the to-be-checked timer + * \param[in] the current time (NULL if not known) + * \param[out] remaining remaining time until timer fires + * \return 0 if timer has not expired yet, -1 if it has + * + * This function can be used to determine the amount of time + * remaining until the expiration of the timer. + */ +int osmo_timer_remaining(const struct osmo_timer_list *timer, + const struct timeval *now, + struct timeval *remaining) +{ + struct timeval current_time; + + if (!now) { + gettimeofday(¤t_time, NULL); + now = ¤t_time; + } + + timersub(&timer->timeout, ¤t_time, remaining); + + if (remaining->tv_sec < 0) + return -1; + + return 0; +} + /* * if we have a nearest time return the delta between the current * time and the time of the nearest timer. |