/*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: WaitMultiple.NT.cpp Date: 2022-5-13 Author: Reece ***/ #include #include "IO.hpp" #include "WaitMultiple.NT.hpp" #include "FS/Async.NT.hpp" namespace Aurora::IO { AUKN_SYM AuUInt32 WaitMultiple(const AuList> &files, AuUInt32 timeout) { AuList handles; AuUInt32 count {}; if (files.empty()) { return 0; } for (const auto &file : files) { AuTryInsert(handles, AuStaticPointerCast(file)->GetHandle()); } auto ret = WaitForMultipleObjectsEx(handles.size(), handles.data(), false, timeout ? timeout : INFINITE, TRUE); if (ret == WAIT_TIMEOUT || ret == WAIT_FAILED) { return 0; } for (auto &file : files) { count += AuStaticPointerCast(file)->Complete(); } return count; } AUKN_SYM AuList> WaitMultiple2(const AuList> &transactions, AuUInt32 timeoutMs) { AuList> retTransasctions; AuList handles; AuUInt32 count {}; if (transactions.empty()) { return {}; } AuDebug::AddMemoryCrunch(); AuTryReserve(retTransasctions, transactions.size()); for (const auto &file : transactions) { SysAssert(AuTryInsert(handles, AuStaticPointerCast(file)->GetHandle())); } AuDebug::DecMemoryCrunch(); auto ret = WaitForMultipleObjectsEx(handles.size(), handles.data(), false, timeoutMs ? timeoutMs : INFINITE, TRUE); if (ret == WAIT_TIMEOUT || ret == WAIT_FAILED) { return {}; } for (auto &file : transactions) { if (AuStaticPointerCast(file)->Complete()) { AuDebug::AddMemoryCrunch(); SysAssert(AuTryInsert(retTransasctions, file)); AuDebug::DecMemoryCrunch(); } } return retTransasctions; } AUKN_SYM void SendBatched() { } }