diff options
author | bunnei <bunneidev@gmail.com> | 2018-05-03 03:26:14 +0200 |
---|---|---|
committer | bunnei <bunneidev@gmail.com> | 2018-05-11 01:34:46 +0200 |
commit | 9776ff91797423a9cf19571faafe4648fb5a1d1d (patch) | |
tree | 46a7c94c53faee26b805f6290a09c45d33f7bf11 /src/core/core_cpu.h | |
parent | core: Move common CPU core things to its own class. (diff) | |
download | yuzu-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.h | 33 |
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 |