Message ID | 20240828164341.875578-1-prestwoj@gmail.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | timeout: add l_timeout_get_remaining | expand |
Context | Check | Description |
---|---|---|
tedd_an/pre-ci_am | success | Success |
prestwoj/iwd-ci-setupell | success | Prep - Setup ELL |
prestwoj/iwd-ci-makedistcheck | success | Make Distcheck |
prestwoj/iwd-ci-build | success | Build - Configure |
prestwoj/iwd-ci-makecheckvalgrind | success | Make Check w/Valgrind |
prestwoj/iwd-ci-clang | success | clang PASS |
prestwoj/iwd-ci-makecheck | success | Make Check |
prestwoj/iwd-ci-testrunner | success | test-runner PASS |
Hi James, > +LIB_EXPORT bool l_timeout_get_remaining(struct l_timeout *timeout, > + uint64_t *remaining) Lets call this l_timeout_remaining() > +{ > + struct itimerspec current; > + > + if (unlikely(!timeout)) > + return false; > + > + if (timerfd_gettime(timeout->fd, ¤t) < 0) > + return false; > + > + if (remaining) > + *remaining = current.it_value.tv_sec * L_USEC_PER_SEC + > + current.it_value.tv_nsec / L_NSEC_PER_USEC; Can we use _time_from_timespec? Or maybe add that to time-private.h? > + > + return true; > +} Regards, -Denis
diff --git a/ell/ell.sym b/ell/ell.sym index c7dc9e6..759a84c 100644 --- a/ell/ell.sym +++ b/ell/ell.sym @@ -524,6 +524,7 @@ global: /* timeout */ l_timeout_create; l_timeout_create_ms; + l_timeout_get_remaining; l_timeout_modify; l_timeout_modify_ms; l_timeout_remove; diff --git a/ell/timeout.c b/ell/timeout.c index 4fc21a0..220b2df 100644 --- a/ell/timeout.c +++ b/ell/timeout.c @@ -23,6 +23,7 @@ #include "timeout.h" #include "main-private.h" #include "private.h" +#include "time.h" /** * SECTION:timeout @@ -298,3 +299,32 @@ LIB_EXPORT void l_timeout_set_callback(struct l_timeout *timeout, timeout->user_data = user_data; timeout->destroy = destroy; } + +/** + * l_timeout_get_remaining: + * + * Get the remaining time for a timeout in microseconds + * + * @timeout: timeout object + * @remaining: microseconds remaining on timer + * + * Returns: True if successfully got remaining time + * False if failure to get remaining time + **/ +LIB_EXPORT bool l_timeout_get_remaining(struct l_timeout *timeout, + uint64_t *remaining) +{ + struct itimerspec current; + + if (unlikely(!timeout)) + return false; + + if (timerfd_gettime(timeout->fd, ¤t) < 0) + return false; + + if (remaining) + *remaining = current.it_value.tv_sec * L_USEC_PER_SEC + + current.it_value.tv_nsec / L_NSEC_PER_USEC; + + return true; +} diff --git a/ell/timeout.h b/ell/timeout.h index 2db78d8..b9735a4 100644 --- a/ell/timeout.h +++ b/ell/timeout.h @@ -34,7 +34,8 @@ void l_timeout_remove(struct l_timeout *timeout); void l_timeout_set_callback(struct l_timeout *timeout, l_timeout_notify_cb_t callback, void *user_data, l_timeout_destroy_cb_t destroy); - +bool l_timeout_get_remaining(struct l_timeout *timeout, + uint64_t *remaining); #ifdef __cplusplus } #endif