/*** Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: WaitSingle.NT.cpp Date: 2021-10-1 Author: Reece ***/ #include #include "WaitSingle.hpp" namespace Aurora::Loop { bool WaitSingleGeneric::WaitForAtleastOne(AuUInt32 timeout, const AuList &handles, AuUInt &one) { if (handles.empty()) { return {}; } if (handles.size() == 1) { one = 0; DWORD ret; do { ret = WaitForSingleObjectEx(reinterpret_cast(handles.at(0)), timeout, true); } while (ret == WAIT_IO_COMPLETION); return ret == WAIT_OBJECT_0; } else { AuList ntHandles; ntHandles.reserve(handles.size()); for (const auto &handle : handles) { if (!AuTryInsert(ntHandles, reinterpret_cast(handle))) { return false; } } auto idx = WaitForMultipleObjectsEx(ntHandles.size(), ntHandles.data(), false, timeout, true); if (idx < WAIT_OBJECT_0) { return false; } one = handles[idx]; return true; } } bool WaitSingleGeneric::WaitForOne(AuUInt32 timeout, AuUInt handle) { DWORD ret; do { ret = WaitForSingleObjectEx(reinterpret_cast(handle), timeout, true); } while (ret == WAIT_IO_COMPLETION); return ret == WAIT_OBJECT_0; } void WaitSingleGeneric::OnPresleep() { } void WaitSingleGeneric::OnFinishSleep() { } ELoopSource WaitSingleGeneric::GetType() { return ELoopSource::eSourceInternalReserved1; } }