On 21.12.15 10:39, Savolainen, Petri (Nokia - FI/Espoo) wrote:
Otherwise OK, but I'd highlight that ability to *share* time stamps is the main
difference of global vs. local. See below.
-----Original Message-----
From: EXT Ivan Khoronzhuk [mailto:[email protected]]
Sent: Friday, December 18, 2015 2:14 PM
To: [email protected]
Cc: Savolainen, Petri (Nokia - FI/Espoo); Ivan Khoronzhuk
Subject: [lng-odp] [API-NEXT PATCH 1/2] api: time: add global time API
This patch add global time API and implements it in linux-generic.
Signed-off-by: Ivan Khoronzhuk <[email protected]>
---
include/odp/api/time.h | 28 ++++++++++++++++++++++++++++
platform/linux-generic/odp_time.c | 34 +++++++++++++++++++++++++++-------
2 files changed, 55 insertions(+), 7 deletions(-)
diff --git a/include/odp/api/time.h b/include/odp/api/time.h
index 1f94710..895af75 100644
--- a/include/odp/api/time.h
+++ b/include/odp/api/time.h
@@ -53,6 +53,18 @@ extern "C" {
odp_time_t odp_time_local(void);
/**
+ * Current global time
+ *
+ * Returns current global time stamp value. The global time source
provides high
+ * resolution time, it is initialized to zero during ODP startup and will
not
+ * wrap around in at least 10 years. The time is global that means it can
be
+ * used between threads.
This last sentence could be on its own line an simply state:
"Global time stamps can be shared between threads"
This patch could also add the same definition to odp_time_local() documentation:
/**
* Current local time
*
* Returns current local time stamp value. The local time source provides high
* resolution time, it is initialized to zero during ODP startup and will not
* wrap around in at least 10 years.
*
+ * Local time stamps are local to the calling thread and must not be shared
+ * with other threads.
*
* @return Local time stamp.
*/
odp_time_t odp_time_local(void);
odp_time_t typedef documents this already, but better to highlight it also on
the time stamp calls.
-Petri
Will correct in v2.
+ *
+ * @return Global time stamp.
+ */
+odp_time_t odp_time_global(void);
+
+/**
* Time difference
*
* @param t2 Second time stamp
@@ -91,6 +103,15 @@ uint64_t odp_time_to_ns(odp_time_t time);
odp_time_t odp_time_local_from_ns(uint64_t ns);
/**
+ * Convert nanoseconds to global time
+ *
+ * @param ns Time in nanoseconds
+ *
+ * @return Global time stamp
+ */
+odp_time_t odp_time_global_from_ns(uint64_t ns);
+
+/**
* Compare two times
*
* @param t2 Second time
@@ -108,6 +129,13 @@ int odp_time_cmp(odp_time_t t2, odp_time_t t1);
uint64_t odp_time_local_res(void);
/**
+ * Global time resolution in hertz
+ *
+ * @return Global time resolution in hertz
+ */
+uint64_t odp_time_global_res(void);
+
+/**
* Wait until the specified (wall clock) time has been reached
*
* The thread potentially busy loop the entire wait time.
diff --git a/platform/linux-generic/odp_time.c b/platform/linux-
generic/odp_time.c
index a3ab2e3..2cb84f2 100644
--- a/platform/linux-generic/odp_time.c
+++ b/platform/linux-generic/odp_time.c
@@ -101,11 +101,28 @@ static inline void time_wait_until(odp_time_t time)
} while (time_cmp(time, cur) > 0);
}
+static inline uint64_t time_local_res(void)
+{
+ int ret;
+ struct timespec tres;
+
+ ret = clock_getres(CLOCK_MONOTONIC_RAW, &tres);
+ if (odp_unlikely(ret != 0))
+ ODP_ABORT("clock_getres failed\n");
+
+ return ODP_TIME_SEC_IN_NS / (uint64_t)tres.tv_nsec;
+}
+
odp_time_t odp_time_local(void)
{
return time_local();
}
+odp_time_t odp_time_global(void)
+{
+ return time_local();
+}
+
odp_time_t odp_time_diff(odp_time_t t2, odp_time_t t1)
{
return time_diff(t2, t1);
@@ -121,6 +138,11 @@ odp_time_t odp_time_local_from_ns(uint64_t ns)
return time_local_from_ns(ns);
}
+odp_time_t odp_time_global_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);
@@ -133,14 +155,12 @@ odp_time_t odp_time_sum(odp_time_t t1, odp_time_t
t2)
uint64_t odp_time_local_res(void)
{
- int ret;
- struct timespec tres;
-
- ret = clock_getres(CLOCK_MONOTONIC_RAW, &tres);
- if (odp_unlikely(ret != 0))
- ODP_ABORT("clock_getres failed\n");
+ return time_local_res();
+}
- return ODP_TIME_SEC_IN_NS / (uint64_t)tres.tv_nsec;
+uint64_t odp_time_global_res(void)
+{
+ return time_local_res();
}
void odp_time_wait_ns(uint64_t ns)
--
1.9.1
--
Regards,
Ivan Khoronzhuk
_______________________________________________
lng-odp mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/lng-odp