summaryrefslogtreecommitdiffstats
path: root/src/common/fiber.h
diff options
context:
space:
mode:
authorFernando Sahmkow <fsahmkow27@gmail.com>2020-02-04 20:06:23 +0100
committerFernando Sahmkow <fsahmkow27@gmail.com>2020-06-18 22:29:14 +0200
commitbc266a9d98f38f6fd1006f1ca52bd57e6a7f37d3 (patch)
treebd18475a7b939fa4a9a23538b7e1359fb7f11792 /src/common/fiber.h
parentCommon: Implement a basic SpinLock class (diff)
downloadyuzu-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 'src/common/fiber.h')
-rw-r--r--src/common/fiber.h55
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