mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 23:06:00 +00:00
[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
This commit is contained in:
parent
b2c96e402d
commit
7c5fd856ee
1 changed files with 17 additions and 8 deletions
|
@ -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();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue