Author: fireball Date: Wed Jun 18 06:34:10 2008 New Revision: 34008
URL: http://svn.reactos.org/svn/reactos?rev=34008&view=rev Log: - More fixes to pushlock implementation: * In ExTimedWaitForUnblockPushLock, check only for STATUS_SUCCESS (which is the only status return when the wait was satisfied, while other like STATUS_TIMEOUT would still be considered a success). * In ExBlockPushlock, fix a typo when trying out an interlocked exchange with a new value - wrong value was assigned. * In ExfAcquirePushLockShared, assign PushLock value passed to this function, not the NewValue, like it's done in ExfAcquirePushLockExclusive. * In ExfReleaseReleasePushLockExclusive, fix a typo which led to incorrect behavior and not waking up the pushlock when it should be.
Modified: trunk/reactos/ntoskrnl/ex/pushlock.c
Modified: trunk/reactos/ntoskrnl/ex/pushlock.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ex/pushlock.c?rev=... ============================================================================== --- trunk/reactos/ntoskrnl/ex/pushlock.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/ex/pushlock.c [iso-8859-1] Wed Jun 18 06:34:10 2008 @@ -343,9 +343,10 @@ KernelMode, FALSE, Timeout); - if (!NT_SUCCESS(Status)) - { - /* Try unblocking the pushlock */ + /* Check if the wait was satisfied */ + if (Status != STATUS_SUCCESS) + { + /* Try unblocking the pushlock if it was not */ ExfUnblockPushLock(PushLock, WaitBlock); } } @@ -432,7 +433,7 @@ if (OldValue.Ptr == NewValue.Ptr) break;
/* Try again with the new value */ - NewValue = OldValue; + OldValue = NewValue; } }
@@ -657,7 +658,7 @@ if (NewValue.Value != OldValue.Value) { /* Retry */ - OldValue = NewValue; + OldValue = *PushLock; continue; }
@@ -721,7 +722,7 @@ if (NewValue.Ptr != OldValue.Ptr) { /* Retry */ - OldValue = NewValue; + OldValue = *PushLock; continue; }
@@ -1088,7 +1089,7 @@ OldValue.Ptr);
/* Check if the value changed behind our back */ - if (NewValue.Value != OldValue.Value) + if (NewValue.Value == OldValue.Value) { /* Wake the Pushlock */ ExfWakePushLock(PushLock, WakeValue);