/** @file\r
Implementation of synchronization functions.\r
\r
- Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>\r
- This program and the accompanying materials\r
- are licensed and made available under the terms and conditions of the BSD License\r
- which accompanies this distribution. The full text of the license may be found at\r
- http://opensource.org/licenses/bsd-license.php.\r
-\r
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+ Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
Microsoft Visual Studio 7.1 Function Prototypes for read write barrier Intrinsics.\r
**/\r
\r
-void _ReadWriteBarrier (void);\r
-#pragma intrinsic(_ReadWriteBarrier)\r
+void\r
+_ReadWriteBarrier (\r
+ void\r
+ );\r
\r
+#pragma intrinsic(_ReadWriteBarrier)\r
\r
-#define SPIN_LOCK_RELEASED ((UINTN) 1)\r
-#define SPIN_LOCK_ACQUIRED ((UINTN) 2)\r
+#define SPIN_LOCK_RELEASED ((UINTN) 1)\r
+#define SPIN_LOCK_ACQUIRED ((UINTN) 2)\r
\r
/**\r
Retrieves the architecture specific spin lock alignment requirements for\r
optimal spin lock performance.\r
\r
This function retrieves the spin lock alignment requirements for optimal\r
- performance on a given CPU architecture. The spin lock alignment is byte alignment. \r
+ performance on a given CPU architecture. The spin lock alignment is byte alignment.\r
It must be a power of two and is returned by this function. If there are no alignment\r
requirements, then 1 must be returned. The spin lock synchronization\r
functions must function correctly if the spin lock size and alignment values\r
SPIN_LOCK *\r
EFIAPI\r
InitializeSpinLock (\r
- OUT SPIN_LOCK *SpinLock\r
+ OUT SPIN_LOCK *SpinLock\r
)\r
{\r
ASSERT (SpinLock != NULL);\r
\r
- _ReadWriteBarrier();\r
+ _ReadWriteBarrier ();\r
*SpinLock = SPIN_LOCK_RELEASED;\r
- _ReadWriteBarrier();\r
+ _ReadWriteBarrier ();\r
\r
return SpinLock;\r
}\r
SPIN_LOCK *\r
EFIAPI\r
AcquireSpinLock (\r
- IN OUT SPIN_LOCK *SpinLock\r
+ IN OUT SPIN_LOCK *SpinLock\r
)\r
{\r
UINT64 Current;\r
//\r
// Get the current timer value\r
//\r
- Current = GetPerformanceCounter();\r
+ Current = GetPerformanceCounter ();\r
\r
//\r
// Initialize local variables\r
if (Cycle < 0) {\r
Cycle = -Cycle;\r
}\r
+\r
Cycle++;\r
\r
while (!AcquireSpinLockOrFail (SpinLock)) {\r
CpuPause ();\r
Previous = Current;\r
- Current = GetPerformanceCounter();\r
- Delta = (INT64) (Current - Previous);\r
+ Current = GetPerformanceCounter ();\r
+ Delta = (INT64)(Current - Previous);\r
if (Start > End) {\r
Delta = -Delta;\r
}\r
+\r
if (Delta < 0) {\r
Delta += Cycle;\r
}\r
+\r
Total += Delta;\r
ASSERT (Total < Timeout);\r
}\r
}\r
+\r
return SpinLock;\r
}\r
\r
BOOLEAN\r
EFIAPI\r
AcquireSpinLockOrFail (\r
- IN OUT SPIN_LOCK *SpinLock\r
+ IN OUT SPIN_LOCK *SpinLock\r
)\r
{\r
- SPIN_LOCK LockValue;\r
- VOID *Result;\r
- \r
+ SPIN_LOCK LockValue;\r
+ VOID *Result;\r
+\r
ASSERT (SpinLock != NULL);\r
\r
LockValue = *SpinLock;\r
\r
_ReadWriteBarrier ();\r
Result = InterlockedCompareExchangePointer (\r
- (VOID**)SpinLock,\r
- (VOID*)SPIN_LOCK_RELEASED,\r
- (VOID*)SPIN_LOCK_ACQUIRED\r
- );\r
+ (VOID **)SpinLock,\r
+ (VOID *)SPIN_LOCK_RELEASED,\r
+ (VOID *)SPIN_LOCK_ACQUIRED\r
+ );\r
\r
_ReadWriteBarrier ();\r
- return (BOOLEAN) (Result == (VOID*) SPIN_LOCK_RELEASED);\r
+ return (BOOLEAN)(Result == (VOID *)SPIN_LOCK_RELEASED);\r
}\r
\r
/**\r
SPIN_LOCK *\r
EFIAPI\r
ReleaseSpinLock (\r
- IN OUT SPIN_LOCK *SpinLock\r
+ IN OUT SPIN_LOCK *SpinLock\r
)\r
{\r
- SPIN_LOCK LockValue;\r
+ SPIN_LOCK LockValue;\r
\r
ASSERT (SpinLock != NULL);\r
\r
\r
Performs an atomic increment of the 32-bit unsigned integer specified by\r
Value and returns the incremented value. The increment operation must be\r
- performed using MP safe mechanisms. The state of the return value is not\r
- guaranteed to be MP safe.\r
+ performed using MP safe mechanisms.\r
\r
If Value is NULL, then ASSERT().\r
\r
UINT32\r
EFIAPI\r
InterlockedIncrement (\r
- IN volatile UINT32 *Value\r
+ IN volatile UINT32 *Value\r
)\r
{\r
ASSERT (Value != NULL);\r
\r
Performs an atomic decrement of the 32-bit unsigned integer specified by\r
Value and returns the decremented value. The decrement operation must be\r
- performed using MP safe mechanisms. The state of the return value is not\r
- guaranteed to be MP safe.\r
+ performed using MP safe mechanisms.\r
\r
If Value is NULL, then ASSERT().\r
\r
UINT32\r
EFIAPI\r
InterlockedDecrement (\r
- IN volatile UINT32 *Value\r
+ IN volatile UINT32 *Value\r
)\r
{\r
ASSERT (Value != NULL);\r
UINT16\r
EFIAPI\r
InterlockedCompareExchange16 (\r
- IN OUT volatile UINT16 *Value,\r
- IN UINT16 CompareValue,\r
- IN UINT16 ExchangeValue\r
+ IN OUT volatile UINT16 *Value,\r
+ IN UINT16 CompareValue,\r
+ IN UINT16 ExchangeValue\r
)\r
{\r
ASSERT (Value != NULL);\r
UINT32\r
EFIAPI\r
InterlockedCompareExchange32 (\r
- IN OUT volatile UINT32 *Value,\r
- IN UINT32 CompareValue,\r
- IN UINT32 ExchangeValue\r
+ IN OUT volatile UINT32 *Value,\r
+ IN UINT32 CompareValue,\r
+ IN UINT32 ExchangeValue\r
)\r
{\r
ASSERT (Value != NULL);\r
UINT64\r
EFIAPI\r
InterlockedCompareExchange64 (\r
- IN OUT volatile UINT64 *Value,\r
- IN UINT64 CompareValue,\r
- IN UINT64 ExchangeValue\r
+ IN OUT volatile UINT64 *Value,\r
+ IN UINT64 CompareValue,\r
+ IN UINT64 ExchangeValue\r
)\r
{\r
ASSERT (Value != NULL);\r
VOID *\r
EFIAPI\r
InterlockedCompareExchangePointer (\r
- IN OUT VOID * volatile *Value,\r
- IN VOID *CompareValue,\r
- IN VOID *ExchangeValue\r
+ IN OUT VOID *volatile *Value,\r
+ IN VOID *CompareValue,\r
+ IN VOID *ExchangeValue\r
)\r
{\r
UINT8 SizeOfValue;\r
\r
- SizeOfValue = (UINT8) sizeof (*Value);\r
+ SizeOfValue = (UINT8)sizeof (*Value);\r
\r
switch (SizeOfValue) {\r
case sizeof (UINT32):\r
- return (VOID*)(UINTN)InterlockedCompareExchange32 (\r
- (volatile UINT32*)Value,\r
- (UINT32)(UINTN)CompareValue,\r
- (UINT32)(UINTN)ExchangeValue\r
- );\r
+ return (VOID *)(UINTN)InterlockedCompareExchange32 (\r
+ (volatile UINT32 *)Value,\r
+ (UINT32)(UINTN)CompareValue,\r
+ (UINT32)(UINTN)ExchangeValue\r
+ );\r
case sizeof (UINT64):\r
- return (VOID*)(UINTN)InterlockedCompareExchange64 (\r
- (volatile UINT64*)Value,\r
- (UINT64)(UINTN)CompareValue,\r
- (UINT64)(UINTN)ExchangeValue\r
- );\r
+ return (VOID *)(UINTN)InterlockedCompareExchange64 (\r
+ (volatile UINT64 *)Value,\r
+ (UINT64)(UINTN)CompareValue,\r
+ (UINT64)(UINTN)ExchangeValue\r
+ );\r
default:\r
ASSERT (FALSE);\r
return NULL;\r