diff options
author | Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org> | 2015-12-18 14:01:52 +0200 |
---|---|---|
committer | Maxim Uvarov <maxim.uvarov@linaro.org> | 2015-12-29 14:07:51 +0300 |
commit | a8686e91a2d5cc05706365c80b3be2b4b3fa7581 (patch) | |
tree | f4967138cee5a7c9cebd081ad3d0204260922fd8 /platform | |
parent | 76034e7b2ddce85c6ec664b4e297aeb63e687dcb (diff) |
api: time: add resolution and wait API calls
This patch adds odp_time_local_res() and odp_time_wait_until(),
odp_time_wait_ns() APIs.
Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org>
Reviewed-by: Petri Savolainen <petri.savolainen@nokia.com>
Tested-by: Mike Holmes <mike.holmes@linaro.org>
Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
Conflicts:
platform/linux-generic/odp_time.c
Diffstat (limited to 'platform')
-rw-r--r-- | platform/linux-generic/odp_time.c | 98 |
1 files changed, 76 insertions, 22 deletions
diff --git a/platform/linux-generic/odp_time.c b/platform/linux-generic/odp_time.c index 1c7c21440..4807bc71d 100644 --- a/platform/linux-generic/odp_time.c +++ b/platform/linux-generic/odp_time.c @@ -24,8 +24,7 @@ uint64_t time_to_ns(odp_time_t time) return ns; } -static inline -odp_time_t time_diff(odp_time_t t2, odp_time_t t1) +static inline odp_time_t time_diff(odp_time_t t2, odp_time_t t1) { struct timespec time; @@ -40,7 +39,7 @@ odp_time_t time_diff(odp_time_t t2, odp_time_t t1) return time; } -odp_time_t odp_time_local(void) +static inline odp_time_t time_local(void) { int ret; struct timespec time; @@ -52,17 +51,33 @@ odp_time_t odp_time_local(void) return time_diff(time, start_time); } -odp_time_t odp_time_diff(odp_time_t t2, odp_time_t t1) +static inline int time_cmp(odp_time_t t2, odp_time_t t1) { - return time_diff(t2, t1); + if (t2.tv_sec < t1.tv_sec) + return -1; + + if (t2.tv_sec > t1.tv_sec) + return 1; + + return t2.tv_nsec - t1.tv_nsec; } -uint64_t odp_time_to_ns(odp_time_t time) +static inline odp_time_t time_sum(odp_time_t t1, odp_time_t t2) { - return time_to_ns(time); + odp_time_t time; + + time.tv_sec = t2.tv_sec + t1.tv_sec; + time.tv_nsec = t2.tv_nsec + t1.tv_nsec; + + if (time.tv_nsec >= (long)ODP_TIME_SEC_IN_NS) { + time.tv_nsec -= ODP_TIME_SEC_IN_NS; + ++time.tv_sec; + } + + return time; } -odp_time_t odp_time_local_from_ns(uint64_t ns) +static inline odp_time_t time_local_from_ns(uint64_t ns) { struct timespec time; @@ -72,30 +87,69 @@ odp_time_t odp_time_local_from_ns(uint64_t ns) return time; } -int odp_time_cmp(odp_time_t t2, odp_time_t t1) +static inline void time_wait_until(odp_time_t time) { - if (t2.tv_sec < t1.tv_sec) - return -1; + odp_time_t cur; - if (t2.tv_sec > t1.tv_sec) - return 1; + do { + cur = time_local(); + } while (time_cmp(time, cur) > 0); +} - return t2.tv_nsec - t1.tv_nsec; +odp_time_t odp_time_local(void) +{ + return time_local(); +} + +odp_time_t odp_time_diff(odp_time_t t2, odp_time_t t1) +{ + return time_diff(t2, t1); +} + +uint64_t odp_time_to_ns(odp_time_t time) +{ + return time_to_ns(time); +} + +odp_time_t odp_time_local_from_ns(uint64_t ns) +{ + return time_local_from_ns(ns); +} + +int odp_time_cmp(odp_time_t t2, odp_time_t t1) +{ + return time_cmp(t2, t1); } odp_time_t odp_time_sum(odp_time_t t1, odp_time_t t2) { - struct timespec time; + return time_sum(t1, t2); +} - time.tv_sec = t2.tv_sec + t1.tv_sec; - time.tv_nsec = t2.tv_nsec + t1.tv_nsec; +uint64_t odp_time_local_res(void) +{ + int ret; + struct timespec tres; - if (time.tv_nsec >= (long)ODP_TIME_SEC_IN_NS) { - time.tv_nsec -= ODP_TIME_SEC_IN_NS; - ++time.tv_sec; - } + ret = clock_getres(CLOCK_MONOTONIC_RAW, &tres); + if (odp_unlikely(ret != 0)) + ODP_ABORT("clock_getres failed\n"); - return time; + return ODP_TIME_SEC_IN_NS / (uint64_t)tres.tv_nsec; +} + +void odp_time_wait_ns(uint64_t ns) +{ + odp_time_t cur = time_local(); + odp_time_t wait = time_local_from_ns(ns); + odp_time_t end_time = time_sum(cur, wait); + + time_wait_until(end_time); +} + +void odp_time_wait_until(odp_time_t time) +{ + return time_wait_until(time); } uint64_t odp_time_to_u64(odp_time_t time) |