Daniel Lehman : msvcrt: Return wall-clock time from clock().
Alexandre Julliard
julliard at winehq.org
Mon Nov 25 13:33:16 CST 2013
Module: wine
Branch: master
Commit: 15b35f4d37e4bdd8d2b44b772e800a8ffade7ab6
URL: http://source.winehq.org/git/wine.git/?a=commit;h=15b35f4d37e4bdd8d2b44b772e800a8ffade7ab6
Author: Daniel Lehman <dlehman at 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;
}
/*********************************************************************
More information about the wine-cvs
mailing list