IN OUT SPIN_LOCK *SpinLock\r
)\r
{\r
- UINT64 Tick;\r
- UINT64 Start, End;\r
- UINT64 Timeout;\r
+ UINT64 Current;\r
+ UINT64 Previous;\r
+ UINT64 Total;\r
+ UINT64 Start;\r
+ UINT64 End;\r
+ UINT64 Timeout;\r
+ INT64 Cycle;\r
+ INT64 Delta;\r
\r
- Tick = 0;\r
- Start = 0;\r
- End = 0;\r
if (PcdGet32 (PcdSpinLockTimeout) > 0) {\r
- Tick = GetPerformanceCounter ();\r
+ //\r
+ // Get the current timer value\r
+ //\r
+ Current = GetPerformanceCounter();\r
+\r
+ //\r
+ // Initialize local variables\r
+ //\r
+ Start = 0;\r
+ End = 0;\r
+ Total = 0;\r
+\r
+ //\r
+ // Retrieve the performance counter properties and compute the number of performance\r
+ // counter ticks required to reach the timeout\r
+ //\r
Timeout = DivU64x32 (\r
MultU64x32 (\r
GetPerformanceCounterProperties (&Start, &End),\r
),\r
1000000\r
);\r
- if (Start < End) {\r
- Tick += Timeout;\r
- } else {\r
- Tick -= Timeout;\r
+ Cycle = End - Start;\r
+ if (Cycle < 0) {\r
+ Cycle = -Cycle;\r
+ }\r
+ Cycle++;\r
+\r
+ while (!AcquireSpinLockOrFail (SpinLock)) {\r
+ CpuPause ();\r
+ Previous = Current;\r
+ Current = GetPerformanceCounter();\r
+ Delta = (INT64) (Current - Previous);\r
+ if (Start > End) {\r
+ Delta = -Delta;\r
+ }\r
+ if (Delta < 0) {\r
+ Delta += Cycle;\r
+ }\r
+ Total += Delta;\r
+ ASSERT (Total < Timeout);\r
+ }\r
+ } else {\r
+ while (!AcquireSpinLockOrFail (SpinLock)) {\r
+ CpuPause ();\r
}\r
- }\r
-\r
- while (!AcquireSpinLockOrFail (SpinLock)) {\r
- CpuPause ();\r
- ASSERT ((Start < End) ^ (Tick <= GetPerformanceCounter ()));\r
}\r
return SpinLock;\r
}\r
IN OUT SPIN_LOCK *SpinLock\r
)\r
{\r
- UINT64 Tick;\r
- UINT64 Start, End;\r
- UINT64 Timeout;\r
+ UINT64 Current;\r
+ UINT64 Previous;\r
+ UINT64 Total;\r
+ UINT64 Start;\r
+ UINT64 End;\r
+ UINT64 Timeout;\r
+ INT64 Cycle;\r
+ INT64 Delta;\r
\r
- Tick = 0;\r
- Start = 0;\r
- End = 0;\r
if (PcdGet32 (PcdSpinLockTimeout) > 0) {\r
- Tick = GetPerformanceCounter ();\r
+ //\r
+ // Get the current timer value\r
+ //\r
+ Current = GetPerformanceCounter();\r
+\r
+ //\r
+ // Initialize local variables\r
+ //\r
+ Start = 0;\r
+ End = 0;\r
+ Total = 0;\r
+\r
+ //\r
+ // Retrieve the performance counter properties and compute the number of performance\r
+ // counter ticks required to reach the timeout\r
+ //\r
Timeout = DivU64x32 (\r
MultU64x32 (\r
GetPerformanceCounterProperties (&Start, &End),\r
),\r
1000000\r
);\r
- if (Start < End) {\r
- Tick += Timeout;\r
- } else {\r
- Tick -= Timeout;\r
+ Cycle = End - Start;\r
+ if (Cycle < 0) {\r
+ Cycle = -Cycle;\r
+ }\r
+ Cycle++;\r
+\r
+ while (!AcquireSpinLockOrFail (SpinLock)) {\r
+ CpuPause ();\r
+ Previous = Current;\r
+ Current = GetPerformanceCounter();\r
+ Delta = (INT64) (Current - Previous);\r
+ if (Start > End) {\r
+ Delta = -Delta;\r
+ }\r
+ if (Delta < 0) {\r
+ Delta += Cycle;\r
+ }\r
+ Total += Delta;\r
+ ASSERT (Total < Timeout);\r
+ }\r
+ } else {\r
+ while (!AcquireSpinLockOrFail (SpinLock)) {\r
+ CpuPause ();\r
}\r
- }\r
-\r
- while (!AcquireSpinLockOrFail (SpinLock)) {\r
- CpuPause ();\r
- ASSERT ((Start < End) ^ (Tick <= GetPerformanceCounter ()));\r
}\r
return SpinLock;\r
}\r
IN OUT SPIN_LOCK *SpinLock\r
)\r
{\r
- UINT64 Tick;\r
- UINT64 Start, End;\r
- UINT64 Timeout;\r
+ UINT64 Current;\r
+ UINT64 Previous;\r
+ UINT64 Total;\r
+ UINT64 Start;\r
+ UINT64 End;\r
+ UINT64 Timeout;\r
+ INT64 Cycle;\r
+ INT64 Delta;\r
\r
- Tick = 0;\r
- Start = 0;\r
- End = 0;\r
if (PcdGet32 (PcdSpinLockTimeout) > 0) {\r
- Tick = GetPerformanceCounter ();\r
+ //\r
+ // Get the current timer value\r
+ //\r
+ Current = GetPerformanceCounter();\r
+\r
+ //\r
+ // Initialize local variables\r
+ //\r
+ Start = 0;\r
+ End = 0;\r
+ Total = 0;\r
+\r
+ //\r
+ // Retrieve the performance counter properties and compute the number of performance\r
+ // counter ticks required to reach the timeout\r
+ //\r
Timeout = DivU64x32 (\r
MultU64x32 (\r
GetPerformanceCounterProperties (&Start, &End),\r
),\r
1000000\r
);\r
- if (Start < End) {\r
- Tick += Timeout;\r
- } else {\r
- Tick -= Timeout;\r
+ Cycle = End - Start;\r
+ if (Cycle < 0) {\r
+ Cycle = -Cycle;\r
+ }\r
+ Cycle++;\r
+\r
+ while (!AcquireSpinLockOrFail (SpinLock)) {\r
+ CpuPause ();\r
+ Previous = Current;\r
+ Current = GetPerformanceCounter();\r
+ Delta = (INT64) (Current - Previous);\r
+ if (Start > End) {\r
+ Delta = -Delta;\r
+ }\r
+ if (Delta < 0) {\r
+ Delta += Cycle;\r
+ }\r
+ Total += Delta;\r
+ ASSERT (Total < Timeout);\r
+ }\r
+ } else {\r
+ while (!AcquireSpinLockOrFail (SpinLock)) {\r
+ CpuPause ();\r
}\r
- }\r
-\r
- while (!AcquireSpinLockOrFail (SpinLock)) {\r
- CpuPause ();\r
- ASSERT ((Start < End) ^ (Tick <= GetPerformanceCounter ()));\r
}\r
return SpinLock;\r
}\r