winmm: Use criticalsection for determining wether timer is synchronously killable.
This commit is contained in:
parent
db07476c11
commit
e2a1bc9804
|
@ -44,8 +44,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(mmtime);
|
||||||
|
|
||||||
static HANDLE TIME_hMMTimer;
|
static HANDLE TIME_hMMTimer;
|
||||||
static LPWINE_TIMERENTRY TIME_TimersList;
|
static LPWINE_TIMERENTRY TIME_TimersList;
|
||||||
static HANDLE TIME_hKillEvent;
|
|
||||||
static HANDLE TIME_hWakeEvent;
|
static HANDLE TIME_hWakeEvent;
|
||||||
|
static CRITICAL_SECTION TIME_cbcrst;
|
||||||
static BOOL TIME_TimeToDie = TRUE;
|
static BOOL TIME_TimeToDie = TRUE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -200,11 +200,11 @@ static LPWINE_TIMERENTRY lpTimers;
|
||||||
|
|
||||||
ptimer = next_ptimer;
|
ptimer = next_ptimer;
|
||||||
}
|
}
|
||||||
if (TIME_hKillEvent) ResetEvent(TIME_hKillEvent);
|
|
||||||
LeaveCriticalSection(&iData->cs);
|
LeaveCriticalSection(&iData->cs);
|
||||||
|
|
||||||
|
EnterCriticalSection(&TIME_cbcrst);
|
||||||
while (idx > 0) TIME_TriggerCallBack(&lpTimers[--idx]);
|
while (idx > 0) TIME_TriggerCallBack(&lpTimers[--idx]);
|
||||||
if (TIME_hKillEvent) SetEvent(TIME_hKillEvent);
|
LeaveCriticalSection(&TIME_cbcrst);
|
||||||
|
|
||||||
/* Finally, adjust the recommended wait time downward
|
/* Finally, adjust the recommended wait time downward
|
||||||
by the amount of time the processing routines
|
by the amount of time the processing routines
|
||||||
|
@ -266,6 +266,8 @@ void TIME_MMTimeStart(void)
|
||||||
TIME_TimeToDie = FALSE;
|
TIME_TimeToDie = FALSE;
|
||||||
TIME_hMMTimer = CreateThread(NULL, 0, TIME_MMSysTimeThread, &WINMM_IData, 0, NULL);
|
TIME_hMMTimer = CreateThread(NULL, 0, TIME_MMSysTimeThread, &WINMM_IData, 0, NULL);
|
||||||
SetThreadPriority(TIME_hMMTimer, THREAD_PRIORITY_TIME_CRITICAL);
|
SetThreadPriority(TIME_hMMTimer, THREAD_PRIORITY_TIME_CRITICAL);
|
||||||
|
InitializeCriticalSection(&TIME_cbcrst);
|
||||||
|
TIME_cbcrst.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": WINMM.TIME_cbcrst");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -285,6 +287,8 @@ void TIME_MMTimeStop(void)
|
||||||
CloseHandle(TIME_hMMTimer);
|
CloseHandle(TIME_hMMTimer);
|
||||||
CloseHandle(TIME_hWakeEvent);
|
CloseHandle(TIME_hWakeEvent);
|
||||||
TIME_hMMTimer = 0;
|
TIME_hMMTimer = 0;
|
||||||
|
TIME_cbcrst.DebugInfo->Spare[0] = 0;
|
||||||
|
DeleteCriticalSection(&TIME_cbcrst);
|
||||||
TIME_TimersList = NULL;
|
TIME_TimersList = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -337,9 +341,6 @@ WORD TIME_SetEventInternal(UINT wDelay, UINT wResol,
|
||||||
|
|
||||||
EnterCriticalSection(&WINMM_IData.cs);
|
EnterCriticalSection(&WINMM_IData.cs);
|
||||||
|
|
||||||
if ((wFlags & TIME_KILL_SYNCHRONOUS) && !TIME_hKillEvent)
|
|
||||||
TIME_hKillEvent = CreateEventW(NULL, TRUE, TRUE, NULL);
|
|
||||||
|
|
||||||
for (lpTimer = TIME_TimersList; lpTimer != NULL; lpTimer = lpTimer->lpNext) {
|
for (lpTimer = TIME_TimersList; lpTimer != NULL; lpTimer = lpTimer->lpNext) {
|
||||||
wNewID = max(wNewID, lpTimer->wTimerID);
|
wNewID = max(wNewID, lpTimer->wTimerID);
|
||||||
}
|
}
|
||||||
|
@ -397,8 +398,10 @@ MMRESULT WINAPI timeKillEvent(UINT wID)
|
||||||
return MMSYSERR_INVALPARAM;
|
return MMSYSERR_INVALPARAM;
|
||||||
}
|
}
|
||||||
if (lpSelf->wFlags & TIME_KILL_SYNCHRONOUS)
|
if (lpSelf->wFlags & TIME_KILL_SYNCHRONOUS)
|
||||||
WaitForSingleObject(TIME_hKillEvent, INFINITE);
|
EnterCriticalSection(&TIME_cbcrst);
|
||||||
HeapFree(GetProcessHeap(), 0, lpSelf);
|
HeapFree(GetProcessHeap(), 0, lpSelf);
|
||||||
|
if (lpSelf->wFlags & TIME_KILL_SYNCHRONOUS)
|
||||||
|
LeaveCriticalSection(&TIME_cbcrst);
|
||||||
return TIMERR_NOERROR;
|
return TIMERR_NOERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue