Module: wine Branch: master Commit: bf5b35f19b841e6352c32ca7c6671d9172636871 URL: https://source.winehq.org/git/wine.git/?a=commit;h=bf5b35f19b841e6352c32ca7c...
Author: Zebediah Figura zfigura@codeweavers.com Date: Thu Oct 21 12:41:11 2021 -0500
quartz: Use the performance counter for the system clock.
Native probably uses timeGetTime() as a source. That doesn't actually match the performance counter on Windows, but it does on Wine, and accessing the counter directly is slightly more efficient anyway.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51684 Signed-off-by: Zebediah Figura zfigura@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/quartz/systemclock.c | 14 ++++++++++++-- dlls/quartz/tests/Makefile.in | 2 +- dlls/quartz/tests/systemclock.c | 9 +-------- 3 files changed, 14 insertions(+), 11 deletions(-)
diff --git a/dlls/quartz/systemclock.c b/dlls/quartz/systemclock.c index cebe4846f04..56ad217c76a 100644 --- a/dlls/quartz/systemclock.c +++ b/dlls/quartz/systemclock.c @@ -44,6 +44,7 @@ struct system_clock
BOOL thread_created, thread_stopped; HANDLE thread; + LARGE_INTEGER frequency; REFERENCE_TIME last_time; CRITICAL_SECTION cs; CONDITION_VARIABLE cv; @@ -51,6 +52,14 @@ struct system_clock struct list sinks; };
+static REFERENCE_TIME get_current_time(const struct system_clock *clock) +{ + LARGE_INTEGER time; + + QueryPerformanceCounter(&time); + return (time.QuadPart * 1000) / clock->frequency.QuadPart * 10000; +} + static inline struct system_clock *impl_from_IUnknown(IUnknown *iface) { return CONTAINING_RECORD(iface, struct system_clock, IUnknown_inner); @@ -145,7 +154,7 @@ static DWORD WINAPI SystemClockAdviseThread(void *param)
EnterCriticalSection(&clock->cs);
- current_time = GetTickCount64() * 10000; + current_time = get_current_time(clock);
LIST_FOR_EACH_ENTRY_SAFE(sink, cursor, &clock->sinks, struct advise_sink, entry) { @@ -240,7 +249,7 @@ static HRESULT WINAPI SystemClockImpl_GetTime(IReferenceClock *iface, REFERENCE_ return E_POINTER; }
- ret = GetTickCount64() * 10000; + ret = get_current_time(clock);
EnterCriticalSection(&clock->cs);
@@ -336,6 +345,7 @@ HRESULT system_clock_create(IUnknown *outer, IUnknown **out) list_init(&object->sinks); InitializeCriticalSection(&object->cs); object->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": SystemClockImpl.cs"); + QueryPerformanceFrequency(&object->frequency);
TRACE("Created system clock %p.\n", object); *out = &object->IUnknown_inner; diff --git a/dlls/quartz/tests/Makefile.in b/dlls/quartz/tests/Makefile.in index b4a372d4d3e..423abc78ef6 100644 --- a/dlls/quartz/tests/Makefile.in +++ b/dlls/quartz/tests/Makefile.in @@ -1,5 +1,5 @@ TESTDLL = quartz.dll -IMPORTS = strmbase advapi32 d3d9 dsound msdmo msvfw32 ole32 oleaut32 user32 uuid +IMPORTS = strmbase advapi32 d3d9 dsound msdmo msvfw32 ole32 oleaut32 user32 uuid winmm
C_SRCS = \ acmwrapper.c \ diff --git a/dlls/quartz/tests/systemclock.c b/dlls/quartz/tests/systemclock.c index be5472ed6e1..3b39d2aadb4 100644 --- a/dlls/quartz/tests/systemclock.c +++ b/dlls/quartz/tests/systemclock.c @@ -22,8 +22,6 @@ #include "dshow.h" #include "wine/test.h"
-static ULONGLONG (WINAPI *pGetTickCount64)(void); - static IReferenceClock *create_system_clock(void) { IReferenceClock *clock = NULL; @@ -178,10 +176,7 @@ static void test_get_time(void) ok(time1 % 10000 == 0, "Expected no less than 1ms coarseness, but got time %s.\n", wine_dbgstr_longlong(time1));
- if (pGetTickCount64) - ticks = pGetTickCount64() * 10000; - else - ticks = (REFERENCE_TIME)GetTickCount() * 10000; + ticks = (REFERENCE_TIME)timeGetTime() * 10000;
hr = IReferenceClock_GetTime(clock, &time2); ok(hr == (time2 == time1 ? S_FALSE : S_OK), "Got hr %#x.\n", hr); @@ -291,8 +286,6 @@ START_TEST(systemclock) { CoInitialize(NULL);
- pGetTickCount64 = (void *)GetProcAddress(GetModuleHandleA("kernel32.dll"), "GetTickCount64"); - test_interfaces(); test_aggregation(); test_get_time();