Author: jimtabor
Date: Sat Jan 29 09:03:25 2011
New Revision: 50547

URL: http://svn.reactos.org/svn/reactos?rev=50547&view=rev
Log:
[Win32k]
- Patch by rafalh <rafalh1992 at o2 dor pl>, see bug 5835. Fix timers 
implementation.


Modified:
    trunk/reactos/subsystems/win32/win32k/ntuser/timer.c

Modified: trunk/reactos/subsystems/win32/win32k/ntuser/timer.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/timer.c?rev=50547&r1=50546&r2=50547&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/timer.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/timer.c [iso-8859-1] Sat Jan 
29 09:03:25 2011
@@ -19,7 +19,7 @@
 
 /* GLOBALS *******************************************************************/
 
-static PTIMER FirstpTmr = NULL;
+static LIST_ENTRY TimersListHead;
 static LONG TimeLast = 0;
 
 #define MAX_ELAPSE_TIME 0x7FFFFFFF
@@ -62,26 +62,13 @@
   HANDLE Handle;
   PTIMER Ret = NULL;
 
-  if (!FirstpTmr)
-  {
-      ExInitializeResourceLite(&TimerLock);
-      FirstpTmr = UserCreateObject(gHandleTable, NULL, &Handle, otTimer, 
sizeof(TIMER));
-      if (FirstpTmr)
-      {
-         FirstpTmr->head.h = Handle;
-         InitializeListHead(&FirstpTmr->ptmrList);
-      }
-      Ret = FirstpTmr;
-  }
-  else
-  {
-      Ret = UserCreateObject(gHandleTable, NULL, &Handle, otTimer, 
sizeof(TIMER));
-      if (Ret)
-      {
-         Ret->head.h = Handle;
-         InsertTailList(&FirstpTmr->ptmrList, &Ret->ptmrList);
-      }
-  }
+  Ret = UserCreateObject(gHandleTable, NULL, &Handle, otTimer, sizeof(TIMER));
+  if (Ret)
+  {
+     Ret->head.h = Handle;
+     InsertTailList(&TimersListHead, &Ret->ptmrList);
+  }
+
   return Ret;
 }
 
@@ -118,12 +105,13 @@
           UINT_PTR nID,
           UINT flags)
 {
-  PLIST_ENTRY pLE;
-  PTIMER pTmr = FirstpTmr, RetTmr = NULL;
+  PLIST_ENTRY pLE = TimersListHead.Flink;
+  PTIMER pTmr, RetTmr = NULL;
+
   TimerEnterExclusive();
-  do
-  {
-    if (!pTmr) break;
+  while (pLE != &TimersListHead)
+  {
+    pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList);
 
     if ( pTmr->nID == nID &&
          pTmr->pWnd == Window &&
@@ -133,32 +121,31 @@
        break;
     }
 
-    pLE = pTmr->ptmrList.Flink;
+    pLE = pLE->Flink;
+  }
+  TimerLeave();
+
+  return RetTmr;
+}
+
+PTIMER
+FASTCALL
+FindSystemTimer(PMSG pMsg)
+{
+  PLIST_ENTRY pLE = TimersListHead.Flink;
+  PTIMER pTmr = NULL;
+
+  TimerEnterExclusive();
+  while (pLE != &TimersListHead)
+  {
     pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList);
-  } while (pTmr != FirstpTmr);
-  TimerLeave();
-
-  return RetTmr;
-}
-
-PTIMER
-FASTCALL
-FindSystemTimer(PMSG pMsg)
-{
-  PLIST_ENTRY pLE;
-  PTIMER pTmr = FirstpTmr;
-  TimerEnterExclusive();
-  do
-  {
-    if (!pTmr) break;
 
     if ( pMsg->lParam == (LPARAM)pTmr->pfn &&
          (pTmr->flags & TMRF_SYSTEM) )
        break;
 
-    pLE = pTmr->ptmrList.Flink;
-    pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList);
-  } while (pTmr != FirstpTmr);
+    pLE = pLE->Flink;
+  }
   TimerLeave();
 
   return pTmr;
@@ -169,15 +156,14 @@
 ValidateTimerCallback(PTHREADINFO pti,
                       LPARAM lParam)
 {
-  PLIST_ENTRY pLE;
+  PLIST_ENTRY pLE = TimersListHead.Flink;
   BOOL Ret = FALSE;
-  PTIMER pTmr = FirstpTmr;
-
-  if (!pTmr) return FALSE;
+  PTIMER pTmr;
 
   TimerEnterExclusive();
-  do
-  {
+  while (pLE != &TimersListHead)
+  {
+    pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList);
     if ( (lParam == (LPARAM)pTmr->pfn) &&
         !(pTmr->flags & (TMRF_SYSTEM|TMRF_RIT)) &&
          (pTmr->pti->ppi == pti->ppi) )
@@ -185,9 +171,8 @@
        Ret = TRUE;
        break;
     }
-    pLE = pTmr->ptmrList.Flink;
-    pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList);
-  } while (pTmr != FirstpTmr);
+    pLE = pLE->Flink;
+  }
   TimerLeave();
 
   return Ret;
@@ -286,7 +271,7 @@
 
   ASSERT(MasterTimer != NULL);
   // Start the timer thread!
-  if (pTmr == FirstpTmr)
+  if (TimersListHead.Flink == TimersListHead.Blink) // There is only one timer
      KeSetTimer(MasterTimer, DueTime, NULL);
 
   return Ret;
@@ -334,22 +319,21 @@
 FASTCALL
 PostTimerMessages(PWND Window)
 {
-  PLIST_ENTRY pLE;
+  PLIST_ENTRY pLE = TimersListHead.Flink;
   PUSER_MESSAGE_QUEUE ThreadQueue;
   MSG Msg;
   PTHREADINFO pti;
   BOOL Hit = FALSE;
-  PTIMER pTmr = FirstpTmr;
-
-  if (!pTmr) return FALSE;
+  PTIMER pTmr;
 
   pti = PsGetCurrentThreadWin32Thread();
   ThreadQueue = pti->MessageQueue;
 
   TimerEnterExclusive();
 
-  do
-  {
+  while(pLE != &TimersListHead)
+  {
+     pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList);
      if ( (pTmr->flags & TMRF_READY) &&
           (pTmr->pti == pti) &&
           ((pTmr->pWnd == Window) || (Window == NULL)) )
@@ -366,9 +350,8 @@
            break;
         }
 
-     pLE = pTmr->ptmrList.Flink;
-     pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList);
-  } while (pTmr != FirstpTmr);
+     pLE = pLE->Flink;
+  }
 
   TimerLeave();
 
@@ -381,11 +364,9 @@
 {
   LARGE_INTEGER TickCount, DueTime;
   LONG Time;
-  PLIST_ENTRY pLE;
-  PTIMER pTmr = FirstpTmr;
+  PLIST_ENTRY pLE = TimersListHead.Flink;
+  PTIMER pTmr;
   LONG TimerCount = 0;
-
-  if (!pTmr) return;
 
   TimerEnterExclusive();
 
@@ -394,8 +375,9 @@
 
   DueTime.QuadPart = (LONGLONG)(-500000);
 
-  do
-  {
+  while(pLE != &TimersListHead)
+  {
+    pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList);
     TimerCount++;
     if (pTmr->flags & TMRF_WAITING)
     {
@@ -440,9 +422,8 @@
           pTmr->cmsCountdown -= Time - TimeLast;
     }
 
-    pLE = pTmr->ptmrList.Flink;
-    pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList);
-  } while (pTmr != FirstpTmr);
+    pLE = pLE->Flink;
+  }
 
   // Restart the timer thread!
   ASSERT(MasterTimer != NULL);
@@ -457,24 +438,24 @@
 BOOL FASTCALL
 DestroyTimersForWindow(PTHREADINFO pti, PWND Window)
 {
-   PLIST_ENTRY pLE;
-   PTIMER pTmr = FirstpTmr;
+   PLIST_ENTRY pLE = TimersListHead.Flink;
+   PTIMER pTmr;
    BOOL TimersRemoved = FALSE;
 
-   if ((FirstpTmr == NULL) || (Window == NULL))
+   if ((Window == NULL))
       return FALSE;
 
    TimerEnterExclusive();
 
-   do
+   while(pLE != &TimersListHead)
    {
+      pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList);
+      pLE = pLE->Flink; /* get next timer list entry before current timer is 
removed */
       if ((pTmr) && (pTmr->pti == pti) && (pTmr->pWnd == Window))
       {
          TimersRemoved = RemoveTimer(pTmr);
       }
-      pLE = pTmr->ptmrList.Flink;
-      pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList);
-   } while (pTmr != FirstpTmr);
+   }
 
    TimerLeave();
 
@@ -484,24 +465,21 @@
 BOOL FASTCALL
 DestroyTimersForThread(PTHREADINFO pti)
 {
-   PLIST_ENTRY pLE;
-   PTIMER pTmr = FirstpTmr;
+   PLIST_ENTRY pLE = TimersListHead.Flink;
+   PTIMER pTmr;
    BOOL TimersRemoved = FALSE;
 
-   if (FirstpTmr == NULL)
-      return FALSE;
-
    TimerEnterExclusive();
 
-   do
+   while(pLE != &TimersListHead)
    {
+      pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList);
+      pLE = pLE->Flink; /* get next timer list entry before current timer is 
removed */
       if ((pTmr) && (pTmr->pti == pti))
       {
          TimersRemoved = RemoveTimer(pTmr);
       }
-      pLE = pTmr->ptmrList.Flink;
-      pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList);
-   } while (pTmr != FirstpTmr);
+   }
 
    TimerLeave();
 
@@ -549,6 +527,9 @@
 
    /* yes we need this, since ExAllocatePoolWithTag isn't supposed to zero out 
allocated memory */
    RtlClearAllBits(&WindowLessTimersBitMap);
+
+   ExInitializeResourceLite(&TimerLock);
+   InitializeListHead(&TimersListHead);
 
    return STATUS_SUCCESS;
 }


Reply via email to