mirror of
https://github.com/reactos/wine.git
synced 2025-02-16 10:59:45 +00:00
msvcrt: Return wall-clock time from clock().
This commit is contained in:
parent
f65f951cba
commit
15b35f4d37
@ -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;
|
||||
/* 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;
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
|
Loading…
x
Reference in New Issue
Block a user