aboutsummaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
authorIvan Khoronzhuk <ivan.khoronzhuk@linaro.org>2015-12-18 14:01:52 +0200
committerMaxim Uvarov <maxim.uvarov@linaro.org>2015-12-29 14:07:51 +0300
commita8686e91a2d5cc05706365c80b3be2b4b3fa7581 (patch)
treef4967138cee5a7c9cebd081ad3d0204260922fd8 /platform
parent76034e7b2ddce85c6ec664b4e297aeb63e687dcb (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.c98
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)