diff --git a/Include/Aurora/Threading/Threads/IAuroraThread.hpp b/Include/Aurora/Threading/Threads/IAuroraThread.hpp index 3c6adce6..9df583a1 100644 --- a/Include/Aurora/Threading/Threads/IAuroraThread.hpp +++ b/Include/Aurora/Threading/Threads/IAuroraThread.hpp @@ -35,10 +35,6 @@ namespace Aurora::Threading::Threads class IAuroraThread { public: - // TODO: consider detach support. - // The problem is, if the aurora runtime transfers ownership of an IAuroraThread to you, you have to leak it - // or you have to be forced to use the very comfy dtor mechanic. We need a detach function to overload this - // release-is-always-terminate assumption. virtual bool Run() = 0; virtual void Exit() = 0; @@ -60,11 +56,19 @@ namespace Aurora::Threading::Threads virtual AuSPtr GetTlsView() = 0; - virtual void ExecuteInDeadThread(std::function callback) = 0; virtual AuSPtr AsWaitable() = 0; virtual AuSPtr AsLoopSource() = 0; virtual AuSPtr GetShutdownSignalWaitable() = 0; virtual AuSPtr GetShutdownSignalLS() = 0; + + // TODO: consider detach support. + // The problem is, if the aurora runtime transfers ownership of an IAuroraThread to you, you have to leak it + // or you have to be forced to use the very comfy dtor mechanic. We need a detach function to overload this + // release-is-always-terminate assumption. + // UPDATE: DONE + virtual void Detach() = 0; + + virtual void ExecuteInDeadThread(std::function callback) = 0; }; } \ No newline at end of file diff --git a/Source/Threading/Threads/OSThread.cpp b/Source/Threading/Threads/OSThread.cpp index 14646cd4..131bf82a 100644 --- a/Source/Threading/Threads/OSThread.cpp +++ b/Source/Threading/Threads/OSThread.cpp @@ -60,8 +60,11 @@ namespace Aurora::Threading::Threads { if (contextUsed_) { - Exit(); - WaitFor(terminated_.get()); + if (!detached_) + { + Exit(); + WaitFor(terminated_.get()); + } } terminated_.reset(); @@ -95,6 +98,11 @@ namespace Aurora::Threading::Threads AuTryInsert(threadFeatures_, feature); } + void OSThread::Detach() + { + detached_ = true; + } + AuSPtr OSThread::AsWaitable() { return terminated_; @@ -338,7 +346,7 @@ namespace Aurora::Threading::Threads void OSThread::_ThreadEP() { - Attach(); + OSAttach(); task_(); Exit(true); } @@ -355,17 +363,17 @@ namespace Aurora::Threading::Threads if (old) { - static_cast(old)->Deattach(); + static_cast(old)->OSDeatach(); } - this->Attach(); + this->OSAttach(); callback(); if (old) { HandleRegister(old); - static_cast(old)->Attach(); + static_cast(old)->OSDeatach(); } else [[unlikely]] { @@ -420,7 +428,7 @@ namespace Aurora::Threading::Threads } - void OSThread::Attach() + void OSThread::OSAttach() { HandleRegister(this); #if defined(AURORA_IS_LINUX_DERIVED) @@ -546,7 +554,7 @@ namespace Aurora::Threading::Threads #endif } - void OSThread::Deattach() + void OSThread::OSDeatach() { } diff --git a/Source/Threading/Threads/OSThread.hpp b/Source/Threading/Threads/OSThread.hpp index 79627eff..39cd40fb 100644 --- a/Source/Threading/Threads/OSThread.hpp +++ b/Source/Threading/Threads/OSThread.hpp @@ -37,6 +37,8 @@ namespace Aurora::Threading::Threads void AddLastHopeTlsHook(const AuSPtr &feature) override; + void Detach() override; + void _ThreadEP(); AuSPtr AsLoopSource() override; AuSPtr GetShutdownSignalWaitable() override; @@ -48,8 +50,8 @@ namespace Aurora::Threading::Threads void UpdatePrio(EThreadPrio prio); void UpdateAffinity(AuUInt32 mask); void UpdateName(); - void Attach(); - void Deattach(); + void OSAttach(); + void OSDeatach(); bool InternalKill(bool locked); void TeminateOSContext(bool calledFromThis); void FreeOSContext(); @@ -85,6 +87,7 @@ namespace Aurora::Threading::Threads #endif AuUInt64 unixThreadId_ = 0; + bool detached_ {}; }; } \ No newline at end of file