On 17.12.15 15:52, Savolainen, Petri (Nokia - FI/Espoo) wrote:
On Tuesday call, there were suggestions for another type of wait calls /* * Wait the specified number of nanoseconds */ void odp_time_wait_ns(uint64_t nsec); /* * Wait until the specified (wall clock) time has been reached */ void odp_time_wait_until(odp_time_t time); These two could replace odp_time_wait(odp_time_t time), since waiting for a number of nsec does not need to define the (local/global) time source. Wait_ns is relative to the current time and wait_until is an absolute time in future. Absolute time wait can be more accurately synchronized, than application calculating relative wait time itself. Wait_until could return immediately if wall time has passed the time specified. -Petri
Ok. I will send new version. But odp_time_wait could be used in cases when odp_time_t wait is known already and no need to calculate relative time. It can be hidden inside, for lazy users...
-----Original Message----- From: lng-odp [mailto:lng-odp-boun...@lists.linaro.org] On Behalf Of EXT Ivan Khoronzhuk Sent: Tuesday, December 15, 2015 2:29 PM To: lng-odp@lists.linaro.org Subject: [lng-odp] [API-NEXT PATCH v2 1/6] api: time: add resolution and wait API calls This patch adds odp_time_local_res() and odp_time_wait() APIs. Signed-off-by: Ivan Khoronzhuk <ivan.khoronz...@linaro.org> --- include/odp/api/time.h | 17 ++++++++++ platform/linux-generic/odp_time.c | 71 ++++++++++++++++++++++++++++++---- ----- 2 files changed, 72 insertions(+), 16 deletions(-) diff --git a/include/odp/api/time.h b/include/odp/api/time.h index 9865d81..0c3b5c8 100644 --- a/include/odp/api/time.h +++ b/include/odp/api/time.h @@ -101,6 +101,23 @@ odp_time_t odp_time_local_from_ns(uint64_t ns); int odp_time_cmp(odp_time_t t2, odp_time_t t1); /** + * Local time resolution in hertz + * + * @return Local time resolution in hertz + */ +uint64_t odp_time_local_res(void); + +/** + * Wait on for specified length of time + * + * It likely causes the thread to busy loop. It's not guaranteed to put + * this thread into sleep and swap in another thread. + * + * @param time time to wait + */ +void odp_time_wait(odp_time_t time); + +/** * Get printable value for an odp_time_t * * @param time time to be printed diff --git a/platform/linux-generic/odp_time.c b/platform/linux- generic/odp_time.c index 9b64b37..3a41e2e 100644 --- a/platform/linux-generic/odp_time.c +++ b/platform/linux-generic/odp_time.c @@ -45,7 +45,8 @@ 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; _odp_time_t time; @@ -57,6 +58,39 @@ odp_time_t odp_time_local(void) return time_diff(time.ex, start_time); } +static inline +int time_cmp(odp_time_t t2, odp_time_t 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; +} + +static inline +odp_time_t time_sum(odp_time_t t1, odp_time_t t2) +{ + 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(void) +{ + return time_local(); +} + odp_time_t odp_time_diff(odp_time_t t2, odp_time_t t1) { return time_diff(t2, t1); @@ -79,28 +113,33 @@ odp_time_t odp_time_local_from_ns(uint64_t ns) int odp_time_cmp(odp_time_t t2, odp_time_t 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; + return time_cmp(t2, t1); } odp_time_t odp_time_sum(odp_time_t t1, odp_time_t t2) { - odp_time_t 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(odp_time_t time) +{ + odp_time_t cur = time_local(); + odp_time_t end_time = time_sum(cur, time); + + while (time_cmp(end_time, cur) > 0) + cur = time_local(); } uint64_t odp_time_to_u64(odp_time_t time) -- 1.9.1 _______________________________________________ lng-odp mailing list lng-odp@lists.linaro.org https://lists.linaro.org/mailman/listinfo/lng-odp
-- Regards, Ivan Khoronzhuk _______________________________________________ lng-odp mailing list lng-odp@lists.linaro.org https://lists.linaro.org/mailman/listinfo/lng-odp