core: cpu_manager: Use jthread.
This commit is contained in:
		| @@ -21,34 +21,25 @@ namespace Core { | |||||||
| CpuManager::CpuManager(System& system_) : system{system_} {} | CpuManager::CpuManager(System& system_) : system{system_} {} | ||||||
| CpuManager::~CpuManager() = default; | CpuManager::~CpuManager() = default; | ||||||
|  |  | ||||||
| void CpuManager::ThreadStart(CpuManager& cpu_manager, std::size_t core) { | void CpuManager::ThreadStart(std::stop_token stop_token, CpuManager& cpu_manager, | ||||||
|     cpu_manager.RunThread(core); |                              std::size_t core) { | ||||||
|  |     cpu_manager.RunThread(stop_token, core); | ||||||
| } | } | ||||||
|  |  | ||||||
| void CpuManager::Initialize() { | void CpuManager::Initialize() { | ||||||
|     running_mode = true; |     running_mode = true; | ||||||
|     if (is_multicore) { |     if (is_multicore) { | ||||||
|         for (std::size_t core = 0; core < Core::Hardware::NUM_CPU_CORES; core++) { |         for (std::size_t core = 0; core < Core::Hardware::NUM_CPU_CORES; core++) { | ||||||
|             core_data[core].host_thread = |             core_data[core].host_thread = std::jthread(ThreadStart, std::ref(*this), core); | ||||||
|                 std::make_unique<std::thread>(ThreadStart, std::ref(*this), core); |  | ||||||
|         } |         } | ||||||
|     } else { |     } else { | ||||||
|         core_data[0].host_thread = std::make_unique<std::thread>(ThreadStart, std::ref(*this), 0); |         core_data[0].host_thread = std::jthread(ThreadStart, std::ref(*this), 0); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void CpuManager::Shutdown() { | void CpuManager::Shutdown() { | ||||||
|     running_mode = false; |     running_mode = false; | ||||||
|     Pause(false); |     Pause(false); | ||||||
|     if (is_multicore) { |  | ||||||
|         for (auto& data : core_data) { |  | ||||||
|             data.host_thread->join(); |  | ||||||
|             data.host_thread.reset(); |  | ||||||
|         } |  | ||||||
|     } else { |  | ||||||
|         core_data[0].host_thread->join(); |  | ||||||
|         core_data[0].host_thread.reset(); |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|  |  | ||||||
| std::function<void(void*)> CpuManager::GetGuestThreadStartFunc() { | std::function<void(void*)> CpuManager::GetGuestThreadStartFunc() { | ||||||
| @@ -317,7 +308,7 @@ void CpuManager::Pause(bool paused) { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void CpuManager::RunThread(std::size_t core) { | void CpuManager::RunThread(std::stop_token stop_token, std::size_t core) { | ||||||
|     /// Initialization |     /// Initialization | ||||||
|     system.RegisterCoreThread(core); |     system.RegisterCoreThread(core); | ||||||
|     std::string name; |     std::string name; | ||||||
| @@ -361,6 +352,10 @@ void CpuManager::RunThread(std::size_t core) { | |||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         if (stop_token.stop_requested()) { | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         auto current_thread = system.Kernel().CurrentScheduler()->GetCurrentThread(); |         auto current_thread = system.Kernel().CurrentScheduler()->GetCurrentThread(); | ||||||
|         data.is_running = true; |         data.is_running = true; | ||||||
|         Common::Fiber::YieldTo(data.host_context, *current_thread->GetHostContext()); |         Common::Fiber::YieldTo(data.host_context, *current_thread->GetHostContext()); | ||||||
|   | |||||||
| @@ -78,9 +78,9 @@ private: | |||||||
|     void SingleCoreRunSuspendThread(); |     void SingleCoreRunSuspendThread(); | ||||||
|     void SingleCorePause(bool paused); |     void SingleCorePause(bool paused); | ||||||
|  |  | ||||||
|     static void ThreadStart(CpuManager& cpu_manager, std::size_t core); |     static void ThreadStart(std::stop_token stop_token, CpuManager& cpu_manager, std::size_t core); | ||||||
|  |  | ||||||
|     void RunThread(std::size_t core); |     void RunThread(std::stop_token stop_token, std::size_t core); | ||||||
|  |  | ||||||
|     struct CoreData { |     struct CoreData { | ||||||
|         std::shared_ptr<Common::Fiber> host_context; |         std::shared_ptr<Common::Fiber> host_context; | ||||||
| @@ -89,7 +89,7 @@ private: | |||||||
|         std::atomic<bool> is_running; |         std::atomic<bool> is_running; | ||||||
|         std::atomic<bool> is_paused; |         std::atomic<bool> is_paused; | ||||||
|         std::atomic<bool> initialized; |         std::atomic<bool> initialized; | ||||||
|         std::unique_ptr<std::thread> host_thread; |         std::jthread host_thread; | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     std::atomic<bool> running_mode{}; |     std::atomic<bool> running_mode{}; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user