diff options
author | Bill Fischofer <bill.fischofer@linaro.org> | 2015-12-15 05:55:48 -0600 |
---|---|---|
committer | Maxim Uvarov <maxim.uvarov@linaro.org> | 2015-12-29 14:07:52 +0300 |
commit | f5efd956332b60c9647356d200e9f378c921542e (patch) | |
tree | ecf1b369dd88eef3dd688b6b0b3528d6a014bf8e /platform | |
parent | 41877180b16b16b09feffaa6fe58098408d87e4d (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.h | 13 | ||||
-rw-r--r-- | platform/linux-generic/odp_time.c | 28 |
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; } |