/*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: IOSleep.NT.hpp Date: 2022-5-13 Author: Reece ***/ #include #include "IO.hpp" #include "IOSleep.NT.hpp" namespace Aurora::IO { AUKN_SYM bool WaitFor(AuUInt32 milliseconds, bool waitEntireFrame) { bool bHit {}; AuUInt32 targetTime = milliseconds ? AuTime::CurrentClockNS() + AuNSToMS(milliseconds) : 0; if (!milliseconds) { waitEntireFrame = false; } while (true) { AuUInt32 sleep; if (targetTime) { auto now = AuTime::CurrentClockNS(); if (now >= targetTime) { break; } sleep = AuNSToMS(now - targetTime); } else { sleep = INFINITE; } if (SleepEx(sleep, true) != WAIT_IO_COMPLETION) { continue; } while (SleepEx(0, true) == WAIT_IO_COMPLETION) ; bHit = true; if (!waitEntireFrame) { break; } } return bHit; } AUKN_SYM bool IOYield() { return SleepEx(0, true) == WAIT_IO_COMPLETION; } }