rpcsx/rpcs3/Emu/CPU/CPUThreadManager.cpp

99 lines
1.6 KiB
C++
Raw Normal View History

#include "stdafx.h"
#include "Emu/Memory/Memory.h"
#include "Emu/System.h"
2014-08-26 01:55:37 +02:00
#include "Emu/IdManager.h"
2015-07-01 00:25:52 +02:00
2013-11-19 11:30:58 +01:00
#include "Emu/Cell/PPUThread.h"
#include "Emu/Cell/SPUThread.h"
#include "Emu/Cell/RawSPUThread.h"
#include "Emu/ARMv7/ARMv7Thread.h"
2015-07-01 00:25:52 +02:00
#include "CPUThreadManager.h"
CPUThreadManager::CPUThreadManager()
{
}
CPUThreadManager::~CPUThreadManager()
{
}
void CPUThreadManager::Close()
{
2015-03-04 22:51:14 +01:00
std::lock_guard<std::mutex> lock(m_mutex);
2015-07-01 00:25:52 +02:00
for (auto& x : m_raw_spu)
2014-07-16 14:06:58 +02:00
{
2015-07-01 00:25:52 +02:00
x.reset();
2014-07-16 14:06:58 +02:00
}
2015-07-01 00:25:52 +02:00
}
2015-07-08 17:01:59 +02:00
std::vector<std::shared_ptr<CPUThread>> CPUThreadManager::GetAllThreads()
2015-07-01 00:25:52 +02:00
{
std::vector<std::shared_ptr<CPUThread>> result;
for (auto& t : idm::get_all<PPUThread>())
2014-07-16 14:06:58 +02:00
{
2015-07-08 17:01:59 +02:00
result.emplace_back(t);
2014-07-16 14:06:58 +02:00
}
2015-07-01 00:25:52 +02:00
for (auto& t : idm::get_all<SPUThread>())
2014-07-16 14:06:58 +02:00
{
2015-07-08 17:01:59 +02:00
result.emplace_back(t);
2014-07-16 14:06:58 +02:00
}
2015-07-01 00:25:52 +02:00
for (auto& t : idm::get_all<RawSPUThread>())
2014-07-16 14:06:58 +02:00
{
2015-07-08 17:01:59 +02:00
result.emplace_back(t);
}
for (auto& t : idm::get_all<ARMv7Thread>())
2015-03-04 22:51:14 +01:00
{
2015-07-08 17:01:59 +02:00
result.emplace_back(t);
2015-03-04 22:51:14 +01:00
}
2015-07-01 00:25:52 +02:00
return result;
}
2015-07-08 17:01:59 +02:00
void CPUThreadManager::Exec()
{
for (auto& t : idm::get_all<PPUThread>())
{
2015-07-19 13:36:32 +02:00
t->exec();
}
for (auto& t : idm::get_all<ARMv7Thread>())
{
2015-07-19 13:36:32 +02:00
t->exec();
}
}
2015-07-01 00:25:52 +02:00
std::shared_ptr<RawSPUThread> CPUThreadManager::NewRawSPUThread()
{
2015-07-01 00:25:52 +02:00
std::lock_guard<std::mutex> lock(m_mutex);
2015-07-01 00:25:52 +02:00
std::shared_ptr<RawSPUThread> result;
2015-01-23 22:48:14 +01:00
2015-07-01 00:25:52 +02:00
for (u32 i = 0; i < m_raw_spu.size(); i++)
{
if (m_raw_spu[i].expired())
{
m_raw_spu[i] = result = idm::make_ptr<RawSPUThread>(std::to_string(i), i);
2015-07-01 00:25:52 +02:00
break;
}
}
2015-07-01 00:25:52 +02:00
return result;
2015-01-23 22:48:14 +01:00
}
2015-07-01 00:25:52 +02:00
std::shared_ptr<RawSPUThread> CPUThreadManager::GetRawSPUThread(u32 index)
{
2015-03-04 22:51:14 +01:00
if (index >= m_raw_spu.size())
2014-07-10 02:13:04 +02:00
{
return nullptr;
}
2015-03-04 22:51:14 +01:00
std::lock_guard<std::mutex> lock(m_mutex);
2015-07-01 00:25:52 +02:00
return m_raw_spu[index].lock();
2013-11-19 11:30:58 +01:00
}