Module: wine Branch: master Commit: 15b35f4d37e4bdd8d2b44b772e800a8ffade7ab6 URL: http://source.winehq.org/git/wine.git/?a=commit;h=15b35f4d37e4bdd8d2b44b772e...
Author: Daniel Lehman dlehman@esri.com Date: Wed Jul 27 16:42:53 2011 -0700
msvcrt: Return wall-clock time from clock().
---
dlls/msvcrt/tests/time.c | 17 +++++++++++++++++ dlls/msvcrt/time.c | 25 +++++++++++++++---------- 2 files changed, 32 insertions(+), 10 deletions(-)
diff --git a/dlls/msvcrt/tests/time.c b/dlls/msvcrt/tests/time.c index a3e5c07..71e58ba 100644 --- a/dlls/msvcrt/tests/time.c +++ b/dlls/msvcrt/tests/time.c @@ -852,6 +852,22 @@ static void test__tzset(void) _putenv(TZ_env); }
+static void test_clock(void) +{ + static const int THRESH = 50; + clock_t s, e; + int i; + + for (i = 0; i < 10; i++) + { + s = clock(); + Sleep(1000); + e = clock(); + + ok(abs((e-s) - 1000) < THRESH, "clock off on loop %i: %i\n", i, e-s); + } +} + START_TEST(time) { init(); @@ -870,4 +886,5 @@ START_TEST(time) test_localtime64_s(); test_daylight(); test_asctime(); + test_clock(); } diff --git a/dlls/msvcrt/time.c b/dlls/msvcrt/time.c index e227b84..2b5fe8d 100644 --- a/dlls/msvcrt/time.c +++ b/dlls/msvcrt/time.c @@ -30,6 +30,7 @@ #include "mtdll.h" #include "winbase.h" #include "winnls.h" +#include "winternl.h" #include "wine/debug.h" #include "wine/unicode.h"
@@ -709,19 +710,23 @@ int CDECL _wstrtime_s(MSVCRT_wchar_t* time, MSVCRT_size_t size) */ MSVCRT_clock_t CDECL MSVCRT_clock(void) { - FILETIME ftc, fte, ftk, ftu; - ULONGLONG utime, ktime; - - MSVCRT_clock_t clock; + static LONGLONG start_time; + LARGE_INTEGER systime;
- GetProcessTimes(GetCurrentProcess(), &ftc, &fte, &ftk, &ftu); + if(!start_time) { + KERNEL_USER_TIMES pti;
- ktime = ((ULONGLONG)ftk.dwHighDateTime << 32) | ftk.dwLowDateTime; - utime = ((ULONGLONG)ftu.dwHighDateTime << 32) | ftu.dwLowDateTime; - - clock = (utime + ktime) / (TICKSPERSEC / MSVCRT_CLOCKS_PER_SEC); + /* while Linux's clock returns user time, Windows' clock + * returns wall-clock time from process start. cache the + * process start time since it won't change and to avoid + * wineserver round-trip overhead */ + if(NtQueryInformationProcess(GetCurrentProcess(), ProcessTimes, &pti, sizeof(pti), NULL)) + return -1; + start_time = pti.CreateTime.QuadPart; + }
- return clock; + NtQuerySystemTime(&systime); + return (systime.QuadPart - start_time) * MSVCRT_CLOCKS_PER_SEC / TICKSPERSEC; }
/*********************************************************************