SetCurrentNamedThread()

This commit is contained in:
Nekotekina 2014-08-20 18:23:48 +04:00
parent dd9df4f36f
commit 9eb280c367
4 changed files with 49 additions and 46 deletions

View File

@ -12,6 +12,11 @@ NamedThreadBase* GetCurrentNamedThread()
return g_tls_this_thread; return g_tls_this_thread;
} }
void SetCurrentNamedThread(NamedThreadBase* value)
{
g_tls_this_thread = value;
}
std::string NamedThreadBase::GetThreadName() const std::string NamedThreadBase::GetThreadName() const
{ {
return m_name; return m_name;
@ -47,10 +52,9 @@ void ThreadBase::Start()
m_destroy = false; m_destroy = false;
m_alive = true; m_alive = true;
m_executor = new std::thread( m_executor = new std::thread([this]()
[this]()
{ {
g_tls_this_thread = this; SetCurrentNamedThread(this);
g_thread_count++; g_thread_count++;
try try
@ -65,10 +69,6 @@ void ThreadBase::Start()
{ {
LOG_ERROR(GENERAL, "Exception: %s", e); LOG_ERROR(GENERAL, "Exception: %s", e);
} }
catch (int exitcode)
{
LOG_SUCCESS(GENERAL, "Exit Code: %d", exitcode);
}
m_alive = false; m_alive = false;
g_thread_count--; g_thread_count--;
@ -141,7 +141,7 @@ void thread::start(std::function<void()> func)
m_thr = std::thread([func, name]() m_thr = std::thread([func, name]()
{ {
NamedThreadBase info(name); NamedThreadBase info(name);
g_tls_this_thread = &info; SetCurrentNamedThread(&info);
g_thread_count++; g_thread_count++;
try try

View File

@ -48,6 +48,7 @@ public:
}; };
NamedThreadBase* GetCurrentNamedThread(); NamedThreadBase* GetCurrentNamedThread();
void SetCurrentNamedThread(NamedThreadBase* value);
class ThreadBase : public NamedThreadBase class ThreadBase : public NamedThreadBase
{ {

View File

@ -222,13 +222,6 @@ int FPRdouble::Cmp(PPCdouble a, PPCdouble b)
u64 PPUThread::FastCall(u64 addr, u64 rtoc, u64 arg1, u64 arg2, u64 arg3, u64 arg4, u64 arg5, u64 arg6, u64 arg7, u64 arg8) u64 PPUThread::FastCall(u64 addr, u64 rtoc, u64 arg1, u64 arg2, u64 arg3, u64 arg4, u64 arg5, u64 arg6, u64 arg7, u64 arg8)
{ {
auto old_status = m_status;
auto old_PC = PC;
auto old_LR = LR;
auto old_rtoc = GPR[2];
PC = addr;
GPR[2] = rtoc;
GPR[3] = arg1; GPR[3] = arg1;
GPR[4] = arg2; GPR[4] = arg2;
GPR[5] = arg3; GPR[5] = arg3;
@ -237,35 +230,31 @@ u64 PPUThread::FastCall(u64 addr, u64 rtoc, u64 arg1, u64 arg2, u64 arg3, u64 ar
GPR[8] = arg6; GPR[8] = arg6;
GPR[9] = arg7; GPR[9] = arg7;
GPR[10] = arg8; GPR[10] = arg8;
LR = Emu.m_ppu_thr_stop;
Task(); return FastCall2(addr, rtoc);
GPR[2] = old_rtoc;
LR = old_LR;
PC = old_PC;
m_status = old_status;
return GPR[3];
} }
u64 PPUThread::FastCall2(u64 addr, u64 rtoc) u64 PPUThread::FastCall2(u64 addr, u64 rtoc)
{ {
auto old_status = m_status; auto old_status = m_status;
auto old_PC = PC; auto old_PC = PC;
auto old_LR = LR;
auto old_rtoc = GPR[2]; auto old_rtoc = GPR[2];
auto old_LR = LR;
auto old_thread = GetCurrentNamedThread();
m_status = Running;
PC = addr; PC = addr;
GPR[2] = rtoc; GPR[2] = rtoc;
LR = Emu.m_ppu_thr_stop; LR = Emu.m_ppu_thr_stop;
SetCurrentNamedThread(this);
Task(); Task();
m_status = old_status;
PC = old_PC;
GPR[2] = old_rtoc; GPR[2] = old_rtoc;
LR = old_LR; LR = old_LR;
PC = old_PC; SetCurrentNamedThread(old_thread);
m_status = old_status;
return GPR[3]; return GPR[3];
} }

View File

@ -225,8 +225,9 @@ s32 _sys_spu_printf_initialize(u32 agcb, u32 dgcb, u32 atcb, u32 dtcb)
{ {
sysPrxForUser->Warning("_sys_spu_printf_initialize(agcb=0x%x, dgcb=0x%x, atcb=0x%x, dtcb=0x%x)", agcb, dgcb, atcb, dtcb); sysPrxForUser->Warning("_sys_spu_printf_initialize(agcb=0x%x, dgcb=0x%x, atcb=0x%x, dtcb=0x%x)", agcb, dgcb, atcb, dtcb);
// prx: register some callbacks
spu_printf_agcb = agcb; spu_printf_agcb = agcb;
spu_printf_dgcb = atcb; spu_printf_dgcb = dgcb;
spu_printf_atcb = atcb; spu_printf_atcb = atcb;
spu_printf_dtcb = dtcb; spu_printf_dtcb = dtcb;
return CELL_OK; return CELL_OK;
@ -291,6 +292,16 @@ s32 _sys_spu_printf_detach_thread(u32 arg)
return GetCurrentPPUThread().FastCall(Memory.Read32(spu_printf_dtcb), Memory.Read32(spu_printf_dtcb + 4), arg); return GetCurrentPPUThread().FastCall(Memory.Read32(spu_printf_dtcb), Memory.Read32(spu_printf_dtcb + 4), arg);
} }
s32 _sys_printf(u32 arg1)
{
sysPrxForUser->Todo("_sys_printf(arg1=0x%x)", arg1);
// probably, assertion failed
LOG_WARNING(TTY, "%s", (char*)(Memory + arg1));
Emu.Pause();
return CELL_OK;
}
void sysPrxForUser_init() void sysPrxForUser_init()
{ {
REG_FUNC(sysPrxForUser, sys_initialize_tls); REG_FUNC(sysPrxForUser, sys_initialize_tls);
@ -381,4 +392,6 @@ void sysPrxForUser_init()
REG_FUNC(sysPrxForUser, _sys_spu_printf_detach_group); REG_FUNC(sysPrxForUser, _sys_spu_printf_detach_group);
REG_FUNC(sysPrxForUser, _sys_spu_printf_attach_thread); REG_FUNC(sysPrxForUser, _sys_spu_printf_attach_thread);
REG_FUNC(sysPrxForUser, _sys_spu_printf_detach_thread); REG_FUNC(sysPrxForUser, _sys_spu_printf_detach_thread);
REG_FUNC(sysPrxForUser, _sys_printf);
} }