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

This commit is contained in:
Daniel Lehman 2011-07-27 16:42:53 -07:00 committed by Alexandre Julliard
parent f65f951cba
commit 15b35f4d37
2 changed files with 32 additions and 10 deletions

View File

@ -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();
}

View File

@ -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;
/* 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;
}
clock = (utime + ktime) / (TICKSPERSEC / MSVCRT_CLOCKS_PER_SEC);
return clock;
NtQuerySystemTime(&systime);
return (systime.QuadPart - start_time) * MSVCRT_CLOCKS_PER_SEC / TICKSPERSEC;
}
/*********************************************************************