From: Christopher Dykes Date: Tue, 1 Mar 2016 18:01:25 +0000 (-0800) Subject: Listen to the Windows docs in portability/SysTime.cpp X-Git-Tag: deprecate-dynamic-initializer~26 X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=ad1f7851de7ded56aad94871442a8704b76af94c;p=folly.git Listen to the Windows docs in portability/SysTime.cpp Summary:As-per the documenation of FILETIME: "Do not cast a pointer to a FILETIME structure to either a ULARGE_INTEGER* or __int64* value because it can cause alignment faults on 64-bit Windows." Reviewed By: yfeldblum Differential Revision: D2989434 fb-gh-sync-id: cf57d569a785e0eb7225b346730bf2ed4c50dc55 shipit-source-id: cf57d569a785e0eb7225b346730bf2ed4c50dc55 --- diff --git a/folly/portability/SysTime.cpp b/folly/portability/SysTime.cpp index 9969a171..41638e97 100755 --- a/folly/portability/SysTime.cpp +++ b/folly/portability/SysTime.cpp @@ -26,8 +26,13 @@ int gettimeofday(timeval* tv, timezone*) { if (tv) { FILETIME ft; + ULARGE_INTEGER lft; GetSystemTimeAsFileTime(&ft); - uint64_t ns = *(uint64_t*)&ft; + // As per the docs of FILETIME, don't just do an indirect + // pointer cast, to avoid alignment faults. + lft.HighPart = ft.dwHighDateTime; + lft.LowPart = ft.dwLowDateTime; + uint64_t ns = lft.QuadPart; tv->tv_usec = (long)((ns / 10ULL) % 1000000ULL); tv->tv_sec = (long)((ns - posixWinFtOffset) / 10000000ULL); }