aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkos Kiss <akiss@inf.u-szeged.hu>2021-01-29 10:45:46 +0100
committerGitHub <noreply@github.com>2021-01-29 10:45:46 +0100
commit87d30b8088aa23ee74b7d2c7ce405913316f9b33 (patch)
tree1a70f8b08d676a5bd2a2a4f27582cc599029f580
parentba06d492a340bee7d82ff9595851cd278b7bd572 (diff)
Refactoring time-related default port implementations (#4513)
In the non-Windows code paths: - New approach to compute TZA without the need for GNU-specific `struct tm.tm_gmtoff`. - Always using `usleep` to sleep. (No real need for `nanosleep` as port API has sleep granularity of milliseconds.) - Not checking for "time.h" at build configuration time as that header is mandated by the C standard. - Not checking for "unistd.h" at build configuration time as that header is mandated by the POSIX standard (the default port is targeting POSIX systems -- and Windows). - Fixing some macro guards. JerryScript-DCO-1.0-Signed-off-by: Akos Kiss akiss@inf.u-szeged.hu
-rw-r--r--jerry-port/default/CMakeLists.txt25
-rw-r--r--jerry-port/default/default-date.c65
-rw-r--r--jerry-port/default/default-debugger.c20
3 files changed, 44 insertions, 66 deletions
diff --git a/jerry-port/default/CMakeLists.txt b/jerry-port/default/CMakeLists.txt
index 3560b072..f70ff24c 100644
--- a/jerry-port/default/CMakeLists.txt
+++ b/jerry-port/default/CMakeLists.txt
@@ -59,31 +59,6 @@ endif()
# (should only be necessary if we used compiler default libc but not checking that)
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)
-if(HAVE_TM_GMTOFF)
- set(DEFINES_PORT_DEFAULT ${DEFINES_PORT_DEFAULT} HAVE_TM_GMTOFF)
-endif()
-
-# Sleep function availability check
-INCLUDE (CheckIncludeFiles)
-CHECK_INCLUDE_FILES (time.h HAVE_TIME_H)
-CHECK_INCLUDE_FILES (unistd.h HAVE_UNISTD_H)
-if(HAVE_TIME_H)
- set(DEFINES_PORT_DEFAULT ${DEFINES_PORT_DEFAULT} HAVE_TIME_H)
-elseif(HAVE_UNISTD_H)
- set(DEFINES_PORT_DEFAULT ${DEFINES_PORT_DEFAULT} HAVE_UNISTD_H)
-endif()
-
# Default Jerry port implementation library
add_library(${JERRY_PORT_DEFAULT_NAME} ${SOURCE_PORT_DEFAULT})
target_include_directories(${JERRY_PORT_DEFAULT_NAME} PUBLIC ${INCLUDE_PORT_DEFAULT})
diff --git a/jerry-port/default/default-date.c b/jerry-port/default/default-date.c
index 240516b9..57ce6875 100644
--- a/jerry-port/default/default-date.c
+++ b/jerry-port/default/default-date.c
@@ -13,20 +13,17 @@
* limitations under the License.
*/
-#ifdef HAVE_TM_GMTOFF
#include <time.h>
-#endif /* HAVE_TM_GMTOFF */
#ifdef _WIN32
#include <windows.h>
#include <winbase.h>
#include <winnt.h>
-#include <time.h>
#endif /* _WIN32 */
-#ifdef __GNUC__
+#if defined (__GNUC__) || defined (__clang__)
#include <sys/time.h>
-#endif /* __GNUC__ */
+#endif /* __GNUC__ || __clang__ */
#include "jerryscript-port.h"
#include "jerryscript-port-default.h"
@@ -54,9 +51,7 @@ static double FileTimeToUnixTimeMs (FILETIME ft)
#endif /* _WIN32 */
/**
- * Default implementation of jerry_port_get_local_time_zone_adjustment. Uses the 'tm_gmtoff' field
- * of 'struct tm' (a GNU extension) filled by 'localtime_r' if available on the
- * system, does nothing otherwise.
+ * Default implementation of jerry_port_get_local_time_zone_adjustment.
*
* @return offset between UTC and local time at the given unix timestamp, if
* available. Otherwise, returns 0, assuming UTC time.
@@ -64,19 +59,6 @@ static double FileTimeToUnixTimeMs (FILETIME ft)
double jerry_port_get_local_time_zone_adjustment (double unix_ms, /**< ms since unix epoch */
bool is_utc) /**< is the time above in UTC? */
{
-#ifdef 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;
-#else /* !HAVE_TM_GMTOFF */
- (void) unix_ms;
- (void) is_utc;
#ifdef _WIN32
FILETIME fileTime, localFileTime;
SYSTEMTIME systemTime, localSystemTime;
@@ -94,9 +76,39 @@ double jerry_port_get_local_time_zone_adjustment (double unix_ms, /**< ms since
localTime.HighPart = localFileTime.dwHighDateTime;
return (double) (((LONGLONG) localTime.QuadPart - (LONGLONG) time.QuadPart) / TicksPerMs);
}
-#endif /* _WIN32 */
+#elif defined (__GNUC__) || defined (__clang__)
+ time_t now_time = (time_t) (unix_ms / 1000);
+ double tza_s = 0.0;
+
+ while (true)
+ {
+ struct tm now_tm;
+ if (!gmtime_r (&now_time, &now_tm))
+ {
+ break;
+ }
+ now_tm.tm_isdst = -1; /* if not overridden, DST will not be taken into account */
+ time_t local_time = mktime (&now_tm);
+ if (local_time == (time_t) -1)
+ {
+ break;
+ }
+ tza_s = difftime (now_time, local_time);
+
+ if (is_utc)
+ {
+ break;
+ }
+ now_time -= (time_t) tza_s;
+ is_utc = true;
+ }
+
+ return tza_s * 1000;
+#else /* !_WIN32 && !__GNUC__ && !__clang__ */
+ (void) unix_ms; /* unused */
+ (void) is_utc; /* unused */
return 0.0;
-#endif /* HAVE_TM_GMTOFF */
+#endif /* _WIN32 */
} /* jerry_port_get_local_time_zone_adjustment */
/**
@@ -113,14 +125,15 @@ double jerry_port_get_current_time (void)
FILETIME ft;
GetSystemTimeAsFileTime (&ft);
return FileTimeToUnixTimeMs (ft);
-#elif __GNUC__
+#elif defined (__GNUC__) || defined (__clang__)
struct timeval tv;
if (gettimeofday (&tv, NULL) == 0)
{
return ((double) tv.tv_sec) * 1000.0 + ((double) tv.tv_usec) / 1000.0;
}
-#endif /* _WIN32 */
-
return 0.0;
+#else /* !_WIN32 && !__GNUC__ && !__clang__ */
+ return 0.0;
+#endif /* _WIN32 */
} /* jerry_port_get_current_time */
diff --git a/jerry-port/default/default-debugger.c b/jerry-port/default/default-debugger.c
index b5f55c69..7131e426 100644
--- a/jerry-port/default/default-debugger.c
+++ b/jerry-port/default/default-debugger.c
@@ -21,9 +21,7 @@
#ifdef _WIN32
#include <windows.h>
-#elif defined (HAVE_TIME_H)
-#include <time.h>
-#elif defined (HAVE_UNISTD_H)
+#else /* !_WIN32 */
#include <unistd.h>
#endif /* _WIN32 */
@@ -31,22 +29,14 @@
#include "jerryscript-port-default.h"
/**
- * Default implementation of jerry_port_sleep. Uses 'nanosleep' or 'usleep' if
- * available on the system, does nothing otherwise.
+ * Default implementation of jerry_port_sleep. Uses 'usleep' if available on the
+ * system, does nothing otherwise.
*/
void jerry_port_sleep (uint32_t sleep_time) /**< milliseconds to sleep */
{
#ifdef _WIN32
Sleep (sleep_time);
-#elif defined (HAVE_TIME_H)
- struct timespec sleep_timespec;
- sleep_timespec.tv_sec = (time_t) sleep_time / 1000;
- sleep_timespec.tv_nsec = ((long int) sleep_time % 1000) * 1000000L;
-
- nanosleep (&sleep_timespec, NULL);
-#elif defined (HAVE_UNISTD_H)
+#else /* !_WIN32 */
usleep ((useconds_t) sleep_time * 1000);
-#else
- (void) sleep_time;
-#endif /* HAVE_TIME_H */
+#endif /* _WIN32 */
} /* jerry_port_sleep */