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/s…
==============================================================================
--- 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/ntoskr…
==============================================================================
--- 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/ntoskr…
==============================================================================
--- 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/ntoskr…
==============================================================================
--- 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/subsys…
==============================================================================
--- 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;
}