Message ID | 1449676401-16217-1-git-send-email-bill.fischofer@linaro.org |
---|---|
State | Superseded |
Headers | show |
On 9 December 2015 at 16:53, Bill Fischofer <bill.fischofer@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.fischofer@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); > 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); > + start_time = ret ? odp_time_null() : time.ex; > > return ret; > } > -- > 2.1.4 > > _______________________________________________ > lng-odp mailing list > lng-odp@lists.linaro.org > https://lists.linaro.org/mailman/listinfo/lng-odp >
Going to apply this patch to unblock builds in new distros. Any objections? Maxim. On 12/09/2015 19:25, Ola Liljedahl wrote: > On 9 December 2015 at 16:53, Bill Fischofer <bill.fischofer@linaro.org > <mailto:bill.fischofer@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.fischofer@linaro.org > <mailto:bill.fischofer@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
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.fischofer@linaro.org <mailto:bill.fischofer@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.fischofer@linaro.org >> <mailto:bill.fischofer@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
On 12/10/2015 11:21, Savolainen, Petri (Nokia - FI/Espoo) wrote: >> Signed-off-by: Bill Fischofer <bill.fischofer@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; > > This struct should match timespec exactly. If that’s not possible, union should not be used but copy data between timespec and odp_time_t. > > POSIX: "The <time.h> header shall declare the structure timespec, which has at least the following members:" > > time_t tv_sec Seconds. > long tv_nsec Nanoseconds. > > int64_t is not long. I think we hit that previously this week. Long may be 32 bits on a 32 bit system. > > time_t is defined in C headers. > > Also POSIX spec states that there can be more members than these. That hints that field order/offset and struct size may vary. At least the hack should be well documented and build/run time checked. > > -Petri Yes, Petri is right. Yesterday I went thought headers but did not see mismatch. Both values are signed in linux: struct timespec { __time_t tv_sec; /* Seconds. */ __syscall_slong_t tv_nsec; /* Nanoseconds. */ }; /* Signed long type used in system calls. */ __STD_TYPE __SYSCALL_SLONG_TYPE __syscall_slong_t; #if defined __x86_64__ && defined __ILP32__ # define __SYSCALL_SLONG_TYPE __SQUAD_TYPE # define __SYSCALL_ULONG_TYPE __UQUAD_TYPE #else # define __SYSCALL_SLONG_TYPE __SLONGWORD_TYPE # define __SYSCALL_ULONG_TYPE __ULONGWORD_TYPE #endif # define __SQUAD_TYPE long int #define __SLONGWORD_TYPE long int btw, time_t is also signed value: __STD_TYPE __TIME_T_TYPE __time_t; /* Seconds since the Epoch. */ #define __TIME_T_TYPE __SYSCALL_SLONG_TYPE But it's reachable from <sys/types.h> Question - why that values are signed in linux? Maxim. > > >> 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; >> + > _______________________________________________ > lng-odp mailing list > lng-odp@lists.linaro.org > https://lists.linaro.org/mailman/listinfo/lng-odp
On 10 December 2015 at 09:40, Maxim Uvarov <maxim.uvarov@linaro.org> wrote: > On 12/10/2015 11:21, Savolainen, Petri (Nokia - FI/Espoo) wrote: > >> Signed-off-by: Bill Fischofer <bill.fischofer@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; >>> >> >> This struct should match timespec exactly. If that’s not possible, union >> should not be used but copy data between timespec and odp_time_t. >> >> POSIX: "The <time.h> header shall declare the structure timespec, which >> has at least the following members:" >> >> time_t tv_sec Seconds. >> long tv_nsec Nanoseconds. >> >> int64_t is not long. I think we hit that previously this week. Long may >> be 32 bits on a 32 bit system. >> >> time_t is defined in C headers. >> >> Also POSIX spec states that there can be more members than these. That >> hints that field order/offset and struct size may vary. At least the hack >> should be well documented and build/run time checked. >> >> -Petri >> > > Yes, Petri is right. Yesterday I went thought headers but did not see > mismatch. > Both values are signed in linux: > > struct timespec > { > __time_t tv_sec; /* Seconds. */ > __syscall_slong_t tv_nsec; /* Nanoseconds. */ > }; > > /* Signed long type used in system calls. */ > __STD_TYPE __SYSCALL_SLONG_TYPE __syscall_slong_t; > > #if defined __x86_64__ && defined __ILP32__ > # define __SYSCALL_SLONG_TYPE __SQUAD_TYPE > # define __SYSCALL_ULONG_TYPE __UQUAD_TYPE > #else > # define __SYSCALL_SLONG_TYPE __SLONGWORD_TYPE > # define __SYSCALL_ULONG_TYPE __ULONGWORD_TYPE > #endif > > # define __SQUAD_TYPE long int > #define __SLONGWORD_TYPE long int > > btw, time_t is also signed value: > __STD_TYPE __TIME_T_TYPE __time_t; /* Seconds since the Epoch. */ > #define __TIME_T_TYPE __SYSCALL_SLONG_TYPE > > But it's reachable from <sys/types.h> > > Question - why that values are signed in linux? time_t has always been signed in Unix. Probably the original Unix implementors were more interested in that past (before 1970) than in the future (beyond year 2038). > > > Maxim. > > > >> >> 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; >>> + >>> >> _______________________________________________ >> 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 >
On 10 December 2015 at 09:30, Savolainen, Petri (Nokia - FI/Espoo) < petri.savolainen@nokia.com> wrote: > > > > > *From:* lng-odp [mailto:lng-odp-bounces@lists.linaro.org] *On Behalf Of *EXT > Ola Liljedahl > *Sent:* Wednesday, December 09, 2015 6:26 PM > *To:* Bill Fischofer > *Cc:* LNG ODP Mailman List > *Subject:* Re: [lng-odp] [API-NEXT PATCH] linux-generic: time: remove > posix bleed through on odp_time_t > > > > On 9 December 2015 at 16:53, Bill Fischofer <bill.fischofer@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. > > > > This definition is still platform (linux-generic) specific. It just > redefines timespec struct, so that original timespec and thus posix level > is not visible to application. > For now it is platform specific but now when we have a definition which is decoupled from the underlying implementation, we can promote this to become the binary interface for all ODP implementations. I didn't say we are there yet. > > > -Petri > > >
On Thu, Dec 10, 2015 at 2:05 AM, Ivan Khoronzhuk <ivan.khoronzhuk@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.fischofer@linaro.org >>> <mailto:bill.fischofer@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.fischofer@linaro.org >>> <mailto:bill.fischofer@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 >
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.fischofer@linaro.org> wrote: > > > On Thu, Dec 10, 2015 at 2:05 AM, Ivan Khoronzhuk < > ivan.khoronzhuk@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.fischofer@linaro.org >>>> <mailto:bill.fischofer@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.fischofer@linaro.org >>>> <mailto:bill.fischofer@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
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.holmes@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.fischofer@linaro.org> > wrote: > >> >> >> On Thu, Dec 10, 2015 at 2:05 AM, Ivan Khoronzhuk < >> ivan.khoronzhuk@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.fischofer@linaro.org >>>>> <mailto:bill.fischofer@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.fischofer@linaro.org >>>>> <mailto:bill.fischofer@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 > > >
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); 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); + start_time = ret ? odp_time_null() : time.ex; return ret; }
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> --- .../linux-generic/include/odp/plat/time_types.h | 5 +++- platform/linux-generic/odp_time.c | 27 +++++++++++++--------- 2 files changed, 20 insertions(+), 12 deletions(-)