From a2b5865595cffd361a6de6ced30c3b2bc2b2e0a1 Mon Sep 17 00:00:00 2001 From: Michael Scire Date: Fri, 18 Oct 2019 20:31:15 -0700 Subject: [PATCH] strat: statically allocate additional threads --- include/stratosphere/os/os_thread.hpp | 54 +++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/include/stratosphere/os/os_thread.hpp b/include/stratosphere/os/os_thread.hpp index 3d2b7f3c..a866d66f 100644 --- a/include/stratosphere/os/os_thread.hpp +++ b/include/stratosphere/os/os_thread.hpp @@ -20,13 +20,61 @@ namespace sts::os { class Thread { + NON_COPYABLE(Thread); + NON_MOVEABLE(Thread); private: - ::Thread thr = {}; + ::Thread thr; public: - Thread() {} + constexpr Thread() : thr{} { /* ... */ } + + Result Initialize(ThreadFunc entry, void *arg, void *stack_mem, size_t stack_sz, int prio, int cpuid = -2) { + return threadCreate(&this->thr, entry, arg, stack_mem, stack_sz, prio, cpuid); + } Result Initialize(ThreadFunc entry, void *arg, size_t stack_sz, int prio, int cpuid = -2) { - return threadCreate(&this->thr, entry, arg, stack_sz, prio, cpuid); + return threadCreate(&this->thr, entry, arg, nullptr, stack_sz, prio, cpuid); + } + + Handle GetHandle() const { + return this->thr.handle; + } + + Result Start() { + return threadStart(&this->thr); + } + + Result Wait() { + return threadWaitForExit(&this->thr); + } + + Result Join() { + R_TRY(threadWaitForExit(&this->thr)); + R_TRY(threadClose(&this->thr)); + return ResultSuccess; + } + + Result CancelSynchronization() { + return svcCancelSynchronization(this->thr.handle); + } + }; + + template + class StaticThread { + NON_COPYABLE(StaticThread); + NON_MOVEABLE(StaticThread); + static_assert(util::IsAligned(StackSize, 0x1000), "StaticThread must have aligned resource size"); + private: + alignas(0x1000) u8 stack_mem[StackSize]; + ::Thread thr; + public: + constexpr StaticThread() : stack_mem{}, thr{} { /* ... */ } + + constexpr StaticThread(ThreadFunc entry, void *arg, int prio, int cpuid = -2) : StaticThread() { + R_ASSERT(this->Initialize(entry, arg, prio, cpuid)); + } + + Result Initialize(ThreadFunc entry, void *arg, int prio, int cpuid = -2) { + return threadCreate(&this->thr, entry, arg, this->stack_mem, StackSize, prio, cpuid); } Handle GetHandle() const {