The
svn.reactos.org is up and roung again
I just update my local tree
----- Original Message -----
From: "Hartmut Birr" <osexpert(a)googlemail.com>
To: "ReactOS Development List" <ros-dev(a)reactos.org>
Sent: den 9 January 2006 16:32
Subject: Re: [ros-dev] Re: [ros-svn] [ion] 20554: - Fix shamefully
dangerouslybroken Work Thread/Queue/Item implementation:
WaxDragon wrote:
> On 1/7/06, Hartmut Birr <osexpert(a)googlemail.com> wrote:
>
>> Alex Ionescu wrote:
>>
>>> Hartmut Birr wrote:
>>>
>>>
>>>> The real problem is,
>>>> KiAbortWaitThread is called for a thread which does not waiting.
>>>>
>>>>
>>>>
>>> Ok, since this happened after my worker thread patch and they use
>>> kernel queues, I reviewed their implementation and found a number of
>>> important flaws.. wether or not they cause this problem I can't tell
>>> for sure, but I've also added a debug print before the
>>> KeAbortWaitThread call... let me know if this patch fixes anything or
>>> if the dprint shoes that the thread isn't really waiting.
>>>
>>> Best regards,
>>> Alex Ionescu
>>>
>> I've test your changes (r20579 with r20601,20605,20606).
>> KeAbortWaitThread is called for waiting threads only. But I'm running
in
another problem. Compiling ros on ros (with the nice
parameter '-j2')
hangs after some time.
When I try to selfhost with a -O2 build, I see a hang about 90% into
the build. The hang I see is *hard*, at least under vmware, nothing
is reponding. I don't use "-j2".
If I look to taskmgr or ctm, only the idle
thread
consumes cpu power.
I have seen this once, I don't remember what I was doing at the time,
it may have compiling.
> Sometimes I can stop the compiling with Ctrl-C,
> sometimes not. I wasn't able to compile ros on the smp machine. On the
> up machine, one of four compile runs does finish.
>
> - Hartmut
Currently I'm on r20600. After fixing some bugs (timer.c, gate.c and
wait.c), I'm able to compile ros on ros. After updating to r20601, it is
broken again. I commit the fixes if I reach the head revision.
- Hartmut
----------------------------------------------------------------------------
----
Index: ntoskrnl/ke/timer.c
===================================================================
--- ntoskrnl/ke/timer.c (Revision 20601)
+++ ntoskrnl/ke/timer.c (Arbeitskopie)
@@ -165,6 +165,11 @@
return KeSetTimerEx(Timer, DueTime, 0, Dpc);
}
+ULONG _help1;
+ULONG _help2;
+ULONG _help3;
+ULONG _help4;
+
/*
* @implemented
*
@@ -247,6 +252,7 @@
/* Query Interrupt Times */
InterruptTime = KeQueryInterruptTime();
+ _help1 = 1;
/* Loop through the Timer List and remove Expired Timers. Insert them
into the
Expired Listhead */
LIST_FOR_EACH_SAFE(Timer, tmp,
&KiTimerListHead, KTIMER,
TimerListEntry)
{
@@ -259,7 +265,9 @@
RemoveEntryList(&Timer->TimerListEntry);
InsertTailList(&ExpiredTimerList, &Timer->TimerListEntry);
}
+ _help1 = 0;
+ _help2 = 1;
/* Expire the Timers */
while (!IsListEmpty(&ExpiredTimerList)) {
@@ -267,11 +275,13 @@
/* Get the Timer */
Timer = CONTAINING_RECORD(CurrentEntry, KTIMER, TimerListEntry);
+ Timer->Header.Inserted = FALSE;
DPRINT("Expiring Timer: %x\n", Timer);
/* Expire it */
KiHandleExpiredTimer(Timer);
}
+ _help2 = 0;
DPRINT("Timers expired\n");
@@ -301,7 +311,9 @@
/* Set it as Signaled */
DPRINT("Setting Timer as Signaled\n");
Timer->Header.SignalState = TRUE;
+ _help3 = 1;
KiWaitTest(&Timer->Header, IO_NO_INCREMENT);
+ _help3 = 0;
/* If the Timer is periodic, reinsert the timer with the new due time
*/
if (Timer->Period) {
@@ -321,10 +333,11 @@
DPRINT("Timer->Dpc %x Timer->Dpc->DeferredRoutine %x\n",
Timer->Dpc, Timer->Dpc->DeferredRoutine);
/* Insert the DPC */
+ _help4 = 1;
KeInsertQueueDpc(Timer->Dpc,
NULL,
NULL);
-
+ _help4 = 0;
DPRINT("Finished dpc routine\n");
}
}
Index: ntoskrnl/ke/gate.c
===================================================================
--- ntoskrnl/ke/gate.c (Revision 20601)
+++ ntoskrnl/ke/gate.c (Arbeitskopie)
@@ -136,7 +136,6 @@
/* Reschedule the Thread */
DPRINT("Unblocking the Thread\n");
KiUnblockThread(WaitThread, &WaitStatus, EVENT_INCREMENT);
- return;
quit:
/* Release the Dispatcher Database Lock */
Index: ntoskrnl/ke/wait.c
===================================================================
--- ntoskrnl/ke/wait.c (Revision 20601)
+++ ntoskrnl/ke/wait.c (Arbeitskopie)
@@ -152,6 +152,7 @@
{
/* FIXME: The timer already expired, we should find a new
ready thread
*/
Status = STATUS_SUCCESS;
+ CHECKPOINT1;
break;
}
@@ -329,6 +330,7 @@
{
/* Return a timeout if we couldn't insert the timer */
Status = STATUS_TIMEOUT;
+ CHECKPOINT1;
goto DontWait;
}
}
@@ -560,6 +562,7 @@
{
/* Return a timeout */
Status = STATUS_TIMEOUT;
+ CHECKPOINT1;
goto DontWait;
}
@@ -808,6 +811,10 @@
{
KiDispatchThreadNoLock(Ready);
}
+ else
+ {
+ KeReleaseDispatcherDatabaseLockFromDpcLevel();
+ }
/* Lower irql back */
KeLowerIrql(OldIrql);
Index: ntoskrnl/include/internal/ke.h
===================================================================
--- ntoskrnl/include/internal/ke.h (Revision 20601)
+++ ntoskrnl/include/internal/ke.h (Arbeitskopie)
@@ -62,7 +62,6 @@
#define KeReleaseDispatcherDatabaseLockFromDpcLevel() \
KeReleaseSpinLockFromDpcLevel(&DispatcherDatabaseLock);
#define KeReleaseDispatcherDatabaseLock(OldIrql) \
- KeReleaseSpinLockFromDpcLevel(&DispatcherDatabaseLock); \
KiExitDispatcher(OldIrql);
#endif
@@ -675,7 +674,7 @@
VOID
NTAPI
-KeApplicationProcessorInit(VOID);
+KeApplicationProcessorInit(ULONG);
VOID
NTAPI
----------------------------------------------------------------------------
----
_______________________________________________
Ros-dev mailing list
Ros-dev(a)reactos.org
http://www.reactos.org/mailman/listinfo/ros-dev