Thanks.  I'll pop over to that thread to take a look.  However odp_time_t
should be opaque from a user perspective--that's the purpose of having
abstract types in the first place.

On Thu, Dec 10, 2015 at 9:00 AM, Mike Holmes <mike.hol...@linaro.org> wrote:

> Is anyone following the OFP project, they are also discussing this struct
> from a user of ODPs perspctive on a couple of threads like
> http://www.openfastpath.org/pipermail/openfastpath/2015-December/000048.html
>
> On 10 December 2015 at 08:07, Bill Fischofer <bill.fischo...@linaro.org>
> wrote:
>
>>
>>
>> On Thu, Dec 10, 2015 at 2:05 AM, Ivan Khoronzhuk <
>> ivan.khoronz...@linaro.org> wrote:
>>
>>>
>>>
>>> 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
>>
>>
>>
>> In the (unlikely) event that the struct changes and that change would be
>> made in a non-backward compatible manner, then inn that case ODP would
>> simply update the implementation to  match the new internal API while
>> maintaining the
>> external definition.  This might involve changing the union to do
>> intermediate copies, however for now the union is more efficient, which is
>> why that's the technique used here.
>>
>>
>>>
>>>
>>>> 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
>>>
>>
>>
>> _______________________________________________
>> lng-odp mailing list
>> lng-odp@lists.linaro.org
>> https://lists.linaro.org/mailman/listinfo/lng-odp
>>
>>
>
>
> --
> Mike Holmes
> Technical Manager - Linaro Networking Group
> Linaro.org <http://www.linaro.org/> *│ *Open source software for ARM SoCs
>
>
>
_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to