Keep GNU fastpath for jerry_port_get_local_time_zone_adjustment (#4600)

PR #4513 caused a measurable slowdown by removing the GNU specific TZA calculation.
This patch reverts this removal but also keeps the general implementation introduced in #4513

JerryScript-DCO-1.0-Signed-off-by: Robert Fancsik robert.fancsik@h-lab.eu
This commit is contained in:
Robert Fancsik
2021-02-17 20:44:00 +01:00
committed by GitHub
parent 112ad83aaa
commit c14702c129
2 changed files with 31 additions and 3 deletions
+16
View File
@@ -59,6 +59,22 @@ endif()
# (should only be necessary if we used compiler default libc but not checking that) # (should only be necessary if we used compiler default libc but not checking that)
set(DEFINES_PORT_DEFAULT _BSD_SOURCE _DEFAULT_SOURCE) set(DEFINES_PORT_DEFAULT _BSD_SOURCE _DEFAULT_SOURCE)
INCLUDE (CheckStructHasMember)
# CHECK_STRUCT_HAS_MEMBER works by trying to compile some C code that accesses the
# given field of the given struct. However, our default compiler options break this
# C code, so turn a couple of them off for this.
if(USING_GCC OR USING_CLANG)
set(CMAKE_REQUIRED_FLAGS "-Wno-error=strict-prototypes -Wno-error=old-style-definition -Wno-error=unused-value")
endif()
# tm.tm_gmtoff is non-standard, so glibc doesn't expose it in c99 mode
# (our default). Define some macros to expose it anyway.
set(CMAKE_REQUIRED_DEFINITIONS "-D_BSD_SOURCE -D_DEFAULT_SOURCE")
CHECK_STRUCT_HAS_MEMBER ("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF)
# localtime_r is is not threadsafe with clang on OSX
if(HAVE_TM_GMTOFF AND NOT "${PLATFORM}" STREQUAL "DARWIN" AND NOT USING_CLANG)
set(DEFINES_PORT_DEFAULT ${DEFINES_PORT_DEFAULT} HAVE_TM_GMTOFF)
endif()
# Default Jerry port implementation library # Default Jerry port implementation library
add_library(${JERRY_PORT_DEFAULT_NAME} ${SOURCE_PORT_DEFAULT}) add_library(${JERRY_PORT_DEFAULT_NAME} ${SOURCE_PORT_DEFAULT})
target_include_directories(${JERRY_PORT_DEFAULT_NAME} PUBLIC ${INCLUDE_PORT_DEFAULT}) target_include_directories(${JERRY_PORT_DEFAULT_NAME} PUBLIC ${INCLUDE_PORT_DEFAULT})
+15 -3
View File
@@ -59,7 +59,19 @@ static double FileTimeToUnixTimeMs (FILETIME ft)
double jerry_port_get_local_time_zone_adjustment (double unix_ms, /**< ms since unix epoch */ double jerry_port_get_local_time_zone_adjustment (double unix_ms, /**< ms since unix epoch */
bool is_utc) /**< is the time above in UTC? */ bool is_utc) /**< is the time above in UTC? */
{ {
#ifdef _WIN32 #if defined (HAVE_TM_GMTOFF)
struct tm tm;
time_t now = (time_t) (unix_ms / 1000);
localtime_r (&now, &tm);
if (!is_utc)
{
now -= tm.tm_gmtoff;
localtime_r (&now, &tm);
}
return ((double) tm.tm_gmtoff) * 1000;
#elif defined (_WIN32)
FILETIME fileTime, localFileTime; FILETIME fileTime, localFileTime;
SYSTEMTIME systemTime, localSystemTime; SYSTEMTIME systemTime, localSystemTime;
ULARGE_INTEGER time, localTime; ULARGE_INTEGER time, localTime;
@@ -111,11 +123,11 @@ double jerry_port_get_local_time_zone_adjustment (double unix_ms, /**< ms since
} }
return tza_s * 1000; return tza_s * 1000;
#else /* !_WIN32 && !__GNUC__ && !__clang__ */ #else /* !HAVE_TM_GMTOFF && !_WIN32 && !__GNUC__ && !__clang__ */
(void) unix_ms; /* unused */ (void) unix_ms; /* unused */
(void) is_utc; /* unused */ (void) is_utc; /* unused */
return 0.0; return 0.0;
#endif /* _WIN32 */ #endif /* HAVE_TM_GMTOFF */
} /* jerry_port_get_local_time_zone_adjustment */ } /* jerry_port_get_local_time_zone_adjustment */
/** /**