diff options
author | Vincent Torri <vincent.torri@gmail.com> | 2020-08-26 18:44:28 +0000 |
---|---|---|
committer | Stefan Schmidt <stefan@datenfreihafen.org> | 2020-08-31 14:24:08 +0200 |
commit | d910fa3fa77860ea2e36c38d0c4b7212d203d159 (patch) | |
tree | 2a851349e45d58041f9c63fa21c17b2de4d575f3 | |
parent | 33304d656cf5a1b4580ce711851c3ebc57f1acea (diff) | |
download | efl-d910fa3fa77860ea2e36c38d0c4b7212d203d159.tar.gz |
Evil: add gettimeofday()
Add gettimeofday implementation based on the mingw one, using a more acurate function if Windows >= 8
Reviewed-by: João Paulo Taylor Ienczak Zanette <joao.tiz@expertisesolutions.com.br>
Reviewed-by: Stefan Schmidt <stefan@datenfreihafen.org>
Differential Revision: https://phab.enlightenment.org/D12111
-rw-r--r-- | src/lib/evil/evil_dlfcn.h | 4 | ||||
-rw-r--r-- | src/lib/evil/evil_macro_wrapper.h | 16 | ||||
-rw-r--r-- | src/lib/evil/evil_time.c | 52 | ||||
-rw-r--r-- | src/lib/evil/evil_time.h | 27 |
4 files changed, 97 insertions, 2 deletions
diff --git a/src/lib/evil/evil_dlfcn.h b/src/lib/evil/evil_dlfcn.h index 22f48b72ca..c55ce2562e 100644 --- a/src/lib/evil/evil_dlfcn.h +++ b/src/lib/evil/evil_dlfcn.h @@ -194,7 +194,7 @@ EAPI int dlclose(void* handle); */ EAPI void *dlsym(void* handle, const char* symbol); #ifndef HAVE_DLSYM -#define HAVE_DLSYM 1 +# define HAVE_DLSYM 1 #endif #ifdef _GNU_SOURCE @@ -223,7 +223,7 @@ EAPI void *dlsym(void* handle, const char* symbol); */ EAPI int dladdr (const void *addr, Dl_info *info); #ifndef HAVE_DLADDR -#define HAVE_DLADDR 1 +# define HAVE_DLADDR 1 #endif #endif /* _GNU_SOURCE */ diff --git a/src/lib/evil/evil_macro_wrapper.h b/src/lib/evil/evil_macro_wrapper.h index cd650e5e12..640f5a307e 100644 --- a/src/lib/evil/evil_macro_wrapper.h +++ b/src/lib/evil/evil_macro_wrapper.h @@ -46,6 +46,22 @@ #define mkdir(dirname, mode) evil_mkdir(dirname, mode) /* + * evil_time.h + */ + +/** + * @def gettimeofday(tv, tz) + * + * Wrapper around evil_gettimeofday(). + * + * @since 1.25 + */ +#ifndef _GETTIMEOFDAY_DEFINED +# define _GETTIMEOFDAY_DEFINED +# define gettimeofday(tv, tz) evil_gettimeofday(tv, tz) +#endif + +/* * evil_unistd.h */ diff --git a/src/lib/evil/evil_time.c b/src/lib/evil/evil_time.c index 32cfc2cf07..7d8de8f37c 100644 --- a/src/lib/evil/evil_time.c +++ b/src/lib/evil/evil_time.c @@ -10,6 +10,58 @@ #include "evil_private.h" /* + * gettimeofday + * based on https://github.com/Alexpux/mingw-w64/blob/master/mingw-w64-crt/misc/gettimeofday.c + * public domain + */ + +#define FILETIME_1970 116444736000000000ull /* seconds between 1/1/1601 and 1/1/1970 */ + +int evil_gettimeofday(struct timeval *tv, struct timezone *tz) +{ + int res = 0; + union + { + unsigned long long ns100; /* time since 1 Jan 1601 in 100ns units */ + FILETIME ft; + } _now; + TIME_ZONE_INFORMATION time_zone_information; + DWORD tzi; + + if (tz != NULL) + { + tzi = GetTimeZoneInformation(&time_zone_information); + if (tzi != TIME_ZONE_ID_INVALID) + { + tz->tz_minuteswest = time_zone_information.Bias; + if (tzi == TIME_ZONE_ID_DAYLIGHT) + tz->tz_dsttime = 1; + else + tz->tz_dsttime = 0; + } + else + { + tz->tz_minuteswest = 0; + tz->tz_dsttime = 0; + } + } + + if (tv != NULL) + { +#if _WIN32_WINNT < 0x0602 + GetSystemTimeAsFileTime(&_now.ft); +#else + GetSystemTimePreciseAsFileTime(&_now.ft); +#endif + _now.ns100 -= FILETIME_1970; /* 100 nano-seconds since 1-1-1970 */ + tv->tv_sec = _now.ns100 / 10000000ull; /* seconds since 1-1-1970 */ + tv->tv_usec = (long) (_now.ns100 % 10000000ull) /10; /* nanoseconds */ + } + + return res; +} + +/* * strptime * based on http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/time/strptime.c?rev=HEAD * BSD licence diff --git a/src/lib/evil/evil_time.h b/src/lib/evil/evil_time.h index 42004144a2..e61692e079 100644 --- a/src/lib/evil/evil_time.h +++ b/src/lib/evil/evil_time.h @@ -16,6 +16,33 @@ * @{ */ +#ifdef _MSC_VER +struct timezone +{ + int tz_minuteswest; /* of Greenwich */ + int tz_dsttime; /* type of dst correction to apply */ +}; +#endif + +/** + * @brief Get time and timezone. + * + * @param tv A pointer that contains two sockets. + * @param tz A pointer that contains two sockets. + * @return 0 on success, -1 otherwise. + * + * This function gets the time and timezone. @p tv and @p tz can be + * @c NULL. It calls GetSystemTimePreciseAsFileTime() on Windows 8or + * above if _WIN32_WINNT is correctly defined. It returns 0 on + * success, -1 otherwise. + * + * @since 1.25 + */ +EAPI int evil_gettimeofday(struct timeval *tv, struct timezone *tz); +#ifndef HAVE_GETTIMEOFDAY +# define HAVE_GETTIMEOFDAY 1 +#endif + /** * @brief Convert a string representation of time to a time tm structure . |