From a910887fdff9be06f56b671b73c551bad9a2090f Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Wed, 24 Jan 2007 10:52:55 +0000 Subject: [PATCH] - Merge a couple of small bugfixes from 25461 (smss and csrss related) - Merge 25472 svn path=/branches/ros-branch-0_3_1/; revision=25612 --- reactos/base/system/smss/smapi.c | 2 +- reactos/ntoskrnl/ex/handle.c | 3 - reactos/ntoskrnl/ex/rundown.c | 130 ++++++++++++---------- reactos/ntoskrnl/include/internal/ex.h | 14 +-- reactos/subsystems/win32/csrss/api/wapi.c | 9 +- 5 files changed, 83 insertions(+), 75 deletions(-) diff --git a/reactos/base/system/smss/smapi.c b/reactos/base/system/smss/smapi.c index ecbf75a3b1d..aeafa515811 100644 --- a/reactos/base/system/smss/smapi.c +++ b/reactos/base/system/smss/smapi.c @@ -144,7 +144,7 @@ SmpApiConnectedThread(PVOID pConnectedPort) break; case LPC_PORT_CLOSED: Reply = NULL; - break; + continue; default: if ((Request.SmHeader.ApiIndex) && (Request.SmHeader.ApiIndex < (sizeof SmApi / sizeof SmApi[0]))) diff --git a/reactos/ntoskrnl/ex/handle.c b/reactos/ntoskrnl/ex/handle.c index 7cd9509837a..a5952420d32 100644 --- a/reactos/ntoskrnl/ex/handle.c +++ b/reactos/ntoskrnl/ex/handle.c @@ -866,8 +866,6 @@ ExDestroyHandleByEntry(IN PHANDLE_TABLE HandleTable, DPRINT("DestroyHandleByEntry HT:0x%p Entry:0x%p\n", HandleTable, Entry); - if (!(HandleTable->Flags & EX_HANDLE_TABLE_CLOSING)) - { KeEnterCriticalRegion(); ExAcquireHandleLockExclusive(HandleTable); @@ -879,7 +877,6 @@ ExDestroyHandleByEntry(IN PHANDLE_TABLE HandleTable, ExReleaseHandleLock(HandleTable); KeLeaveCriticalRegion(); - } } PHANDLE_TABLE_ENTRY diff --git a/reactos/ntoskrnl/ex/rundown.c b/reactos/ntoskrnl/ex/rundown.c index 2fc1e5d0f04..aa1ab24c612 100644 --- a/reactos/ntoskrnl/ex/rundown.c +++ b/reactos/ntoskrnl/ex/rundown.c @@ -36,21 +36,21 @@ ExfAcquireRundownProtection(IN PEX_RUNDOWN_REF RunRef) { ULONG_PTR Value = RunRef->Count, NewValue; - /* Make sure a rundown is not active */ - if (Value & EX_RUNDOWN_ACTIVE) return FALSE; - /* Loop until successfully incremented the counter */ for (;;) { + /* Make sure a rundown is not active */ + if (Value & EX_RUNDOWN_ACTIVE) return FALSE; + /* Add a reference */ NewValue = Value + EX_RUNDOWN_COUNT_INC; /* Change the value */ - Value = ExpChangeRundown(RunRef, NewValue, Value); - if (Value == NewValue) return TRUE; + NewValue = ExpChangeRundown(RunRef, NewValue, Value); + if (NewValue == Value) return TRUE; - /* Make sure a rundown is not active */ - if (Value & EX_RUNDOWN_ACTIVE) return FALSE; + /* Update it */ + Value = NewValue; } } @@ -79,24 +79,21 @@ ExfAcquireRundownProtectionEx(IN PEX_RUNDOWN_REF RunRef, { ULONG_PTR Value = RunRef->Count, NewValue; - /* Make sure a rundown is not active */ - if (Value & EX_RUNDOWN_ACTIVE) return FALSE; - - /* Convert the count to our internal representation */ - Count <<= EX_RUNDOWN_COUNT_SHIFT; - /* Loop until successfully incremented the counter */ for (;;) { - /* Add references */ - NewValue = Value + Count; - - /* Change the value */ - Value = ExpChangeRundown(RunRef, NewValue, Value); - if (Value == NewValue) return TRUE; - /* Make sure a rundown is not active */ if (Value & EX_RUNDOWN_ACTIVE) return FALSE; + + /* Add references */ + NewValue = Value + EX_RUNDOWN_COUNT_INC * Count; + + /* Change the value */ + NewValue = ExpChangeRundown(RunRef, NewValue, Value); + if (NewValue == Value) return TRUE; + + /* Update the value */ + Value = NewValue; } } @@ -201,11 +198,11 @@ ExfReleaseRundownProtection(IN PEX_RUNDOWN_REF RunRef) ULONG_PTR Value = RunRef->Count, NewValue; PEX_RUNDOWN_WAIT_BLOCK WaitBlock; - /* Check if rundown is not active */ - if (!(Value & EX_RUNDOWN_ACTIVE)) + /* Loop until successfully incremented the counter */ + for (;;) { - /* Loop until successfully incremented the counter */ - for (;;) + /* Check if rundown is not active */ + if (!(Value & EX_RUNDOWN_ACTIVE)) { /* Sanity check */ ASSERT((Value >= EX_RUNDOWN_COUNT_INC) || (KeNumberProcessors > 1)); @@ -214,23 +211,28 @@ ExfReleaseRundownProtection(IN PEX_RUNDOWN_REF RunRef) NewValue = Value - EX_RUNDOWN_COUNT_INC; /* Change the value */ - Value = ExpChangeRundown(RunRef, NewValue, Value); - if (Value == NewValue) return; + NewValue = ExpChangeRundown(RunRef, NewValue, Value); + if (NewValue == Value) break; - /* Loop again if we're still not active */ - if (Value & EX_RUNDOWN_ACTIVE) break; + /* Update value */ + Value = NewValue; } - } + else + { + /* Get the wait block */ + WaitBlock = (PEX_RUNDOWN_WAIT_BLOCK)(Value & ~EX_RUNDOWN_ACTIVE); + ASSERT((WaitBlock->Count > 0) || (KeNumberProcessors > 1)); - /* Get the wait block */ - WaitBlock = (PEX_RUNDOWN_WAIT_BLOCK)(Value & ~EX_RUNDOWN_ACTIVE); - ASSERT((WaitBlock->Count > 0) || (KeNumberProcessors > 1)); + /* Remove the one count */ + if (!InterlockedDecrementSizeT(&WaitBlock->Count)) + { + /* We're down to 0 now, so signal the event */ + KeSetEvent(&WaitBlock->WakeEvent, IO_NO_INCREMENT, FALSE); + } - /* Remove the one count */ - if (!InterlockedDecrementSizeT(&WaitBlock->Count)) - { - /* We're down to 0 now, so signal the event */ - KeSetEvent(&WaitBlock->WakeEvent, IO_NO_INCREMENT, FALSE); + /* We're all done */ + break; + } } } @@ -260,37 +262,43 @@ ExfReleaseRundownProtectionEx(IN PEX_RUNDOWN_REF RunRef, ULONG_PTR Value = RunRef->Count, NewValue; PEX_RUNDOWN_WAIT_BLOCK WaitBlock; - /* Check if rundown is not active */ - if (!(Value & EX_RUNDOWN_ACTIVE)) + /* Loop until successfully incremented the counter */ + for (;;) { - /* Loop until successfully incremented the counter */ - for (;;) + /* Check if rundown is not active */ + if (!(Value & EX_RUNDOWN_ACTIVE)) { /* Sanity check */ - ASSERT((Value >= EX_RUNDOWN_COUNT_INC * Count) || (KeNumberProcessors > 1)); + ASSERT((Value >= EX_RUNDOWN_COUNT_INC * Count) || + (KeNumberProcessors > 1)); /* Get the new value */ - NewValue = Value - (Count * EX_RUNDOWN_COUNT_INC); + NewValue = Value - EX_RUNDOWN_COUNT_INC * Count; /* Change the value */ - Value = ExpChangeRundown(RunRef, NewValue, Value); - if (Value == NewValue) return; + NewValue = ExpChangeRundown(RunRef, NewValue, Value); + if (NewValue == Value) break; - /* Loop again if we're still not active */ - if (Value & EX_RUNDOWN_ACTIVE) break; + /* Update value */ + Value = NewValue; } - } + else + { + /* Get the wait block */ + WaitBlock = (PEX_RUNDOWN_WAIT_BLOCK)(Value & ~EX_RUNDOWN_ACTIVE); + ASSERT((WaitBlock->Count >= Count) || (KeNumberProcessors > 1)); - /* Get the wait block */ - WaitBlock = (PEX_RUNDOWN_WAIT_BLOCK)(Value & ~EX_RUNDOWN_ACTIVE); - ASSERT((WaitBlock->Count >= Count) || (KeNumberProcessors > 1)); + /* Remove the counts */ + if (InterlockedExchangeAddSizeT(&WaitBlock->Count, + -(LONG)Count) == (LONG)Count) + { + /* We're down to 0 now, so signal the event */ + KeSetEvent(&WaitBlock->WakeEvent, IO_NO_INCREMENT, FALSE); + } - /* Remove the count */ - if (InterlockedExchangeAddSizeT(&WaitBlock->Count, -(LONG)Count) == - (LONG)Count) - { - /* We're down to 0 now, so signal the event */ - KeSetEvent(&WaitBlock->WakeEvent, IO_NO_INCREMENT, FALSE); + /* We're all done */ + break; + } } } @@ -330,17 +338,17 @@ ExfWaitForRundownProtectionRelease(IN PEX_RUNDOWN_REF RunRef) EX_RUNDOWN_ACTIVE); /* Start waitblock set loop */ - for(;;) + for (;;) { /* Save the count */ Count = Value >> EX_RUNDOWN_COUNT_SHIFT; - /* If the count is over one or we don't have en event yet, create it */ - if (Count || !Event) + /* If the count is over one and we don't have en event yet, create it */ + if ((Count) && !(Event)) { /* Initialize the event */ KeInitializeEvent(&WaitBlock.WakeEvent, - NotificationEvent, + SynchronizationEvent, FALSE); /* Set the pointer */ diff --git a/reactos/ntoskrnl/include/internal/ex.h b/reactos/ntoskrnl/include/internal/ex.h index 9869c189bb0..a0ec15abd9b 100644 --- a/reactos/ntoskrnl/include/internal/ex.h +++ b/reactos/ntoskrnl/include/internal/ex.h @@ -351,7 +351,7 @@ BOOLEAN FORCEINLINE _ExAcquireRundownProtection(IN PEX_RUNDOWN_REF RunRef) { - ULONG_PTR Value, NewValue, OldValue; + ULONG_PTR Value, NewValue; /* Get the current value and mask the active bit */ Value = RunRef->Count &~ EX_RUNDOWN_ACTIVE; @@ -360,8 +360,8 @@ _ExAcquireRundownProtection(IN PEX_RUNDOWN_REF RunRef) NewValue = Value + EX_RUNDOWN_COUNT_INC; /* Change the value */ - OldValue = ExpChangeRundown(RunRef, NewValue, Value); - if (OldValue != Value) + NewValue = ExpChangeRundown(RunRef, NewValue, Value); + if (NewValue != Value) { /* Rundown was active, use long path */ return ExfAcquireRundownProtection(RunRef); @@ -392,7 +392,7 @@ VOID FORCEINLINE _ExReleaseRundownProtection(IN PEX_RUNDOWN_REF RunRef) { - ULONG_PTR Value, NewValue, OldValue; + ULONG_PTR Value, NewValue; /* Get the current value and mask the active bit */ Value = RunRef->Count &~ EX_RUNDOWN_ACTIVE; @@ -401,10 +401,10 @@ _ExReleaseRundownProtection(IN PEX_RUNDOWN_REF RunRef) NewValue = Value - EX_RUNDOWN_COUNT_INC; /* Change the value */ - OldValue = ExpChangeRundown(RunRef, NewValue, Value); + NewValue = ExpChangeRundown(RunRef, NewValue, Value); /* Check if the rundown was active */ - if (OldValue != Value) + if (NewValue != Value) { /* Rundown was active, use long path */ ExfReleaseRundownProtection(RunRef); @@ -463,7 +463,7 @@ _ExWaitForRundownProtectionRelease(IN PEX_RUNDOWN_REF RunRef) /* Set the active bit */ Value = ExpChangeRundown(RunRef, EX_RUNDOWN_ACTIVE, 0); - if ((Value) || (Value != EX_RUNDOWN_ACTIVE)) + if ((Value) && (Value != EX_RUNDOWN_ACTIVE)) { /* If the the rundown wasn't already active, then take the long path */ ExfWaitForRundownProtectionRelease(RunRef); diff --git a/reactos/subsystems/win32/csrss/api/wapi.c b/reactos/subsystems/win32/csrss/api/wapi.c index e725f167cc5..582b971bbe9 100644 --- a/reactos/subsystems/win32/csrss/api/wapi.c +++ b/reactos/subsystems/win32/csrss/api/wapi.c @@ -225,9 +225,12 @@ ClientConnectionThread(HANDLE ServerPort) /* If the connection was closed, handle that */ if (Request->Header.u2.s2.Type == LPC_PORT_CLOSED) { - DPRINT1("Port died, oh well\n"); + DPRINT("Port died, oh well\n"); CsrFreeProcessData( Request->Header.ClientId.UniqueProcess ); - break; + //NtClose(); + Reply = NULL; + continue; + //break; } if (Request->Header.u2.s2.Type == LPC_CONNECTION_REQUEST) @@ -239,7 +242,7 @@ ClientConnectionThread(HANDLE ServerPort) if (Request->Header.u2.s2.Type == LPC_CLIENT_DIED) { - DPRINT1("Clietn died, oh well\n"); + DPRINT("Client died, oh well\n"); Reply = NULL; continue; }