On 10.12.15 08:42, Maxim Uvarov wrote:
Going to apply this patch to unblock builds in new distros. Any objections?

Maxim.

I worry about change of timespec struct can break linux-generic time API.
I believe it will not happen, but that's why I like Maxim`s approach a little 
more.
[lng-odp] [API-NEXT PATCH 2/2] linux-generic: time: use same type as returned


On 12/09/2015 19:25, Ola Liljedahl wrote:
On 9 December 2015 at 16:53, Bill Fischofer <bill.fischo...@linaro.org 
<mailto:bill.fischo...@linaro.org>> 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.

Yes this is the way it should be done. This is also another step in the ODP API 
becoming binary portable and run-time independent of the actual implementation.


    Signed-off-by: Bill Fischofer <bill.fischo...@linaro.org
    <mailto:bill.fischo...@linaro.org>>
    ---
     .../linux-generic/include/odp/plat/time_types.h    |  5 +++-
     platform/linux-generic/odp_time.c                  | 27
    +++++++++++++---------
     2 files changed, 20 insertions(+), 12 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..05e2b59 100644
    --- a/platform/linux-generic/include/odp/plat/time_types.h
    +++ b/platform/linux-generic/include/odp/plat/time_types.h
    @@ -21,7 +21,10 @@ extern "C" {
      *  @{
      **/

    -typedef struct timespec odp_time_t;
    +typedef struct {
    +       uint64_t tv_sec;
    +       int64_t  tv_nsec;
    +} odp_time_t;

     odp_time_t odp_time_null(void);

    diff --git a/platform/linux-generic/odp_time.c
    b/platform/linux-generic/odp_time.c
    index 1c7c214..b5737f6 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
    <http://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;
    @@ -115,16 +120,16 @@ uint64_t odp_time_to_u64(odp_time_t time)

     odp_time_t odp_time_null(void)
     {
    -       return (struct timespec) {0, 0};
    +       return (odp_time_t) {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
    <http://time.in>);
    +       start_time = ret ? odp_time_null() : time.ex;

            return ret;
     }
    --
    2.1.4

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




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

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

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

Reply via email to