Re: msvcrt: return wall-clock time from clock()
Daniel Lehman <dlehman(a)esri.com> writes:
@@ -709,19 +711,26 @@ 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; + LONGLONG current_time; + struct timeval now;
- 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); + gettimeofday(&now, NULL); + current_time = (LONGLONG)now.tv_sec * TICKSPERSEC + now.tv_usec * 10 + TICKS_1601_TO_1970;
You should be using Windows APIs for this, not gettimeofday. -- Alexandre Julliard julliard(a)winehq.org
participants (1)
-
Alexandre Julliard