On 12/11/2015 16:22, Bill Fischofer wrote:
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.fischo...@linaro.org>
---
  .../linux-generic/include/odp/plat/time_types.h    |  9 ++++---
  platform/linux-generic/odp_time.c                  | 30 +++++++++++-----------
  2 files changed, 20 insertions(+), 19 deletions(-)

diff --git a/platform/linux-generic/include/odp/plat/time_types.h 
b/platform/linux-generic/include/odp/plat/time_types.h
index e5765ec..e999beb 100644
--- a/platform/linux-generic/include/odp/plat/time_types.h
+++ b/platform/linux-generic/include/odp/plat/time_types.h
@@ -21,11 +21,12 @@ extern "C" {
   *  @{
   **/
-typedef struct timespec odp_time_t;
+typedef struct {
+       int64_t tv_sec;
time_t is not reachable?
+       int64_t tv_nsec;
+} odp_time_t;
-odp_time_t odp_time_null(void);
-
-#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 1c7c214..9b64b37 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)
@@ -27,7 +32,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;
@@ -43,13 +48,13 @@ odp_time_t time_diff(odp_time_t t2, odp_time_t t1)
  odp_time_t odp_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);
  }
odp_time_t odp_time_diff(odp_time_t t2, odp_time_t t1)
@@ -64,7 +69,7 @@ uint64_t odp_time_to_ns(odp_time_t time)
odp_time_t odp_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;
@@ -85,7 +90,7 @@ int odp_time_cmp(odp_time_t t2, odp_time_t t1)
odp_time_t odp_time_sum(odp_time_t t1, odp_time_t t2)
  {
-       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;
@@ -113,18 +118,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;
  }

_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to