Commit 15b35f4d authored by Daniel Lehman's avatar Daniel Lehman Committed by Alexandre Julliard

msvcrt: Return wall-clock time from clock().

parent f65f951c
...@@ -852,6 +852,22 @@ static void test__tzset(void) ...@@ -852,6 +852,22 @@ static void test__tzset(void)
_putenv(TZ_env); _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) START_TEST(time)
{ {
init(); init();
...@@ -870,4 +886,5 @@ START_TEST(time) ...@@ -870,4 +886,5 @@ START_TEST(time)
test_localtime64_s(); test_localtime64_s();
test_daylight(); test_daylight();
test_asctime(); test_asctime();
test_clock();
} }
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include "mtdll.h" #include "mtdll.h"
#include "winbase.h" #include "winbase.h"
#include "winnls.h" #include "winnls.h"
#include "winternl.h"
#include "wine/debug.h" #include "wine/debug.h"
#include "wine/unicode.h" #include "wine/unicode.h"
...@@ -709,19 +710,23 @@ int CDECL _wstrtime_s(MSVCRT_wchar_t* time, MSVCRT_size_t size) ...@@ -709,19 +710,23 @@ int CDECL _wstrtime_s(MSVCRT_wchar_t* time, MSVCRT_size_t size)
*/ */
MSVCRT_clock_t CDECL MSVCRT_clock(void) MSVCRT_clock_t CDECL MSVCRT_clock(void)
{ {
FILETIME ftc, fte, ftk, ftu; static LONGLONG start_time;
ULONGLONG utime, ktime; LARGE_INTEGER systime;
MSVCRT_clock_t clock;
GetProcessTimes(GetCurrentProcess(), &ftc, &fte, &ftk, &ftu); if(!start_time) {
KERNEL_USER_TIMES pti;
ktime = ((ULONGLONG)ftk.dwHighDateTime << 32) | ftk.dwLowDateTime; /* while Linux's clock returns user time, Windows' clock
utime = ((ULONGLONG)ftu.dwHighDateTime << 32) | ftu.dwLowDateTime; * returns wall-clock time from process start. cache the
* process start time since it won't change and to avoid
clock = (utime + ktime) / (TICKSPERSEC / MSVCRT_CLOCKS_PER_SEC); * 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;
} }
/********************************************************************* /*********************************************************************
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment