Message ID | 1450182567-7646-2-git-send-email-ivan.khoronzhuk@linaro.org |
---|---|
State | New |
Headers | show |
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-bounces@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.khoronzhuk@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
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)
This patch adds odp_time_local_res() and odp_time_wait() APIs. Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org> --- include/odp/api/time.h | 17 ++++++++++ platform/linux-generic/odp_time.c | 71 ++++++++++++++++++++++++++++++--------- 2 files changed, 72 insertions(+), 16 deletions(-)