summaryrefslogtreecommitdiffstats
path: root/src/core/core_cpu.h
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2018-05-03 03:26:14 +0200
committerbunnei <bunneidev@gmail.com>2018-05-11 01:34:46 +0200
commit9776ff91797423a9cf19571faafe4648fb5a1d1d (patch)
tree46a7c94c53faee26b805f6290a09c45d33f7bf11 /src/core/core_cpu.h
parentcore: Move common CPU core things to its own class. (diff)
downloadyuzu-9776ff91797423a9cf19571faafe4648fb5a1d1d.tar
yuzu-9776ff91797423a9cf19571faafe4648fb5a1d1d.tar.gz
yuzu-9776ff91797423a9cf19571faafe4648fb5a1d1d.tar.bz2
yuzu-9776ff91797423a9cf19571faafe4648fb5a1d1d.tar.lz
yuzu-9776ff91797423a9cf19571faafe4648fb5a1d1d.tar.xz
yuzu-9776ff91797423a9cf19571faafe4648fb5a1d1d.tar.zst
yuzu-9776ff91797423a9cf19571faafe4648fb5a1d1d.zip
Diffstat (limited to 'src/core/core_cpu.h')
-rw-r--r--src/core/core_cpu.h33
1 files changed, 32 insertions, 1 deletions
diff --git a/src/core/core_cpu.h b/src/core/core_cpu.h
index 312db1655..e6ed698cc 100644
--- a/src/core/core_cpu.h
+++ b/src/core/core_cpu.h
@@ -4,7 +4,9 @@
#pragma once
+#include <condition_variable>
#include <memory>
+#include <mutex>
#include <string>
#include "common/common_types.h"
@@ -16,9 +18,32 @@ class Scheduler;
namespace Core {
+constexpr unsigned NUM_CPU_CORES{4};
+
+class CpuBarrier {
+public:
+ void Rendezvous() {
+ std::unique_lock<std::mutex> lock(mutex);
+
+ --cores_waiting;
+ if (!cores_waiting) {
+ cores_waiting = NUM_CPU_CORES;
+ condition.notify_all();
+ return;
+ }
+
+ condition.wait(lock);
+ }
+
+private:
+ unsigned cores_waiting{NUM_CPU_CORES};
+ std::mutex mutex;
+ std::condition_variable condition;
+};
+
class Cpu {
public:
- Cpu();
+ Cpu(std::shared_ptr<CpuBarrier> cpu_barrier, size_t core_index);
void RunLoop(bool tight_loop = true);
@@ -34,13 +59,19 @@ public:
return *scheduler;
}
+ bool IsMainCore() const {
+ return core_index == 0;
+ }
+
private:
void Reschedule();
std::shared_ptr<ARM_Interface> arm_interface;
+ std::shared_ptr<CpuBarrier> cpu_barrier;
std::unique_ptr<Kernel::Scheduler> scheduler;
bool reschedule_pending{};
+ size_t core_index;
};
} // namespace Core