Fix really really big Mutex/APC bug. Killing GUI Threads from
taskmanager should now work flawlessly, and gui apps should work better;
the bug had probably tiny important impact in them
Modified: trunk/reactos/ntoskrnl/ke/mutex.c
_____
Modified: trunk/reactos/ntoskrnl/ke/mutex.c
--- trunk/reactos/ntoskrnl/ke/mutex.c 2005-03-22 03:05:46 UTC (rev
14263)
+++ trunk/reactos/ntoskrnl/ke/mutex.c 2005-03-22 03:06:03 UTC (rev
14264)
@@ -162,10 +162,28 @@
/* Check if the signal state is only single */
if (Mutant->Header.SignalState == 1) {
+ /* Check if it's below 0 now */
if (PreviousState <= 0) {
+ /* Remove the mutant from the list */
DPRINT("Removing Mutant\n");
RemoveEntryList(&Mutant->MutantListEntry);
+
+ /* Reenable APCs */
+ DPRINT("Re-enabling APCs\n");
+ CurrentThread->KernelApcDisable += Mutant->ApcDisable;
+
+ /* Force an Interrupt if Apcs are pending */
+ if
(!IsListEmpty(&CurrentThread->ApcState.ApcListHead[KernelMode])) {
+
+ /* Make sure they aren't disabled though */
+ if (!CurrentThread->KernelApcDisable) {
+
+ /* Request the Interrupt */
+ DPRINT("Requesting APC Interupt\n");
+ HalRequestSoftwareInterrupt(APC_LEVEL);
+ }
+ }
}
/* Remove the Owning Thread and wake it */
Show replies by date