diff options
author | Fernando Sahmkow <fsahmkow27@gmail.com> | 2020-02-05 19:13:16 +0100 |
---|---|---|
committer | Fernando Sahmkow <fsahmkow27@gmail.com> | 2020-06-18 22:29:15 +0200 |
commit | 8d0e3c542258cc50081af93aa85e0e3cbf8900c3 (patch) | |
tree | c63361e68b801183957ea9c614bad279aefc212c /src/common | |
parent | Common: Implement a basic Fiber class. (diff) | |
download | yuzu-8d0e3c542258cc50081af93aa85e0e3cbf8900c3.tar yuzu-8d0e3c542258cc50081af93aa85e0e3cbf8900c3.tar.gz yuzu-8d0e3c542258cc50081af93aa85e0e3cbf8900c3.tar.bz2 yuzu-8d0e3c542258cc50081af93aa85e0e3cbf8900c3.tar.lz yuzu-8d0e3c542258cc50081af93aa85e0e3cbf8900c3.tar.xz yuzu-8d0e3c542258cc50081af93aa85e0e3cbf8900c3.tar.zst yuzu-8d0e3c542258cc50081af93aa85e0e3cbf8900c3.zip |
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/fiber.cpp | 32 | ||||
-rw-r--r-- | src/common/fiber.h | 19 |
2 files changed, 32 insertions, 19 deletions
diff --git a/src/common/fiber.cpp b/src/common/fiber.cpp index eb59f1aa9..a2c0401c4 100644 --- a/src/common/fiber.cpp +++ b/src/common/fiber.cpp @@ -3,18 +3,21 @@ // Refer to the license.txt file included. #include "common/fiber.h" +#ifdef _MSC_VER +#include <windows.h> +#else +#include <boost/context/detail/fcontext.hpp> +#endif namespace Common { #ifdef _MSC_VER -#include <windows.h> struct Fiber::FiberImpl { LPVOID handle = nullptr; }; -void Fiber::_start([[maybe_unused]] void* parameter) { - guard.lock(); +void Fiber::start() { if (previous_fiber) { previous_fiber->guard.unlock(); previous_fiber = nullptr; @@ -22,10 +25,10 @@ void Fiber::_start([[maybe_unused]] void* parameter) { entry_point(start_parameter); } -static void __stdcall FiberStartFunc(LPVOID lpFiberParameter) +void __stdcall Fiber::FiberStartFunc(void* fiber_parameter) { - auto fiber = static_cast<Fiber *>(lpFiberParameter); - fiber->_start(nullptr); + auto fiber = static_cast<Fiber *>(fiber_parameter); + fiber->start(); } Fiber::Fiber(std::function<void(void*)>&& entry_point_func, void* start_parameter) @@ -74,30 +77,26 @@ std::shared_ptr<Fiber> Fiber::ThreadToFiber() { #else -#include <boost/context/detail/fcontext.hpp> - constexpr std::size_t default_stack_size = 1024 * 1024 * 4; // 4MB -struct Fiber::FiberImpl { - boost::context::detail::fcontext_t context; +struct alignas(64) Fiber::FiberImpl { std::array<u8, default_stack_size> stack; + boost::context::detail::fcontext_t context; }; -void Fiber::_start(void* parameter) { - guard.lock(); - boost::context::detail::transfer_t* transfer = static_cast<boost::context::detail::transfer_t*>(parameter); +void Fiber::start(boost::context::detail::transfer_t& transfer) { if (previous_fiber) { - previous_fiber->impl->context = transfer->fctx; + previous_fiber->impl->context = transfer.fctx; previous_fiber->guard.unlock(); previous_fiber = nullptr; } entry_point(start_parameter); } -static void FiberStartFunc(boost::context::detail::transfer_t transfer) +void Fiber::FiberStartFunc(boost::context::detail::transfer_t transfer) { auto fiber = static_cast<Fiber *>(transfer.data); - fiber->_start(&transfer); + fiber->start(transfer); } Fiber::Fiber(std::function<void(void*)>&& entry_point_func, void* start_parameter) @@ -139,6 +138,7 @@ void Fiber::YieldTo(std::shared_ptr<Fiber> from, std::shared_ptr<Fiber> to) { std::shared_ptr<Fiber> Fiber::ThreadToFiber() { std::shared_ptr<Fiber> fiber = std::shared_ptr<Fiber>{new Fiber()}; + fiber->guard.lock(); fiber->is_thread_fiber = true; return fiber; } diff --git a/src/common/fiber.h b/src/common/fiber.h index ab44905cf..812d6644a 100644 --- a/src/common/fiber.h +++ b/src/common/fiber.h @@ -10,6 +10,12 @@ #include "common/common_types.h" #include "common/spin_lock.h" +#ifndef _MSC_VER +namespace boost::context::detail { + struct transfer_t; +} +#endif + namespace Common { class Fiber { @@ -31,9 +37,6 @@ public: /// Only call from main thread's fiber void Exit(); - /// Used internally but required to be public, Shall not be used - void _start(void* parameter); - /// Changes the start parameter of the fiber. Has no effect if the fiber already started void SetStartParameter(void* new_parameter) { start_parameter = new_parameter; @@ -42,6 +45,16 @@ public: private: Fiber(); +#ifdef _MSC_VER + void start(); + static void FiberStartFunc(void* fiber_parameter); +#else + void start(boost::context::detail::transfer_t& transfer); + static void FiberStartFunc(boost::context::detail::transfer_t transfer); +#endif + + + struct FiberImpl; SpinLock guard; |