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