2013-11-03 20:23:16 +01:00
|
|
|
#include "stdafx.h"
|
2014-06-02 19:27:24 +02:00
|
|
|
#include "Emu/Memory/Memory.h"
|
|
|
|
|
#include "Emu/System.h"
|
2014-07-12 09:02:39 +02:00
|
|
|
#include "Emu/DbgCommand.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"
|
2013-11-03 20:23:16 +01:00
|
|
|
|
|
|
|
|
CPUThreadManager::CPUThreadManager()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CPUThreadManager::~CPUThreadManager()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CPUThreadManager::Close()
|
|
|
|
|
{
|
2015-03-04 22:51:14 +01:00
|
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
2013-11-03 20:23:16 +01:00
|
|
|
|
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
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::vector<std::shared_ptr<CPUThread>> CPUThreadManager::GetAllThreads() const
|
|
|
|
|
{
|
|
|
|
|
std::vector<std::shared_ptr<CPUThread>> result;
|
|
|
|
|
|
|
|
|
|
for (auto& v : Emu.GetIdManager().get_data<PPUThread>())
|
2014-07-16 14:06:58 +02:00
|
|
|
{
|
2015-07-01 00:25:52 +02:00
|
|
|
result.emplace_back(std::static_pointer_cast<CPUThread>(v.data));
|
2014-07-16 14:06:58 +02:00
|
|
|
}
|
2015-07-01 00:25:52 +02:00
|
|
|
|
|
|
|
|
for (auto& v : Emu.GetIdManager().get_data<SPUThread>())
|
2014-07-16 14:06:58 +02:00
|
|
|
{
|
2015-07-01 00:25:52 +02:00
|
|
|
result.emplace_back(std::static_pointer_cast<CPUThread>(v.data));
|
2014-07-16 14:06:58 +02:00
|
|
|
}
|
2015-07-01 00:25:52 +02:00
|
|
|
|
|
|
|
|
for (auto& v : Emu.GetIdManager().get_data<RawSPUThread>())
|
2014-07-16 14:06:58 +02:00
|
|
|
{
|
2015-07-01 00:25:52 +02:00
|
|
|
result.emplace_back(std::static_pointer_cast<CPUThread>(v.data));
|
2013-11-03 20:23:16 +01:00
|
|
|
}
|
|
|
|
|
|
2015-07-01 00:25:52 +02:00
|
|
|
for (auto& v : Emu.GetIdManager().get_data<ARMv7Thread>())
|
2015-03-04 22:51:14 +01:00
|
|
|
{
|
2015-07-01 00:25:52 +02:00
|
|
|
result.emplace_back(std::static_pointer_cast<CPUThread>(v.data));
|
2015-03-04 22:51:14 +01:00
|
|
|
}
|
2013-11-03 20:23:16 +01:00
|
|
|
|
2015-07-01 00:25:52 +02:00
|
|
|
return result;
|
2013-11-03 20:23:16 +01:00
|
|
|
}
|
|
|
|
|
|
2015-07-01 00:25:52 +02:00
|
|
|
void CPUThreadManager::Exec() const
|
2013-11-03 20:23:16 +01:00
|
|
|
{
|
2015-07-01 00:25:52 +02:00
|
|
|
for (auto& v : Emu.GetIdManager().get_data<PPUThread>())
|
2013-11-03 20:23:16 +01:00
|
|
|
{
|
2015-07-01 00:25:52 +02:00
|
|
|
static_cast<CPUThread*>(v.data.get())->Exec();
|
2014-04-15 16:12:15 +02:00
|
|
|
}
|
|
|
|
|
|
2015-07-01 00:25:52 +02:00
|
|
|
for (auto& v : Emu.GetIdManager().get_data<ARMv7Thread>())
|
2014-04-15 16:12:15 +02:00
|
|
|
{
|
2015-07-01 00:25:52 +02:00
|
|
|
static_cast<CPUThread*>(v.data.get())->Exec();
|
2013-11-03 20:23:16 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2015-07-01 00:25:52 +02:00
|
|
|
std::shared_ptr<RawSPUThread> CPUThreadManager::NewRawSPUThread()
|
2013-11-03 20:23:16 +01:00
|
|
|
{
|
2015-07-01 00:25:52 +02:00
|
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
2013-11-03 20:23:16 +01:00
|
|
|
|
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())
|
|
|
|
|
{
|
2015-07-04 21:23:10 +02:00
|
|
|
m_raw_spu[i] = result = Emu.GetIdManager().make_ptr<RawSPUThread>(std::to_string(i), i);
|
2015-07-01 00:25:52 +02:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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)
|
2014-06-23 03:03:16 +02:00
|
|
|
{
|
2015-03-04 22:51:14 +01:00
|
|
|
if (index >= m_raw_spu.size())
|
2014-07-10 02:13:04 +02:00
|
|
|
{
|
|
|
|
|
return nullptr;
|
2014-06-23 03:03:16 +02:00
|
|
|
}
|
2015-03-04 22:51:14 +01:00
|
|
|
|
|
|
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
2014-02-02 20:49:10 +01:00
|
|
|
|
2015-07-01 00:25:52 +02:00
|
|
|
return m_raw_spu[index].lock();
|
2013-11-19 11:30:58 +01:00
|
|
|
}
|