diff --git a/dlls/winmm/time.c b/dlls/winmm/time.c index 211ca502e88..790e2a21d4a 100644 --- a/dlls/winmm/time.c +++ b/dlls/winmm/time.c @@ -45,11 +45,13 @@ #include "winemm.h" +#include "wine/list.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(mmtime); typedef struct tagWINE_TIMERENTRY { + struct list entry; UINT wDelay; UINT wResol; LPTIMECALLBACK lpFunc; /* can be lots of things */ @@ -57,12 +59,11 @@ typedef struct tagWINE_TIMERENTRY { UINT16 wFlags; UINT16 wTimerID; DWORD dwTriggerTime; - struct tagWINE_TIMERENTRY* lpNext; } WINE_TIMERENTRY, *LPWINE_TIMERENTRY; +static struct list timer_list = LIST_INIT(timer_list); static HANDLE TIME_hMMTimer; -static LPWINE_TIMERENTRY TIME_TimersList; static CRITICAL_SECTION TIME_cbcrst; static BOOL TIME_TimeToDie = TRUE; static int TIME_fdWake[2] = { -1, -1 }; @@ -137,7 +138,7 @@ static int TIME_MMSysTimeCallback(void) static int nSizeLpTimers; static LPWINE_TIMERENTRY lpTimers; - LPWINE_TIMERENTRY timer, *ptimer, *next_ptimer; + WINE_TIMERENTRY *timer, *next; int idx; DWORD cur_time; int delta_time, ret_time = -1; @@ -160,9 +161,8 @@ static LPWINE_TIMERENTRY lpTimers; cur_time = GetTickCount(); EnterCriticalSection(&WINMM_cs); - for (ptimer = &TIME_TimersList; *ptimer != NULL; ) { - timer = *ptimer; - next_ptimer = &timer->lpNext; + LIST_FOR_EACH_ENTRY_SAFE( timer, next, &timer_list, WINE_TIMERENTRY, entry ) + { delta_time = timer->dwTriggerTime - cur_time; if (delta_time <= 0) { @@ -188,8 +188,7 @@ static LPWINE_TIMERENTRY lpTimers; /* TIME_ONESHOT is defined as 0 */ if (!(timer->wFlags & TIME_PERIODIC)) { - /* unlink timer from timers list */ - *ptimer = *next_ptimer; + list_remove( &timer->entry ); HeapFree(GetProcessHeap(), 0, timer); /* We don't need to trigger oneshots again */ @@ -209,8 +208,6 @@ static LPWINE_TIMERENTRY lpTimers; { if (ret_time == -1 || ret_time > delta_time) ret_time = delta_time; } - - ptimer = next_ptimer; } LeaveCriticalSection(&WINMM_cs); @@ -277,10 +274,9 @@ static DWORD CALLBACK TIME_MMSysTimeThread(LPVOID arg) /************************************************************************** * TIME_MMTimeStart */ -void TIME_MMTimeStart(void) +static void TIME_MMTimeStart(void) { if (!TIME_hMMTimer) { - TIME_TimersList = NULL; if (pipe(TIME_fdWake) < 0) { TIME_fdWake[0] = TIME_fdWake[1] = -1; @@ -316,7 +312,6 @@ void TIME_MMTimeStop(void) TIME_hMMTimer = 0; TIME_cbcrst.DebugInfo->Spare[0] = 0; DeleteCriticalSection(&TIME_cbcrst); - TIME_TimersList = NULL; } } @@ -369,12 +364,10 @@ WORD TIME_SetEventInternal(UINT wDelay, UINT wResol, EnterCriticalSection(&WINMM_cs); - for (lpTimer = TIME_TimersList; lpTimer != NULL; lpTimer = lpTimer->lpNext) { - wNewID = max(wNewID, lpTimer->wTimerID); - } + LIST_FOR_EACH_ENTRY( lpTimer, &timer_list, WINE_TIMERENTRY, entry ) + wNewID = max(wNewID, lpTimer->wTimerID); - lpNewTimer->lpNext = TIME_TimersList; - TIME_TimersList = lpNewTimer; + list_add_head( &timer_list, &lpNewTimer->entry ); lpNewTimer->wTimerID = wNewID + 1; LeaveCriticalSection(&WINMM_cs); @@ -405,16 +398,16 @@ MMRESULT WINAPI timeSetEvent(UINT wDelay, UINT wResol, LPTIMECALLBACK lpFunc, */ MMRESULT WINAPI timeKillEvent(UINT wID) { - LPWINE_TIMERENTRY lpSelf = NULL, *lpTimer; + WINE_TIMERENTRY *lpSelf = NULL, *lpTimer; TRACE("(%u)\n", wID); EnterCriticalSection(&WINMM_cs); /* remove WINE_TIMERENTRY from list */ - for (lpTimer = &TIME_TimersList; *lpTimer; lpTimer = &(*lpTimer)->lpNext) { - if (wID == (*lpTimer)->wTimerID) { - lpSelf = *lpTimer; - /* unlink timer of id 'wID' */ - *lpTimer = (*lpTimer)->lpNext; + LIST_FOR_EACH_ENTRY( lpTimer, &timer_list, WINE_TIMERENTRY, entry ) + { + if (wID == lpTimer->wTimerID) { + lpSelf = lpTimer; + list_remove( &lpTimer->entry ); break; } } diff --git a/dlls/winmm/winemm.h b/dlls/winmm/winemm.h index ed9e9f347a7..72de79a4573 100644 --- a/dlls/winmm/winemm.h +++ b/dlls/winmm/winemm.h @@ -241,7 +241,6 @@ LPWINE_MMIO MMIO_Get(HMMIO h); WORD TIME_SetEventInternal(UINT wDelay, UINT wResol, LPTIMECALLBACK lpFunc, DWORD dwUser, UINT wFlags); -void TIME_MMTimeStart(void); void TIME_MMTimeStop(void); /* Global variables */