[NTOSKRNL]

Make definitions of ExpChangeRundown, ExpChangePushlock and ExpSetRundown 64 bit safe (have one portable definition and use it accordingly)

svn path=/trunk/; revision=50152
This commit is contained in:
Timo Kreuzer 2010-12-26 22:25:47 +00:00
parent 0093430c81
commit e8fc5482a0
2 changed files with 46 additions and 52 deletions

View file

@ -145,7 +145,7 @@ ExfReInitializeRundownProtection(IN PEX_RUNDOWN_REF RunRef)
ASSERT((RunRef->Count & EX_RUNDOWN_ACTIVE) != 0); ASSERT((RunRef->Count & EX_RUNDOWN_ACTIVE) != 0);
/* Reset the count */ /* Reset the count */
ExpSetRundown(&RunRef->Count, 0); ExpSetRundown(RunRef, 0);
} }
/*++ /*++
@ -173,7 +173,7 @@ ExfRundownCompleted(IN PEX_RUNDOWN_REF RunRef)
ASSERT((RunRef->Count & EX_RUNDOWN_ACTIVE) != 0); ASSERT((RunRef->Count & EX_RUNDOWN_ACTIVE) != 0);
/* Mark the counter as active */ /* Mark the counter as active */
ExpSetRundown(&RunRef->Count, EX_RUNDOWN_ACTIVE); ExpSetRundown(RunRef, EX_RUNDOWN_ACTIVE);
} }
/*++ /*++
@ -359,7 +359,7 @@ ExfWaitForRundownProtectionRelease(IN PEX_RUNDOWN_REF RunRef)
WaitBlock.Count = Count; WaitBlock.Count = Count;
/* Now set the pointer */ /* Now set the pointer */
NewValue = ExpChangeRundown(RunRef, PtrToUlong(WaitBlockPointer), Value); NewValue = ExpChangeRundown(RunRef, (ULONG_PTR)WaitBlockPointer, Value);
if (NewValue == Value) break; if (NewValue == Value) break;
/* Loop again */ /* Loop again */

View file

@ -119,15 +119,9 @@ typedef struct
#endif #endif
#ifdef _WIN64 #define ExpChangeRundown(x, y, z) (ULONG_PTR)InterlockedCompareExchangePointer(&x->Ptr, (PVOID)y, (PVOID)z)
#define ExpChangeRundown(x, y, z) InterlockedCompareExchange64((PLONGLONG)x, y, z)
#define ExpChangePushlock(x, y, z) InterlockedCompareExchangePointer((PVOID*)x, (PVOID)y, (PVOID)z) #define ExpChangePushlock(x, y, z) InterlockedCompareExchangePointer((PVOID*)x, (PVOID)y, (PVOID)z)
#define ExpSetRundown(x, y) InterlockedExchange64((PLONGLONG)x, y) #define ExpSetRundown(x, y) InterlockedExchangePointer(&x->Ptr, (PVOID)y)
#else
#define ExpChangeRundown(x, y, z) PtrToUlong(InterlockedCompareExchange((PLONG)x, PtrToLong(y), PtrToLong(z)))
#define ExpChangePushlock(x, y, z) LongToPtr(InterlockedCompareExchange((PLONG)x, PtrToLong(y), PtrToLong(z)))
#define ExpSetRundown(x, y) InterlockedExchange((PLONG)x, y)
#endif
/* INITIALIZATION FUNCTIONS *************************************************/ /* INITIALIZATION FUNCTIONS *************************************************/
@ -849,7 +843,7 @@ _ExRundownCompleted(IN PEX_RUNDOWN_REF RunRef)
ASSERT((RunRef->Count & EX_RUNDOWN_ACTIVE) != 0); ASSERT((RunRef->Count & EX_RUNDOWN_ACTIVE) != 0);
/* Mark the counter as active */ /* Mark the counter as active */
ExpSetRundown(&RunRef->Count, EX_RUNDOWN_ACTIVE); ExpSetRundown(RunRef, EX_RUNDOWN_ACTIVE);
} }
/* PUSHLOCKS *****************************************************************/ /* PUSHLOCKS *****************************************************************/