mirror of
https://github.com/reactos/reactos.git
synced 2026-05-23 15:50:29 +08:00
[NDK][NTDLL][KERNEL32] Improve tick count to ms calculation
Use an inline function to do the calculation (optimized for 32/64 bit).
This commit is contained in:
@@ -1225,10 +1225,8 @@ RtlGetTickCount(VOID)
|
||||
|
||||
TickCount = KiReadSystemTime(&SharedUserData->TickCount);
|
||||
|
||||
return (ULONG)((UInt32x32To64(TickCount.LowPart,
|
||||
SharedUserData->TickCountMultiplier) >> 24) +
|
||||
UInt32x32To64((TickCount.HighPart << 8) & 0xFFFFFFFF,
|
||||
SharedUserData->TickCountMultiplier));
|
||||
/* Convert to milliseconds */
|
||||
return KiTickCountToMs(TickCount);
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
||||
@@ -426,11 +426,8 @@ GetTickCount(VOID)
|
||||
|
||||
TickCount = KiReadSystemTime(&SharedUserData->TickCount);
|
||||
|
||||
return (ULONG)((UInt32x32To64(TickCount.LowPart,
|
||||
SharedUserData->TickCountMultiplier) >> 24) +
|
||||
UInt32x32To64((TickCount.HighPart << 8) & 0xFFFFFFFF,
|
||||
SharedUserData->TickCountMultiplier));
|
||||
|
||||
/* Convert to milliseconds */
|
||||
return (DWORD)KiTickCountToMs(TickCount);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -12,7 +12,6 @@ GetTickCount64(VOID)
|
||||
|
||||
TickCount = KiReadSystemTime(&SharedUserData->TickCount);
|
||||
|
||||
ULONG TickCountMultiplier = SharedUserData->TickCountMultiplier;
|
||||
return (UInt32x32To64(TickCount.LowPart, TickCountMultiplier) >> 24) +
|
||||
(UInt32x32To64(TickCount.HighPart, TickCountMultiplier) << 8);
|
||||
/* Convert to milliseconds */
|
||||
return KiTickCountToMs(TickCount);
|
||||
}
|
||||
|
||||
@@ -447,6 +447,22 @@ KiWriteSystemTime(
|
||||
}
|
||||
|
||||
#endif // !NTOS_MODE_USER
|
||||
|
||||
FORCEINLINE
|
||||
ULONG64
|
||||
KiTickCountToMs(_In_ LARGE_INTEGER TickCount)
|
||||
{
|
||||
#ifdef _WIN64
|
||||
/* Native math is optimal on 64 bit */
|
||||
return (TickCount.QuadPart * SharedUserData->TickCountMultiplier) >> 24;
|
||||
#else
|
||||
/* This is optimal on 32 bit (overflows after ~20,000 years) */
|
||||
ULONG Multiplier = SharedUserData->TickCountMultiplier;
|
||||
return (UInt32x32To64(TickCount.LowPart, Multiplier) >> 24) +
|
||||
UInt32x32To64(TickCount.HighPart << 8, Multiplier);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif // !NONAMELESSUNION
|
||||
|
||||
//
|
||||
|
||||
@@ -287,16 +287,13 @@ ULONGLONG
|
||||
APIENTRY
|
||||
EngGetTickCount(VOID)
|
||||
{
|
||||
ULONG Multiplier;
|
||||
LARGE_INTEGER TickCount;
|
||||
|
||||
/* Get the multiplier and current tick count */
|
||||
/* Get the current tick count */
|
||||
KeQueryTickCount(&TickCount);
|
||||
Multiplier = SharedUserData->TickCountMultiplier;
|
||||
|
||||
/* Convert to milliseconds and return */
|
||||
return (Int64ShrlMod32(UInt32x32To64(Multiplier, TickCount.LowPart), 24) +
|
||||
(Multiplier * (TickCount.HighPart << 8)));
|
||||
/* Convert to milliseconds */
|
||||
return KiTickCountToMs(TickCount);
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
||||
Reference in New Issue
Block a user