C11 timespec_get() is not provided on some platforms:

* MinGW-w64 does not currently implement it [1].
* FreeBSD 11 with Clang 10.0.0 does not provide it.

Add internal shims to Windows and FreeBSD EALs.
For Windows, it can be removed after [1] is fixed.

[1]: https://sourceforge.net/p/mingw-w64/mailman/message/37224689/

Signed-off-by: Dmitry Kozlyuk <dmitry.kozl...@gmail.com>
Acked-by: Jie Zhou <j...@linux.microsoft.com>
Acked-by: Nick Connolly <nick.conno...@mayadata.io>
---
 lib/eal/freebsd/include/rte_os_shim.h | 17 ++++++++++++++
 lib/eal/windows/include/rte_os_shim.h | 32 +++++++++++++++++++++++++++
 2 files changed, 49 insertions(+)

diff --git a/lib/eal/freebsd/include/rte_os_shim.h 
b/lib/eal/freebsd/include/rte_os_shim.h
index 1e85229ca9..10b51b802f 100644
--- a/lib/eal/freebsd/include/rte_os_shim.h
+++ b/lib/eal/freebsd/include/rte_os_shim.h
@@ -3,6 +3,8 @@
 #ifndef _RTE_OS_SHIM_
 #define _RTE_OS_SHIM_
 
+#include <time.h>
+
 #include <rte_os.h>
 
 /**
@@ -11,4 +13,19 @@
  * Provides semi-standard OS facilities by convenient names.
  */
 
+#ifndef TIME_UTC
+
+#define TIME_UTC 1
+
+static inline int
+rte_timespec_get(struct timespec *now, int base)
+{
+       if (base != TIME_UTC || clock_gettime(CLOCK_REALTIME, now) < 0)
+               return 0;
+       return base;
+}
+
+#define timespec_get(ts, base) rte_timespec_get(ts, base)
+
+#endif /* !defined TIME_UTC */
 #endif /* _RTE_OS_SHIM_ */
diff --git a/lib/eal/windows/include/rte_os_shim.h 
b/lib/eal/windows/include/rte_os_shim.h
index f40fb62d1d..e50895fd83 100644
--- a/lib/eal/windows/include/rte_os_shim.h
+++ b/lib/eal/windows/include/rte_os_shim.h
@@ -3,7 +3,10 @@
 #ifndef _RTE_OS_SHIM_
 #define _RTE_OS_SHIM_
 
+#include <time.h>
+
 #include <rte_os.h>
+#include <rte_windows.h>
 
 /**
  * @file
@@ -33,4 +36,33 @@
 #define IPPROTO_SCTP   132
 #endif
 
+#ifdef RTE_TOOLCHAIN_GCC
+
+#define TIME_UTC 1
+
+static inline int
+rte_timespec_get(struct timespec *now, int base)
+{
+       /* 100ns ticks from 1601-01-01 to 1970-01-01 */
+       static const uint64_t EPOCH = 116444736000000000ULL;
+       static const uint64_t TICKS_PER_SEC = 10000000;
+       static const uint64_t NS_PER_TICK = 100;
+
+       FILETIME ft;
+       uint64_t ticks;
+
+       if (base != TIME_UTC)
+               return 0;
+
+       GetSystemTimePreciseAsFileTime(&ft);
+       ticks = ((uint64_t)ft.dwHighDateTime << 32) | ft.dwLowDateTime;
+       ticks -= EPOCH;
+       now->tv_sec = ticks / TICKS_PER_SEC;
+       now->tv_nsec = (ticks - now->tv_sec * TICKS_PER_SEC) * NS_PER_TICK;
+       return base;
+}
+
+#define timespec_get(ts, base) rte_timespec_get(ts, base)
+
+#endif /* RTE_TOOLCHAIN_GCC */
 #endif /* _RTE_OS_SHIM_ */
-- 
2.29.3

Reply via email to