* 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
PLIST_ENTRY EnumEntry;
PMSG_TIMER_ENTRY MsgTimer, MsgTimer2;
PETHREAD Thread;
+ PETHREAD *ThreadsToDereference;
+ ULONG ThreadsToDereferenceCount, ThreadsToDereferencePos;
for(;;)
{
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)
{
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);
{
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)
{
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);
{
break;
}
+
+ EnumEntry = EnumEntry->Flink;
}
//set up next timeout from first entry (if any)
}
ExReleaseFastMutex(&Mutex);
+
+ for (ThreadsToDereferencePos = 0;
+ ThreadsToDereferencePos < ThreadsToDereferenceCount;
+ ThreadsToDereferencePos++)
+ ObDereferenceObject(ThreadsToDereference[ThreadsToDereferencePos]);
+
+ ExFreePool(ThreadsToDereference);
}
}
* 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
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;
}
DC_UnlockDc( hDC );
return FALSE;
+#endif
}
BOOL