aboutsummaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
authorBill Fischofer <bill.fischofer@linaro.org>2015-12-15 05:55:48 -0600
committerMaxim Uvarov <maxim.uvarov@linaro.org>2015-12-29 14:07:52 +0300
commitf5efd956332b60c9647356d200e9f378c921542e (patch)
treeecf1b369dd88eef3dd688b6b0b3528d6a014bf8e /platform
parent41877180b16b16b09feffaa6fe58098408d87e4d (diff)
linux-generic: time: remove posix bleed through on odp_time_t
The linux-generic implementation of odp_time_t makes use of POSIX APIs that are sensitive to the _POSIX_C_SOURCE level. Use an indirection mechanism so that these dependencies do not "bleed through" the ODP API. This means that ODP applications can be independent of _POSIX_C_SOURCE level. Signed-off-by: Bill Fischofer <bill.fischofer@linaro.org> Reviewed-by: Ivan Khoronzhuk <ivan.khoronzhuk@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/include/odp/plat/time_types.h13
-rw-r--r--platform/linux-generic/odp_time.c28
2 files changed, 23 insertions, 18 deletions
diff --git a/platform/linux-generic/include/odp/plat/time_types.h b/platform/linux-generic/include/odp/plat/time_types.h
index e5765ec4c..14c35f0bf 100644
--- a/platform/linux-generic/include/odp/plat/time_types.h
+++ b/platform/linux-generic/include/odp/plat/time_types.h
@@ -21,11 +21,16 @@ extern "C" {
* @{
**/
-typedef struct timespec odp_time_t;
-
-odp_time_t odp_time_null(void);
+/**
+ * @internal Time structure used to isolate linux-generic implementation from
+ * the linux timespec structure, which is dependent on _POSIX_C_SOURCE level.
+ */
+typedef struct odp_time_t {
+ int64_t tv_sec; /**< @internal Seconds */
+ int64_t tv_nsec; /**< @internal Nanoseconds */
+} odp_time_t;
-#define ODP_TIME_NULL odp_time_null()
+#define ODP_TIME_NULL ((odp_time_t){0, 0})
/**
* @}
diff --git a/platform/linux-generic/odp_time.c b/platform/linux-generic/odp_time.c
index 6bb95fcc6..2cb84f2ab 100644
--- a/platform/linux-generic/odp_time.c
+++ b/platform/linux-generic/odp_time.c
@@ -11,7 +11,12 @@
#include <odp/hints.h>
#include <odp_debug_internal.h>
-static struct timespec start_time;
+typedef union {
+ odp_time_t ex;
+ struct timespec in;
+} _odp_time_t;
+
+static odp_time_t start_time;
static inline
uint64_t time_to_ns(odp_time_t time)
@@ -26,7 +31,7 @@ uint64_t time_to_ns(odp_time_t time)
static inline odp_time_t time_diff(odp_time_t t2, odp_time_t t1)
{
- struct timespec time;
+ odp_time_t time;
time.tv_sec = t2.tv_sec - t1.tv_sec;
time.tv_nsec = t2.tv_nsec - t1.tv_nsec;
@@ -42,13 +47,13 @@ static inline odp_time_t time_diff(odp_time_t t2, odp_time_t t1)
static inline odp_time_t time_local(void)
{
int ret;
- struct timespec time;
+ _odp_time_t time;
- ret = clock_gettime(CLOCK_MONOTONIC_RAW, &time);
+ ret = clock_gettime(CLOCK_MONOTONIC_RAW, &time.in);
if (odp_unlikely(ret != 0))
ODP_ABORT("clock_gettime failed\n");
- return time_diff(time, start_time);
+ return time_diff(time.ex, start_time);
}
static inline int time_cmp(odp_time_t t2, odp_time_t t1)
@@ -79,7 +84,7 @@ static inline odp_time_t time_sum(odp_time_t t1, odp_time_t t2)
static inline odp_time_t time_local_from_ns(uint64_t ns)
{
- struct timespec time;
+ odp_time_t time;
time.tv_sec = ns / ODP_TIME_SEC_IN_NS;
time.tv_nsec = ns - time.tv_sec * ODP_TIME_SEC_IN_NS;
@@ -187,18 +192,13 @@ uint64_t odp_time_to_u64(odp_time_t time)
return time_to_ns(time) / resolution;
}
-odp_time_t odp_time_null(void)
-{
- return (struct timespec) {0, 0};
-}
-
int odp_time_global_init(void)
{
int ret;
- struct timespec time;
+ _odp_time_t time;
- ret = clock_gettime(CLOCK_MONOTONIC_RAW, &time);
- start_time = ret ? odp_time_null() : time;
+ ret = clock_gettime(CLOCK_MONOTONIC_RAW, &time.in);
+ start_time = ret ? ODP_TIME_NULL : time.ex;
return ret;
}