Piotr Caban : winmm: Destroy timer after calling callback.

Alexandre Julliard julliard at winehq.org
Wed Sep 30 14:35:31 CDT 2020


Module: wine
Branch: master
Commit: daec24a9d6adc25954a239a588f4019acd79609a
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=daec24a9d6adc25954a239a588f4019acd79609a

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Wed Sep 30 14:37:57 2020 +0200

winmm: Destroy timer after calling callback.

Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winmm/time.c | 13 ++++---------
 1 file changed, 4 insertions(+), 9 deletions(-)

diff --git a/dlls/winmm/time.c b/dlls/winmm/time.c
index 2d5f3db389..634b5df792 100644
--- a/dlls/winmm/time.c
+++ b/dlls/winmm/time.c
@@ -107,7 +107,7 @@ static    CONDITION_VARIABLE    TIME_cv;
  */
 static int TIME_MMSysTimeCallback(void)
 {
-    WINE_TIMERENTRY *timer, copy;
+    WINE_TIMERENTRY *timer;
     int i, delta_time;
 
     /* since timeSetEvent() and timeKillEvent() can be called
@@ -139,15 +139,7 @@ static int TIME_MMSysTimeCallback(void)
         if (delta_time > 0) break;
 
         if (timer->wFlags & TIME_PERIODIC)
-        {
             timer->dwTriggerTime += timer->wDelay;
-        }
-        else
-        {
-            copy = *timer;
-            timer->wTimerID = 0;
-            timer = ©
-        }
 
         switch(timer->wFlags & (TIME_CALLBACK_EVENT_SET|TIME_CALLBACK_EVENT_PULSE))
         {
@@ -171,9 +163,12 @@ static int TIME_MMSysTimeCallback(void)
 
                 EnterCriticalSection(&WINMM_cs);
                 if (flags & TIME_KILL_SYNCHRONOUS) LeaveCriticalSection(&TIME_cbcrst);
+                if (id != timer->wTimerID) timer = NULL;
             }
             break;
         }
+        if (timer && !(timer->wFlags & TIME_PERIODIC))
+            timer->wTimerID = 0;
     }
     return delta_time;
 }




More information about the wine-cvs mailing list