mirror of
https://github.com/libsdl-org/SDL.git
synced 2026-06-05 22:30:29 +00:00
use NtDelayExecution for SDL_SYS_DelayNS
This commit is contained in:
parent
98bed62259
commit
4f4d465104
1 changed files with 38 additions and 0 deletions
|
|
@ -103,6 +103,42 @@ Uint64 SDL_GetPerformanceFrequency(void)
|
|||
return (Uint64)frequency.QuadPart;
|
||||
}
|
||||
|
||||
#ifdef SDL_TIMER_WINDOWS_USE_NTDELAYEXECUTION
|
||||
|
||||
typedef LONG (NTAPI *NtDelayExecution_t)(BOOLEAN Alertable, PLARGE_INTEGER DelayInterval);
|
||||
static NtDelayExecution_t pNtDelayExecution;
|
||||
|
||||
static void SDL_NtDelayExecution(BOOLEAN Alertable, PLARGE_INTEGER DelayInterval)
|
||||
{
|
||||
if (!pNtDelayExecution) {
|
||||
static bool initialized;
|
||||
|
||||
if (!initialized) {
|
||||
HMODULE module = GetModuleHandle(TEXT("ntdll.dll"));
|
||||
if (module) {
|
||||
pNtDelayExecution = (NtDelayExecution_t)GetProcAddress(module, "NtDelayExecution");
|
||||
}
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
if (!pNtDelayExecution) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
pNtDelayExecution(Alertable, DelayInterval);
|
||||
}
|
||||
|
||||
void SDL_SYS_DelayNS(Uint64 ns)
|
||||
{
|
||||
Sint64 tick = ns;
|
||||
tick /= 100;
|
||||
tick *= -1;
|
||||
SDL_NtDelayExecution(0, (PLARGE_INTEGER)&tick);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void SDL_SYS_DelayNS(Uint64 ns)
|
||||
{
|
||||
HANDLE timer = SDL_GetWaitableTimer();
|
||||
|
|
@ -130,4 +166,6 @@ void SDL_SYS_DelayNS(Uint64 ns)
|
|||
Sleep(delay);
|
||||
}
|
||||
|
||||
#endif // SDL_TIMER_WINDOWS_USE_NTDELAYEXECUTION
|
||||
|
||||
#endif // SDL_TIMER_WINDOWS
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue