diff options
author | Anatol Belski <ab@php.net> | 2013-03-23 17:48:05 +0100 |
---|---|---|
committer | Anatol Belski <ab@php.net> | 2013-03-23 17:48:05 +0100 |
commit | 2e00f7611c29713b7b53ee9006892fc9576fb788 (patch) | |
tree | 8127adac64b30c3c9027335011d235ef6a411005 /win32 | |
parent | defb08c705ac40ed9c77a57c98ebe2d856a45e07 (diff) | |
parent | 3654ff73660a6b8fbf2a696effe844bb9485ff17 (diff) | |
download | php-git-2e00f7611c29713b7b53ee9006892fc9576fb788.tar.gz |
Merge branch 'PHP-5.4' into PHP-5.5
* PHP-5.4:
Fixed possible precision loss in microtime
Diffstat (limited to 'win32')
-rw-r--r-- | win32/time.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/win32/time.c b/win32/time.c index 77e4504cd1..75539748e8 100644 --- a/win32/time.c +++ b/win32/time.c @@ -50,6 +50,7 @@ int getfilesystemtime(struct timeval *tv) FILETIME ft; unsigned __int64 ff = 0; MyGetSystemTimeAsFileTime timefunc; + ULARGE_INTEGER fft; timefunc = get_time_func(); if (timefunc) { @@ -58,14 +59,20 @@ int getfilesystemtime(struct timeval *tv) GetSystemTimeAsFileTime(&ft); } - ff |= ft.dwHighDateTime; - ff <<= 32; - ff |= ft.dwLowDateTime; - ff /= 10; /* convert to microseconds */ + /* + * 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. + * via http://technet.microsoft.com/en-us/library/ms724284(v=vs.85).aspx + */ + fft.HighPart = ft.dwHighDateTime; + fft.LowPart = ft.dwLowDateTime; + ff = fft.QuadPart; + + ff /= 10Ui64; /* convert to microseconds */ ff -= 11644473600000000Ui64; /* convert to unix epoch */ - tv->tv_sec = (long)(ff / 1000000UL); - tv->tv_usec = (long)(ff % 1000000UL); + tv->tv_sec = (long)(ff / 1000000Ui64); + tv->tv_usec = (long)(ff % 1000000Ui64); return 0; } |