diff options
author | Fernando Sahmkow <fsahmkow27@gmail.com> | 2020-02-04 20:06:23 +0100 |
---|---|---|
committer | Fernando Sahmkow <fsahmkow27@gmail.com> | 2020-06-18 22:29:14 +0200 |
commit | bc266a9d98f38f6fd1006f1ca52bd57e6a7f37d3 (patch) | |
tree | bd18475a7b939fa4a9a23538b7e1359fb7f11792 /src/common/fiber.h | |
parent | Common: Implement a basic SpinLock class (diff) | |
download | yuzu-bc266a9d98f38f6fd1006f1ca52bd57e6a7f37d3.tar yuzu-bc266a9d98f38f6fd1006f1ca52bd57e6a7f37d3.tar.gz yuzu-bc266a9d98f38f6fd1006f1ca52bd57e6a7f37d3.tar.bz2 yuzu-bc266a9d98f38f6fd1006f1ca52bd57e6a7f37d3.tar.lz yuzu-bc266a9d98f38f6fd1006f1ca52bd57e6a7f37d3.tar.xz yuzu-bc266a9d98f38f6fd1006f1ca52bd57e6a7f37d3.tar.zst yuzu-bc266a9d98f38f6fd1006f1ca52bd57e6a7f37d3.zip |
Diffstat (limited to '')
-rw-r--r-- | src/common/fiber.h | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/common/fiber.h b/src/common/fiber.h new file mode 100644 index 000000000..ab44905cf --- /dev/null +++ b/src/common/fiber.h @@ -0,0 +1,55 @@ +// Copyright 2020 yuzu Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include <functional> +#include <memory> + +#include "common/common_types.h" +#include "common/spin_lock.h" + +namespace Common { + +class Fiber { +public: + Fiber(std::function<void(void*)>&& entry_point_func, void* start_parameter); + ~Fiber(); + + Fiber(const Fiber&) = delete; + Fiber& operator=(const Fiber&) = delete; + + Fiber(Fiber&&) = default; + Fiber& operator=(Fiber&&) = default; + + /// Yields control from Fiber 'from' to Fiber 'to' + /// Fiber 'from' must be the currently running fiber. + static void YieldTo(std::shared_ptr<Fiber> from, std::shared_ptr<Fiber> to); + static std::shared_ptr<Fiber> ThreadToFiber(); + + /// 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; + } + +private: + Fiber(); + + struct FiberImpl; + + SpinLock guard; + std::function<void(void*)> entry_point; + void* start_parameter; + std::shared_ptr<Fiber> previous_fiber; + std::unique_ptr<FiberImpl> impl; + bool is_thread_fiber{}; +}; + +} // namespace Common |