Author: fireball Date: Wed Jan 24 13:52:55 2007 New Revision: 25612
URL: http://svn.reactos.org/svn/reactos?rev=25612&view=rev Log: - Merge a couple of small bugfixes from 25461 (smss and csrss related) - Merge 25472
Modified: branches/ros-branch-0_3_1/reactos/base/system/smss/smapi.c branches/ros-branch-0_3_1/reactos/ntoskrnl/ex/handle.c branches/ros-branch-0_3_1/reactos/ntoskrnl/ex/rundown.c branches/ros-branch-0_3_1/reactos/ntoskrnl/include/internal/ex.h branches/ros-branch-0_3_1/reactos/subsystems/win32/csrss/api/wapi.c
Modified: branches/ros-branch-0_3_1/reactos/base/system/smss/smapi.c URL: http://svn.reactos.org/svn/reactos/branches/ros-branch-0_3_1/reactos/base/sy... ============================================================================== --- branches/ros-branch-0_3_1/reactos/base/system/smss/smapi.c (original) +++ branches/ros-branch-0_3_1/reactos/base/system/smss/smapi.c Wed Jan 24 13:52:55 2007 @@ -144,7 +144,7 @@ break; case LPC_PORT_CLOSED: Reply = NULL; - break; + continue; default: if ((Request.SmHeader.ApiIndex) && (Request.SmHeader.ApiIndex < (sizeof SmApi / sizeof SmApi[0])))
Modified: branches/ros-branch-0_3_1/reactos/ntoskrnl/ex/handle.c URL: http://svn.reactos.org/svn/reactos/branches/ros-branch-0_3_1/reactos/ntoskrn... ============================================================================== --- branches/ros-branch-0_3_1/reactos/ntoskrnl/ex/handle.c (original) +++ branches/ros-branch-0_3_1/reactos/ntoskrnl/ex/handle.c Wed Jan 24 13:52:55 2007 @@ -866,8 +866,6 @@
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 @@
ExReleaseHandleLock(HandleTable); KeLeaveCriticalRegion(); - } }
PHANDLE_TABLE_ENTRY
Modified: branches/ros-branch-0_3_1/reactos/ntoskrnl/ex/rundown.c URL: http://svn.reactos.org/svn/reactos/branches/ros-branch-0_3_1/reactos/ntoskrn... ============================================================================== --- branches/ros-branch-0_3_1/reactos/ntoskrnl/ex/rundown.c (original) +++ branches/ros-branch-0_3_1/reactos/ntoskrnl/ex/rundown.c Wed Jan 24 13:52:55 2007 @@ -36,21 +36,21 @@ { 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; - - /* Make sure a rundown is not active */ - if (Value & EX_RUNDOWN_ACTIVE) return FALSE; + NewValue = ExpChangeRundown(RunRef, NewValue, Value); + if (NewValue == Value) return TRUE; + + /* Update it */ + Value = NewValue; } }
@@ -78,25 +78,22 @@ IN ULONG Count) { 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 @@ 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,24 +211,29 @@ NewValue = Value - EX_RUNDOWN_COUNT_INC;
/* Change the value */ - Value = ExpChangeRundown(RunRef, NewValue, Value); - if (Value == NewValue) return; - - /* Loop again if we're still not active */ - if (Value & EX_RUNDOWN_ACTIVE) break; + NewValue = ExpChangeRundown(RunRef, NewValue, Value); + if (NewValue == Value) 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)); + + /* 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; } } - - /* 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); - } }
/*++ @@ -260,37 +262,43 @@ 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; - - /* Loop again if we're still not active */ - if (Value & EX_RUNDOWN_ACTIVE) break; + NewValue = ExpChangeRundown(RunRef, NewValue, Value); + if (NewValue == Value) break; + + /* Update value */ + Value = NewValue; } - } - - /* Get the wait block */ - WaitBlock = (PEX_RUNDOWN_WAIT_BLOCK)(Value & ~EX_RUNDOWN_ACTIVE); - ASSERT((WaitBlock->Count >= Count) || (KeNumberProcessors > 1)); - - /* 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); + else + { + /* 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); + } + + /* We're all done */ + break; + } } }
@@ -330,17 +338,17 @@ 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 */
Modified: branches/ros-branch-0_3_1/reactos/ntoskrnl/include/internal/ex.h URL: http://svn.reactos.org/svn/reactos/branches/ros-branch-0_3_1/reactos/ntoskrn... ============================================================================== --- branches/ros-branch-0_3_1/reactos/ntoskrnl/include/internal/ex.h (original) +++ branches/ros-branch-0_3_1/reactos/ntoskrnl/include/internal/ex.h Wed Jan 24 13:52:55 2007 @@ -351,7 +351,7 @@ 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 @@ 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 @@ 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 @@ 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 @@
/* 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);
Modified: branches/ros-branch-0_3_1/reactos/subsystems/win32/csrss/api/wapi.c URL: http://svn.reactos.org/svn/reactos/branches/ros-branch-0_3_1/reactos/subsyst... ============================================================================== --- branches/ros-branch-0_3_1/reactos/subsystems/win32/csrss/api/wapi.c (original) +++ branches/ros-branch-0_3_1/reactos/subsystems/win32/csrss/api/wapi.c Wed Jan 24 13:52:55 2007 @@ -225,9 +225,12 @@ /* 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 @@
if (Request->Header.u2.s2.Type == LPC_CLIENT_DIED) { - DPRINT1("Clietn died, oh well\n"); + DPRINT("Client died, oh well\n"); Reply = NULL; continue; }