#include "quartz_private.h"
#include "wine/debug.h"
#include <assert.h>
Go to the source code of this file.
|
| | WINE_DEFAULT_DEBUG_CHANNEL (quartz) |
| |
| static REFERENCE_TIME | get_current_time (void) |
| |
| static struct system_clock * | impl_from_IUnknown (IUnknown *iface) |
| |
| static HRESULT WINAPI | system_clock_inner_QueryInterface (IUnknown *iface, REFIID iid, void **out) |
| |
| static ULONG WINAPI | system_clock_inner_AddRef (IUnknown *iface) |
| |
| static ULONG WINAPI | system_clock_inner_Release (IUnknown *iface) |
| |
| static struct system_clock * | impl_from_IReferenceClock (IReferenceClock *iface) |
| |
| static DWORD WINAPI | SystemClockAdviseThread (void *param) |
| |
| static HRESULT | add_sink (struct system_clock *clock, DWORD_PTR handle, REFERENCE_TIME due_time, REFERENCE_TIME period, DWORD_PTR *cookie) |
| |
| static HRESULT WINAPI | SystemClockImpl_QueryInterface (IReferenceClock *iface, REFIID iid, void **out) |
| |
| static ULONG WINAPI | SystemClockImpl_AddRef (IReferenceClock *iface) |
| |
| static ULONG WINAPI | SystemClockImpl_Release (IReferenceClock *iface) |
| |
| static HRESULT WINAPI | SystemClockImpl_GetTime (IReferenceClock *iface, REFERENCE_TIME *time) |
| |
| static HRESULT WINAPI | SystemClockImpl_AdviseTime (IReferenceClock *iface, REFERENCE_TIME base, REFERENCE_TIME offset, HEVENT event, DWORD_PTR *cookie) |
| |
| static HRESULT WINAPI | SystemClockImpl_AdvisePeriodic (IReferenceClock *iface, REFERENCE_TIME start, REFERENCE_TIME period, HSEMAPHORE semaphore, DWORD_PTR *cookie) |
| |
| static HRESULT WINAPI | SystemClockImpl_Unadvise (IReferenceClock *iface, DWORD_PTR cookie) |
| |
| HRESULT | system_clock_create (IUnknown *outer, IUnknown **out) |
| |
◆ add_sink()
Definition at line 189 of file systemclock.c.
191{
193
196
199
200 if (!(
sink = heap_alloc_zero(
sizeof(*
sink))))
202
208
212
214 {
216 }
218
220}
#define InterlockedIncrement
static void list_add_tail(struct list_entry *head, struct list_entry *entry)
static DWORD WINAPI SystemClockAdviseThread(void *param)
static LONG cookie_counter
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
VOID WINAPI WakeConditionVariable(PCONDITION_VARIABLE ConditionVariable)
_ACRTIMP clock_t __cdecl clock(void)
GLsizei GLenum GLboolean sink
#define InterlockedCompareExchange
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
Referenced by SystemClockImpl_AdvisePeriodic(), and SystemClockImpl_AdviseTime().
◆ get_current_time()
◆ impl_from_IReferenceClock()
◆ impl_from_IUnknown()
◆ system_clock_create()
Definition at line 327 of file systemclock.c.
328{
330
332
333 if (!(object = heap_alloc_zero(sizeof(*object))))
334 {
337 }
338
341 object->outer_unk =
outer ?
outer : &
object->IUnknown_inner;
342 object->refcount = 1;
345 object->cs.DebugInfo->Spare[0] = (
DWORD_PTR)(__FILE__
": SystemClockImpl.cs");
346
347 TRACE(
"Created system clock %p.\n",
object);
348 *
out = &
object->IUnknown_inner;
349
351}
static void list_init(struct list_entry *head)
static const IUnknownVtbl system_clock_inner_vtbl
static const IReferenceClockVtbl SystemClock_vtbl
BOOL WINAPI InitializeCriticalSectionEx(OUT LPCRITICAL_SECTION lpCriticalSection, IN DWORD dwSpinCount, IN DWORD flags)
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
#define RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO
Referenced by dsound_render_create().
◆ system_clock_inner_AddRef()
Definition at line 85 of file systemclock.c.
86{
89
91
93}
static struct system_clock * impl_from_IUnknown(IUnknown *iface)
◆ system_clock_inner_QueryInterface()
Definition at line 65 of file systemclock.c.
66{
69
73 *
out = &
clock->IReferenceClock_iface;
74 else
75 {
79 }
80
83}
#define IsEqualGUID(rguid1, rguid2)
◆ system_clock_inner_Release()
Definition at line 95 of file systemclock.c.
96{
100
101 TRACE(
"%p decreasing refcount to %lu.\n",
clock, refcount);
102
103 if (!refcount)
104 {
106 {
113 }
114
116 {
119 }
120
121 clock->cs.DebugInfo->Spare[0] = 0;
124 }
125 return refcount;
126}
static BOOL heap_free(void *mem)
#define InterlockedDecrement
static void list_remove(struct list_entry *entry)
#define LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, list, type, field)
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
◆ SystemClockAdviseThread()
Definition at line 140 of file systemclock.c.
141{
145
146 TRACE(
"Starting advise thread for clock %p.\n",
clock);
148
149 for (;;)
150 {
152
154
156
158 {
159 if (
sink->due_time <= current_time)
160 {
162 {
163 DWORD periods = ((current_time -
sink->due_time) /
sink->period) + 1;
165 sink->due_time += periods *
sink->period;
166 }
167 else
168 {
172 continue;
173 }
174 }
175
177 }
178
180 if (
clock->thread_stopped)
181 {
183 return 0;
184 }
186 }
187}
HRESULT WINAPI DECLSPEC_HOTPATCH SetThreadDescription(_In_ HANDLE hThread, _In_ PCWSTR lpThreadDescription)
static REFERENCE_TIME get_current_time(void)
BOOL WINAPI SleepConditionVariableCS(PCONDITION_VARIABLE ConditionVariable, PCRITICAL_SECTION CriticalSection, DWORD Timeout)
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
BOOL WINAPI DECLSPEC_HOTPATCH ReleaseSemaphore(IN HANDLE hSemaphore, IN LONG lReleaseCount, IN LPLONG lpPreviousCount)
HANDLE WINAPI GetCurrentThread(void)
Referenced by add_sink().
◆ SystemClockImpl_AddRef()
Definition at line 228 of file systemclock.c.
229{
231 return IUnknown_AddRef(
clock->outer_unk);
232}
static struct system_clock * impl_from_IReferenceClock(IReferenceClock *iface)
◆ SystemClockImpl_AdvisePeriodic()
Definition at line 277 of file systemclock.c.
279{
281
282 TRACE(
"clock %p, start %s, period %s, semaphore %#Ix, cookie %p.\n",
284
285 if (
start <= 0 || period <= 0)
287
289}
static HRESULT add_sink(struct system_clock *clock, DWORD_PTR handle, REFERENCE_TIME due_time, REFERENCE_TIME period, DWORD_PTR *cookie)
static const char * debugstr_time(REFERENCE_TIME time)
◆ SystemClockImpl_AdviseTime()
Definition at line 263 of file systemclock.c.
265{
267
268 TRACE(
"clock %p, base %s, offset %s, event %#Ix, cookie %p.\n",
270
273
275}
◆ SystemClockImpl_GetTime()
Definition at line 240 of file systemclock.c.
241{
245
248 }
249
251
253
256
258
261}
◆ SystemClockImpl_QueryInterface()
◆ SystemClockImpl_Release()
◆ SystemClockImpl_Unadvise()
Definition at line 291 of file systemclock.c.
292{
295
297
299
301 {
303 {
308 }
309 }
310
312
314}
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
◆ WINE_DEFAULT_DEBUG_CHANNEL()
| WINE_DEFAULT_DEBUG_CHANNEL |
( |
quartz |
| ) |
|
◆ cookie_counter
◆ system_clock_inner_vtbl
| const IUnknownVtbl system_clock_inner_vtbl |
|
static |
Initial value:=
{
}
static ULONG WINAPI system_clock_inner_AddRef(IUnknown *iface)
static HRESULT WINAPI system_clock_inner_QueryInterface(IUnknown *iface, REFIID iid, void **out)
static ULONG WINAPI system_clock_inner_Release(IUnknown *iface)
Definition at line 128 of file systemclock.c.
Referenced by system_clock_create().
◆ SystemClock_vtbl
| const IReferenceClockVtbl SystemClock_vtbl |
|
static |
Initial value:=
{
}
static HRESULT WINAPI SystemClockImpl_AdvisePeriodic(IReferenceClock *iface, REFERENCE_TIME start, REFERENCE_TIME period, HSEMAPHORE semaphore, DWORD_PTR *cookie)
static ULONG WINAPI SystemClockImpl_AddRef(IReferenceClock *iface)
static HRESULT WINAPI SystemClockImpl_AdviseTime(IReferenceClock *iface, REFERENCE_TIME base, REFERENCE_TIME offset, HEVENT event, DWORD_PTR *cookie)
static HRESULT WINAPI SystemClockImpl_Unadvise(IReferenceClock *iface, DWORD_PTR cookie)
static HRESULT WINAPI SystemClockImpl_GetTime(IReferenceClock *iface, REFERENCE_TIME *time)
static ULONG WINAPI SystemClockImpl_Release(IReferenceClock *iface)
static HRESULT WINAPI SystemClockImpl_QueryInterface(IReferenceClock *iface, REFIID iid, void **out)
Definition at line 316 of file systemclock.c.
Referenced by system_clock_create().