mirror of https://github.com/F-Stack/f-stack.git
114 lines
2.4 KiB
C
114 lines
2.4 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause */
|
|
|
|
#ifndef _RTE_OS_SHIM_
|
|
#define _RTE_OS_SHIM_
|
|
|
|
#include <time.h>
|
|
|
|
#include <rte_os.h>
|
|
#include <rte_windows.h>
|
|
|
|
/**
|
|
* @file
|
|
* @internal
|
|
* Provides semi-standard OS facilities by convenient names.
|
|
*/
|
|
|
|
#ifndef PATH_MAX
|
|
#define PATH_MAX _MAX_PATH
|
|
#endif
|
|
|
|
#define strdup(str) _strdup(str)
|
|
#define strtok_r(str, delim, saveptr) strtok_s(str, delim, saveptr)
|
|
#ifndef RTE_TOOLCHAIN_GCC
|
|
#define strcasecmp(s1, s2) _stricmp(s1, s2)
|
|
#define strncasecmp(s1, s2, count) _strnicmp(s1, s2, count)
|
|
#endif
|
|
|
|
#define open(...) _open(__VA_ARGS__)
|
|
#define read(fd, buf, n) _read(fd, buf, n)
|
|
#define write(fd, buf, n) _write(fd, buf, n)
|
|
#define close(fd) _close(fd)
|
|
#define unlink(path) _unlink(path)
|
|
|
|
#define IPVERSION 4
|
|
|
|
#define IPPROTO_IPIP 4
|
|
#define IPPROTO_GRE 47
|
|
#ifdef RTE_TOOLCHAIN_GCC
|
|
#define IPPROTO_SCTP 132
|
|
#endif
|
|
|
|
#ifndef IPDEFTTL
|
|
#define IPDEFTTL 64
|
|
#endif
|
|
|
|
#ifndef S_ISREG
|
|
#define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG)
|
|
#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 */
|
|
|
|
/* Identifier for system-wide realtime clock. */
|
|
#define CLOCK_REALTIME 0
|
|
/* Monotonic system-wide clock. */
|
|
#define CLOCK_MONOTONIC 1
|
|
|
|
typedef int clockid_t;
|
|
|
|
static inline int
|
|
rte_clock_gettime(clockid_t clock_id, struct timespec *tp)
|
|
{
|
|
const int NS_PER_SEC = 1E9;
|
|
LARGE_INTEGER pf, pc;
|
|
LONGLONG nsec;
|
|
|
|
switch (clock_id) {
|
|
case CLOCK_REALTIME:
|
|
if (timespec_get(tp, TIME_UTC) != TIME_UTC)
|
|
return -1;
|
|
return 0;
|
|
case CLOCK_MONOTONIC:
|
|
QueryPerformanceFrequency(&pf);
|
|
QueryPerformanceCounter(&pc);
|
|
|
|
nsec = pc.QuadPart * NS_PER_SEC / pf.QuadPart;
|
|
tp->tv_sec = nsec / NS_PER_SEC;
|
|
tp->tv_nsec = nsec - tp->tv_sec * NS_PER_SEC;
|
|
return 0;
|
|
default:
|
|
return -1;
|
|
}
|
|
}
|
|
#define clock_gettime(clock_id, tp) rte_clock_gettime(clock_id, tp)
|
|
|
|
#endif /* _RTE_OS_SHIM_ */
|