From 7c5fd856eee994f929ac94989edacd279d6aec75 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Mon, 7 Jun 2010 13:37:43 +0000 Subject: [PATCH] [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. svn path=/trunk/; revision=47658 --- .../subsystems/win32/win32k/ntuser/timer.c | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/timer.c b/reactos/subsystems/win32/win32k/ntuser/timer.c index ea3b509da5d..de8caeaafed 100644 --- a/reactos/subsystems/win32/win32k/ntuser/timer.c +++ b/reactos/subsystems/win32/win32k/ntuser/timer.c @@ -24,7 +24,7 @@ static LONG TimeLast = 0; #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 @@ RemoveTimer(PTIMER pTmr) { /* 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 @@ IntSetTimer( PWINDOW_OBJECT Window, 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 @@ IntSetTimer( PWINDOW_OBJECT Window, return 0; } - HintIndex = ++IDEvent; - IntUnlockWindowlessTimerBitmap(); Ret = IDEvent; + //HintIndex = IDEvent + 1; + IntUnlockWindowlessTimerBitmap(); } - if ((Window) && (IDEvent == 0)) - IDEvent = 1; - - pTmr = FindTimer(Window, IDEvent, Type, FALSE); if (!pTmr) { pTmr = CreateTimer();