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)
_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();
}
......@@ -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;
}
/*********************************************************************
......
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