diff --git a/Include/Aurora/IO/Loop/Loop.hpp b/Include/Aurora/IO/Loop/Loop.hpp index cb04f6f7..cf7dbf6c 100644 --- a/Include/Aurora/IO/Loop/Loop.hpp +++ b/Include/Aurora/IO/Loop/Loop.hpp @@ -58,9 +58,6 @@ namespace Aurora::IO::Loop virtual void *GetLastSignalInfo() = 0; }; - AUKN_SYM AuSPtr NewLSCondVar(const AuSPtr &primitive); - AUKN_SYM AuSPtr NewLSCondVar(const AuSPtr &source); - AUKN_SYM AuSPtr NewLSTimer(AuUInt64 absStartTimeMs /*CurrentClockMS()*/, AuUInt32 reschedStepMsOrZero = 0, AuUInt32 maxIterationsOrZero = 0, bool bSingleshot = false /*cannot be changed*/); AUKN_SYM AuSPtr NewLSMutex(); AUKN_SYM AuSPtr NewLSEvent(bool triggerd = false, bool atomicRelease = true, bool permitMultipleTriggers = false); @@ -71,7 +68,8 @@ namespace Aurora::IO::Loop AUKN_SYM AuSPtr NewStdIn(); AUKN_SYM AuSPtr NewLSWin32Source(bool dispatchMessages); AUKN_SYM AuSPtr NewLSAppleSource(); - + AUKN_SYM AuSPtr NewLSIOHandle(const AuSPtr &pHandle); + #if defined(X_PROTOCOL) static AuSPtr NewLSX11(Display *display) { diff --git a/Source/IO/IPC/AuIPCPipe.NT.cpp b/Source/IO/IPC/AuIPCPipe.NT.cpp index bb2e23c9..505e1cf6 100644 --- a/Source/IO/IPC/AuIPCPipe.NT.cpp +++ b/Source/IO/IPC/AuIPCPipe.NT.cpp @@ -99,6 +99,7 @@ namespace Aurora::IO::IPC this->fsHandle_->InitFromMove((AuUInt)this->GetPipeHandle()); AuStaticCast(this->fsHandle_)->bIsAsync = true; + AuStaticCast(this->fsHandle_)->pIPCPipe = this; this->fsStream_->Init(this->fsHandle_); @@ -171,8 +172,7 @@ namespace Aurora::IO::IPC AuSPtr IPCPipeImpl::AsReadChannelHasData() { - // TODO (Hack): we should at least make a shared timer - return AuUnsafeRaiiToShared(this); + return this->SharedFromThis(); } AuSPtr IPCPipeImpl::NewAsyncTransaction() diff --git a/Source/IO/Loop/LSCondition.cpp b/Source/IO/Loop/LSCondition.cpp deleted file mode 100644 index 35cf3c22..00000000 --- a/Source/IO/Loop/LSCondition.cpp +++ /dev/null @@ -1,22 +0,0 @@ -/*** - Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved. - - File: LSCondition.cpp - Date: 2021-10-1 - Author: Reece -***/ -#include -#include "LSCondition.hpp" - -namespace Aurora::IO::Loop -{ - AUKN_SYM AuSPtr NewLSCondVar(const AuSPtr &primitive) - { - return {}; - } - - AUKN_SYM AuSPtr NewLSCondVar(const AuSPtr &source) - { - return {}; - } -} \ No newline at end of file diff --git a/Source/IO/Loop/LSCondition.hpp b/Source/IO/Loop/LSCondition.hpp deleted file mode 100644 index 36c16702..00000000 --- a/Source/IO/Loop/LSCondition.hpp +++ /dev/null @@ -1,13 +0,0 @@ -/*** - Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved. - - File: LSCondition.hpp - Date: 2021-10-1 - Author: Reece -***/ -#pragma once - -namespace Aurora::IO::Loop -{ - -} \ No newline at end of file diff --git a/Source/IO/Loop/LSIOHandle.cpp b/Source/IO/Loop/LSIOHandle.cpp new file mode 100644 index 00000000..bf5debce --- /dev/null +++ b/Source/IO/Loop/LSIOHandle.cpp @@ -0,0 +1,96 @@ +/*** + Copyright (C) 2023 J Reece Wilson (a/k/a "Reece"). All rights reserved. + + File: LSIOHandle.cpp + Date: 2023-9-16 + Author: Reece +***/ +#include +#include "Loop.hpp" +#include "LSIOHandle.hpp" +#if defined(AURORA_IS_MODERNNT_DERIVED) + #include + #include +#endif + +namespace Aurora::IO::Loop +{ + LSIOHandle::LSIOHandle() + { } + + LSIOHandle::LSIOHandle(const AuSPtr &pHandle) : pHandle(pHandle) + { } + + bool LSIOHandle::OnTrigger(AuUInt handle) + { + return true; + } + + const AuList &LSIOHandle::GetHandles() + { + static AuList kDummyArray; + return kDummyArray; + } + +#if defined(AURORA_IS_POSIX_DERIVED) + + const AuList &LSIOHandle::GetWriteHandles() + { + static AuList kDummyArray; + return kDummyArray; + } + + AuUInt LSIOHandle::GetWriteHandle() + { + return this->pHandle->GetOSWriteHandleSafe().ValueOr(-1); + } + +#endif + + AuUInt LSIOHandle::GetHandle() + { + return this->pHandle->GetOSReadHandleSafe().ValueOr(-1); + } + + bool LSIOHandle::Singular() + { + return true; + } + + ELoopSource LSIOHandle::GetType() + { + return ELoopSource::eSourceHandle; + } + + AUKN_SYM AuSPtr NewLSIOHandle(const AuSPtr &pHandle) + { + if (!pHandle) + { + SysPushErrorArg(); + return {}; + } + + #if defined(AURORA_IS_MODERNNT_DERIVED) + if (pHandle->IsPipe()) + { + if (auto pIPCPipe = AuStaticCast(pHandle)->pIPCPipe) + { + return pIPCPipe->AsReadChannelHasData(); + } + else + { + SysPushErrorResourceInvalid("Use the loop source provided by the IPC pipe class."); + return {}; + } + } + + if (pHandle->IsTTY()) + { + SysPushErrorResourceInvalid("Use the loop source provided by AuConsole::StdInBufferLoopSource() or AuLoop::NewStdIn(). If this is a PTY, you're out of luck."); + return {}; + } + #endif + + return AuMakeShared(pHandle); + } +} \ No newline at end of file diff --git a/Source/IO/Loop/LSIOHandle.hpp b/Source/IO/Loop/LSIOHandle.hpp new file mode 100644 index 00000000..4216bdff --- /dev/null +++ b/Source/IO/Loop/LSIOHandle.hpp @@ -0,0 +1,39 @@ +/*** + Copyright (C) 2023 J Reece Wilson (a/k/a "Reece"). All rights reserved. + + File: LSIOHandle.hpp + Date: 2023-9-16 + Author: Reece +***/ +#pragma once + +#include "WaitSingle.hpp" + +namespace Aurora::IO::Loop +{ +#if defined(AURORA_IS_MODERNNT_DERIVED) + static constexpr auto kInvalidHandle = (AuUInt)INVALID_HANDLE_VALUE; +#else + static constexpr auto kInvalidHandle = -1; +#endif + + struct LSIOHandle : virtual WaitSingleGeneric + { + LSIOHandle(); + LSIOHandle(const AuSPtr &pHandle); + + virtual bool OnTrigger(AuUInt handle) override; + virtual const AuList &GetHandles() override; + virtual AuUInt GetHandle() override; + virtual bool Singular() override; + + #if defined(AURORA_IS_POSIX_DERIVED) + virtual const AuList &GetWriteHandles() override; + virtual AuUInt GetWriteHandle() override; + #endif + virtual ELoopSource GetType() override; + + protected: + AuSPtr pHandle; + }; +} \ No newline at end of file