diff --git a/reactos/subsys/win32k/ntuser/timer.c b/reactos/subsys/win32k/ntuser/timer.c index 91ab0f86b61..02d0b6de29b 100644 --- a/reactos/subsys/win32k/ntuser/timer.c +++ b/reactos/subsys/win32k/ntuser/timer.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: timer.c,v 1.17 2003/11/12 22:53:31 weiden Exp $ +/* $Id: timer.c,v 1.18 2003/12/21 20:37:42 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -391,6 +391,8 @@ TimerThreadMain(PVOID StartContext) PLIST_ENTRY EnumEntry; PMSG_TIMER_ENTRY MsgTimer, MsgTimer2; PETHREAD Thread; + PETHREAD *ThreadsToDereference; + ULONG ThreadsToDereferenceCount, ThreadsToDereferencePos; for(;;) { @@ -409,11 +411,37 @@ TimerThreadMain(PVOID StartContext) KeQuerySystemTime(&CurrentTime); + ThreadsToDereferenceCount = ThreadsToDereferencePos = 0; + + for (EnumEntry = TimerListHead.Flink; + EnumEntry != &TimerListHead; + EnumEntry = EnumEntry->Flink) + { + MsgTimer = CONTAINING_RECORD(EnumEntry, MSG_TIMER_ENTRY, ListEntry); + if (CurrentTime.QuadPart >= MsgTimer->Timeout.QuadPart) + ++ThreadsToDereferenceCount; + else + break; + } + + for (EnumEntry = SysTimerListHead.Flink; + EnumEntry != &SysTimerListHead; + EnumEntry = EnumEntry->Flink) + { + MsgTimer = CONTAINING_RECORD(EnumEntry, MSG_TIMER_ENTRY, ListEntry); + if (CurrentTime.QuadPart >= MsgTimer->Timeout.QuadPart) + ++ThreadsToDereferenceCount; + else + break; + } + + ThreadsToDereference = (PETHREAD *)ExAllocatePool( + NonPagedPool, ThreadsToDereferenceCount * sizeof(PETHREAD)); + EnumEntry = TimerListHead.Flink; while (EnumEntry != &TimerListHead) { MsgTimer = CONTAINING_RECORD(EnumEntry, MSG_TIMER_ENTRY, ListEntry); - EnumEntry = EnumEntry->Flink; if (CurrentTime.QuadPart >= MsgTimer->Timeout.QuadPart) { @@ -431,7 +459,8 @@ TimerThreadMain(PVOID StartContext) MsqPostMessage(((PW32THREAD)Thread->Win32Thread)->MessageQueue, MsqCreateMessage(&MsgTimer->Msg)); - ObDereferenceObject(Thread); + ThreadsToDereference[ThreadsToDereferencePos] = Thread; + ++ThreadsToDereferencePos; //set up next periodic timeout MsgTimer->Timeout.QuadPart += (MsgTimer->Period * 10000); @@ -441,13 +470,14 @@ TimerThreadMain(PVOID StartContext) { break; } + + EnumEntry = EnumEntry->Flink; } EnumEntry = SysTimerListHead.Flink; while (EnumEntry != &SysTimerListHead) { MsgTimer2 = CONTAINING_RECORD(EnumEntry, MSG_TIMER_ENTRY, ListEntry); - EnumEntry = EnumEntry->Flink; if (CurrentTime.QuadPart >= MsgTimer2->Timeout.QuadPart) { @@ -465,7 +495,8 @@ TimerThreadMain(PVOID StartContext) MsqPostMessage(((PW32THREAD)Thread->Win32Thread)->MessageQueue, MsqCreateMessage(&MsgTimer2->Msg)); - ObDereferenceObject(Thread); + ThreadsToDereference[ThreadsToDereferencePos] = Thread; + ++ThreadsToDereferencePos; //set up next periodic timeout MsgTimer2->Timeout.QuadPart += (MsgTimer2->Period * 10000); @@ -475,6 +506,8 @@ TimerThreadMain(PVOID StartContext) { break; } + + EnumEntry = EnumEntry->Flink; } //set up next timeout from first entry (if any) @@ -509,6 +542,13 @@ TimerThreadMain(PVOID StartContext) } ExReleaseFastMutex(&Mutex); + + for (ThreadsToDereferencePos = 0; + ThreadsToDereferencePos < ThreadsToDereferenceCount; + ThreadsToDereferencePos++) + ObDereferenceObject(ThreadsToDereference[ThreadsToDereferencePos]); + + ExFreePool(ThreadsToDereference); } } diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index 57b10f06207..1368213fd56 100644 --- a/reactos/subsys/win32k/objects/text.c +++ b/reactos/subsys/win32k/objects/text.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: text.c,v 1.62 2003/12/21 18:38:37 navaraf Exp $ */ +/* $Id: text.c,v 1.63 2003/12/21 20:37:42 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN @@ -471,8 +471,10 @@ BOOL STDCALL NtGdiExtTextOut(HDC hDC, int XStart, int YStart, UINT fuOptions, CONST RECT *lprc, LPCWSTR String, UINT Count, CONST INT *lpDx) { +#if 1 /* FIXME: Implement */ -// return NtGdiTextOut(hdc, X, Y, lpString, cbCount); + return NtGdiTextOut(hDC, XStart, YStart, String, Count); +#else // Fixme: Call EngTextOut, which does the real work (calling DrvTextOut where appropriate) DC *dc; @@ -737,6 +739,7 @@ fail: } DC_UnlockDc( hDC ); return FALSE; +#endif } BOOL