On 12/10/2015 11:21, Savolainen, Petri (Nokia - FI/Espoo) wrote:
Signed-off-by: Bill Fischofer <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;

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

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

Reply via email to