[ros-diffs] [mjmartin] 47658: [win32k] - Change the number of windowless timers from 1024 to 32768. - When destroying windowless timers, clear the bit number (IDEvent) in the bitmap so the bit number can be reused. - Only create a windowless timer if there is no windowless timer matching IDEvent. - Fixes case where applications create too many windowless timers and/or run out of windowless timers.

mjmartin at svn.reactos.org mjmartin at svn.reactos.org
Mon Jun 7 15:37:44 CEST 2010


Author: mjmartin
Date: Mon Jun  7 15:37:43 2010
New Revision: 47658

URL: http://svn.reactos.org/svn/reactos?rev=47658&view=rev
Log:
[win32k]
- Change the number of windowless timers from 1024 to 32768.
- When destroying windowless timers, clear the bit number (IDEvent) in the bitmap so the bit number can be reused.
- Only create a windowless timer if there is no windowless timer matching IDEvent.
- Fixes case where applications create too many windowless timers and/or run out of windowless timers.

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=47658&r1=47657&r2=47658&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] Mon Jun  7 15:37:43 2010
@@ -24,7 +24,7 @@
 #define MAX_ELAPSE_TIME 0x7FFFFFFF
 
 /* Windows 2000 has room for 32768 window-less timers */
-#define NUM_WINDOW_LESS_TIMERS   1024
+#define NUM_WINDOW_LESS_TIMERS   32768
 
 static FAST_MUTEX     Mutex;
 static RTL_BITMAP     WindowLessTimersBitMap;
@@ -94,6 +94,13 @@
   {
      /* Set the flag, it will be removed when ready */
      RemoveEntryList(&pTmr->ptmrList);
+     if ((pTmr->pWnd == NULL) && (!(pTmr->flags & TMRF_SYSTEM)))
+     {
+        DPRINT("Clearing Bit %d)\n", pTmr->nID);
+        IntLockWindowlessTimerBitmap();
+        RtlClearBit(&WindowLessTimersBitMap, pTmr->nID);
+        IntUnlockWindowlessTimerBitmap();
+     }
      UserDereferenceObject(pTmr);
      Ret = UserDeleteObject( UserHMGetHandle(pTmr), otTimer);
   }
@@ -224,9 +231,15 @@
      Elapse = 10;
   }
 
-  if ((Window == NULL) && (!(Type & TMRF_SYSTEM)))
+  if ((Window) && (IDEvent == 0))
+     IDEvent = 1;
+
+  pTmr = FindTimer(Window, IDEvent, Type, FALSE);
+
+  if ((!pTmr) && (Window == NULL) && (!(Type & TMRF_SYSTEM)))
   {
       IntLockWindowlessTimerBitmap();
+
       IDEvent = RtlFindClearBitsAndSet(&WindowLessTimersBitMap, 1, HintIndex);
 
       if (IDEvent == (UINT_PTR) -1)
@@ -237,15 +250,11 @@
          return 0;
       }
 
-      HintIndex = ++IDEvent;
+      Ret = IDEvent;
+      //HintIndex = IDEvent + 1;
       IntUnlockWindowlessTimerBitmap();
-      Ret = IDEvent;
-  }
-
-  if ((Window) && (IDEvent == 0))
-     IDEvent = 1;
-
-  pTmr = FindTimer(Window, IDEvent, Type, FALSE);
+  }
+
   if (!pTmr)
   {
      pTmr = CreateTimer();




More information about the Ros-diffs mailing list