- 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
This commit is contained in:
Michael Martin 2010-06-07 13:37:43 +00:00
parent b2c96e402d
commit 7c5fd856ee

View file

@ -24,7 +24,7 @@ static LONG TimeLast = 0;
#define MAX_ELAPSE_TIME 0x7FFFFFFF #define MAX_ELAPSE_TIME 0x7FFFFFFF
/* Windows 2000 has room for 32768 window-less timers */ /* 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 FAST_MUTEX Mutex;
static RTL_BITMAP WindowLessTimersBitMap; static RTL_BITMAP WindowLessTimersBitMap;
@ -94,6 +94,13 @@ RemoveTimer(PTIMER pTmr)
{ {
/* Set the flag, it will be removed when ready */ /* Set the flag, it will be removed when ready */
RemoveEntryList(&pTmr->ptmrList); 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); UserDereferenceObject(pTmr);
Ret = UserDeleteObject( UserHMGetHandle(pTmr), otTimer); Ret = UserDeleteObject( UserHMGetHandle(pTmr), otTimer);
} }
@ -224,9 +231,15 @@ IntSetTimer( PWINDOW_OBJECT Window,
Elapse = 10; 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(); IntLockWindowlessTimerBitmap();
IDEvent = RtlFindClearBitsAndSet(&WindowLessTimersBitMap, 1, HintIndex); IDEvent = RtlFindClearBitsAndSet(&WindowLessTimersBitMap, 1, HintIndex);
if (IDEvent == (UINT_PTR) -1) if (IDEvent == (UINT_PTR) -1)
@ -237,15 +250,11 @@ IntSetTimer( PWINDOW_OBJECT Window,
return 0; return 0;
} }
HintIndex = ++IDEvent;
IntUnlockWindowlessTimerBitmap();
Ret = IDEvent; Ret = IDEvent;
//HintIndex = IDEvent + 1;
IntUnlockWindowlessTimerBitmap();
} }
if ((Window) && (IDEvent == 0))
IDEvent = 1;
pTmr = FindTimer(Window, IDEvent, Type, FALSE);
if (!pTmr) if (!pTmr)
{ {
pTmr = CreateTimer(); pTmr = CreateTimer();