diff --git a/Include/Aurora/IO/IAsyncTransaction.hpp b/Include/Aurora/IO/IAsyncTransaction.hpp index c647a0a9..1a29ee1e 100644 --- a/Include/Aurora/IO/IAsyncTransaction.hpp +++ b/Include/Aurora/IO/IAsyncTransaction.hpp @@ -37,6 +37,12 @@ namespace Aurora::IO * @return */ virtual bool Failed() = 0; + + /** + * @brief non-blocking is-signaled (...and dispatched via ::Complete() or other IO yield) + * @return + */ + virtual bool HasCompleted() = 0; /** * @brief diff --git a/Source/IO/FS/Async.Linux.cpp b/Source/IO/FS/Async.Linux.cpp index 3f77122a..3191dd5f 100644 --- a/Source/IO/FS/Async.Linux.cpp +++ b/Source/IO/FS/Async.Linux.cpp @@ -439,6 +439,11 @@ namespace Aurora::IO::FS return false; } + bool LinuxAsyncFileTransaction::HasCompleted() + { + return this->bTxFinished_; + } + bool LinuxAsyncFileTransaction::Failed() { return this->hasError_; diff --git a/Source/IO/FS/Async.Linux.hpp b/Source/IO/FS/Async.Linux.hpp index 332baed5..c3a69451 100644 --- a/Source/IO/FS/Async.Linux.hpp +++ b/Source/IO/FS/Async.Linux.hpp @@ -61,10 +61,13 @@ namespace Aurora::IO::FS bool StartRead(AuUInt64 offset, const AuSPtr &memoryView) override; bool StartWrite(AuUInt64 offset, const AuSPtr &memoryView) override; + bool Complete() override; + bool Failed() override; AuUInt GetOSErrorCode() override; - bool Complete() override; + bool HasCompleted() override; + AuUInt32 GetLastPacketLength() override; void SetCallback(const AuSPtr &sub) override; diff --git a/Source/IO/FS/Async.NT.cpp b/Source/IO/FS/Async.NT.cpp index 3856711d..b1075184 100644 --- a/Source/IO/FS/Async.NT.cpp +++ b/Source/IO/FS/Async.NT.cpp @@ -539,6 +539,12 @@ namespace Aurora::IO::FS return CompleteEx(false); } + bool NtAsyncFileTransaction::HasCompleted() + { + return bool(this->dwLastBytes) || + this->bHasFailed; + } + AuUInt32 NtAsyncFileTransaction::GetLastPacketLength() { return this->dwLastBytes; diff --git a/Source/IO/FS/Async.NT.hpp b/Source/IO/FS/Async.NT.hpp index 6fea4bec..f8f88111 100644 --- a/Source/IO/FS/Async.NT.hpp +++ b/Source/IO/FS/Async.NT.hpp @@ -43,6 +43,8 @@ namespace Aurora::IO::FS bool isIrredeemable_ {}; + bool HasCompleted() override; + bool Complete() override; bool CompleteEx(AuUInt completeRoutine, bool bForce = false); diff --git a/Source/IO/Net/AuNetStream.Linux.cpp b/Source/IO/Net/AuNetStream.Linux.cpp index f740c8da..a553e637 100644 --- a/Source/IO/Net/AuNetStream.Linux.cpp +++ b/Source/IO/Net/AuNetStream.Linux.cpp @@ -226,6 +226,12 @@ namespace Aurora::IO::Net return this->bHasFailed; } + bool LinuxAsyncNetworkTransaction::HasCompleted() + { + return this->bHasFailed || + this->dwLastBytes; + } + AuUInt LinuxAsyncNetworkTransaction::GetOSErrorCode() { return this->dwOsErrorCode; diff --git a/Source/IO/Net/AuNetStream.Linux.hpp b/Source/IO/Net/AuNetStream.Linux.hpp index ca49bca5..1f0278a6 100644 --- a/Source/IO/Net/AuNetStream.Linux.hpp +++ b/Source/IO/Net/AuNetStream.Linux.hpp @@ -33,6 +33,8 @@ namespace Aurora::IO::Net bool Failed() override; AuUInt GetOSErrorCode() override; + bool HasCompleted() override; + AuUInt32 GetLastPacketLength() override; void SetCallback(const AuSPtr &sub) override; diff --git a/Source/IO/Net/AuNetStream.NT.cpp b/Source/IO/Net/AuNetStream.NT.cpp index d6765d76..a18f5db3 100644 --- a/Source/IO/Net/AuNetStream.NT.cpp +++ b/Source/IO/Net/AuNetStream.NT.cpp @@ -362,6 +362,12 @@ namespace Aurora::IO::Net this->dwOsErrorCode != ERROR_HANDLE_EOF; } + bool NtAsyncNetworkTransaction::HasCompleted() + { + return this->bHasFailed || + this->dwLastBytes; + } + AuUInt NtAsyncNetworkTransaction::GetOSErrorCode() { return this->dwOsErrorCode; diff --git a/Source/IO/Net/AuNetStream.NT.hpp b/Source/IO/Net/AuNetStream.NT.hpp index 9b0950b1..1b3b5269 100644 --- a/Source/IO/Net/AuNetStream.NT.hpp +++ b/Source/IO/Net/AuNetStream.NT.hpp @@ -24,14 +24,16 @@ namespace Aurora::IO::Net bool StartRead(AuUInt64 offset, const AuSPtr &memoryView) override; bool StartWrite(AuUInt64 offset, const AuSPtr &memoryView) override; - bool Complete() override; - bool CompleteEx(AuUInt completeRoutine, bool bForce = false); + bool Complete() override; + bool Failed() override; bool HasErrorCode(); AuUInt GetOSErrorCode() override; + bool HasCompleted() override; + AuUInt32 GetLastPacketLength() override; void SetCallback(const AuSPtr &sub) override;