1
0
mirror of https://github.com/RPCS3/rpcs3.git synced 2024-11-25 20:22:30 +01:00

Fixed thread issues

Fixed args passing
Fixed thread stopping/pausing (temporarily)
Fixed problems with SC_Condition and SC_Mutex (partially)
This commit is contained in:
Nekotekina 2014-02-03 17:12:25 +04:00
parent a0c8e116df
commit 311486ed79
10 changed files with 60 additions and 19 deletions

View File

@ -89,14 +89,12 @@ void CPUThread::Wait(const CPUThread& thr)
bool CPUThread::Sync() bool CPUThread::Sync()
{ {
wxCriticalSectionLocker lock(m_cs_sync);
return m_sync_wait; return m_sync_wait;
} }
int CPUThread::ThreadStatus() int CPUThread::ThreadStatus()
{ {
if(Emu.IsStopped()) if(Emu.IsStopped() || IsStopped() || IsPaused())
{ {
return CPUThread_Stopped; return CPUThread_Stopped;
} }
@ -236,7 +234,7 @@ void CPUThread::Pause()
DoPause(); DoPause();
Emu.CheckStatus(); Emu.CheckStatus();
ThreadBase::Stop(); // ThreadBase::Stop(); // "Abort() called" exception
#ifndef QT_UI #ifndef QT_UI
wxGetApp().SendDbgCommand(DID_PAUSED_THREAD, this); wxGetApp().SendDbgCommand(DID_PAUSED_THREAD, this);
#endif #endif

View File

@ -93,7 +93,7 @@ CPUThread* CPUThreadManager::GetThread(u32 id)
{ {
CPUThread* res; CPUThread* res;
Emu.GetIdManager().GetIDData(id, res); if (!Emu.GetIdManager().GetIDData(id, res)) return nullptr;
return res; return res;
} }

View File

@ -16,6 +16,7 @@ PPCThread* GetCurrentPPCThread()
PPCThread::PPCThread(CPUThreadType type) : CPUThread(type) PPCThread::PPCThread(CPUThreadType type) : CPUThread(type)
{ {
memset(m_args, 0, sizeof(m_args));
} }
PPCThread::~PPCThread() PPCThread::~PPCThread()
@ -24,7 +25,6 @@ PPCThread::~PPCThread()
void PPCThread::DoReset() void PPCThread::DoReset()
{ {
memset(m_args, 0, sizeof(u64) * 4);
} }
void PPCThread::InitStack() void PPCThread::InitStack()

View File

@ -174,7 +174,7 @@ u64 DynamicMemoryBlockBase<PT>::AllocAlign(u32 size, u32 align)
template<typename PT> template<typename PT>
bool DynamicMemoryBlockBase<PT>::Alloc() bool DynamicMemoryBlockBase<PT>::Alloc()
{ {
return AllocAlign(GetSize() - GetUsedSize(), 0) != 0; return AllocAlign(GetSize() - GetUsedSize()) != 0;
} }
template<typename PT> template<typename PT>

View File

@ -123,7 +123,7 @@ public:
virtual u8* GetMem(u64 addr) const { return mem + addr; } virtual u8* GetMem(u64 addr) const { return mem + addr; }
virtual bool AllocFixed(u64 addr, u32 size) { return false; } virtual bool AllocFixed(u64 addr, u32 size) { return false; }
virtual u64 AllocAlign(u32 size, u32 align = 0) { return 0; } virtual u64 AllocAlign(u32 size, u32 align = 1) { return 0; }
virtual bool Alloc() { return false; } virtual bool Alloc() { return false; }
virtual bool Free(u64 addr) { return false; } virtual bool Free(u64 addr) { return false; }
virtual bool Lock(u64 addr, u32 size) { return false; } virtual bool Lock(u64 addr, u32 size) { return false; }
@ -215,7 +215,7 @@ public:
virtual void Delete(); virtual void Delete();
virtual bool AllocFixed(u64 addr, u32 size); virtual bool AllocFixed(u64 addr, u32 size);
virtual u64 AllocAlign(u32 size, u32 align = 0); virtual u64 AllocAlign(u32 size, u32 align = 1);
virtual bool Alloc(); virtual bool Alloc();
virtual bool Free(u64 addr); virtual bool Free(u64 addr);
virtual bool Lock(u64 addr, u32 size); virtual bool Lock(u64 addr, u32 size);

View File

@ -176,8 +176,8 @@ void fsAioRead(u32 fd, mem_ptr_t<CellFsAio> aio, int xid, mem_func_ptr_t<void (*
} }
//start callback thread //start callback thread
//if(func) if(func)
//func.async(aio, error, xid, res); func.async(aio, error, xid, res);
ConLog.Warning("*** fsAioRead(fd=%d, offset=0x%llx, buf_addr=0x%x, size=%d, res=%d, xid=%d [%s])", ConLog.Warning("*** fsAioRead(fd=%d, offset=0x%llx, buf_addr=0x%x, size=%d, res=%d, xid=%d [%s])",
fd, (u64)aio->offset, buf_addr, (u64)aio->size, res, xid, path.c_str()); fd, (u64)aio->offset, buf_addr, (u64)aio->size, res, xid, path.c_str());
@ -195,6 +195,7 @@ int cellFsAioRead(mem_ptr_t<CellFsAio> aio, mem32_t aio_id, mem_func_ptr_t<void
thread t("fsAioRead", std::bind(fsAioRead, fd, aio, xid, func)); thread t("fsAioRead", std::bind(fsAioRead, fd, aio, xid, func));
t.detach(); t.detach();
//fsAioRead(fd, aio, xid, func);
aio_id = xid; aio_id = xid;

View File

@ -188,7 +188,7 @@ extern int sys_ppu_thread_get_priority(u32 thread_id, u32 prio_addr);
extern int sys_ppu_thread_get_stack_information(u32 info_addr); extern int sys_ppu_thread_get_stack_information(u32 info_addr);
extern int sys_ppu_thread_stop(u32 thread_id); extern int sys_ppu_thread_stop(u32 thread_id);
extern int sys_ppu_thread_restart(u32 thread_id); extern int sys_ppu_thread_restart(u32 thread_id);
extern int sys_ppu_thread_create(u32 thread_id_addr, u32 entry, u32 arg, int prio, u32 stacksize, u64 flags, u32 threadname_addr); extern int sys_ppu_thread_create(u32 thread_id_addr, u32 entry, u64 arg, int prio, u32 stacksize, u64 flags, u32 threadname_addr);
extern void sys_ppu_thread_once(u32 once_ctrl_addr, u32 entry); extern void sys_ppu_thread_once(u32 once_ctrl_addr, u32 entry);
extern int sys_ppu_thread_get_id(const u32 id_addr); extern int sys_ppu_thread_get_id(const u32 id_addr);
extern int sys_spu_thread_group_connect_event_all_threads(u32 id, u32 eq, u64 req, u32 spup_addr); extern int sys_spu_thread_group_connect_event_all_threads(u32 id, u32 eq, u64 req, u32 spup_addr);

View File

@ -27,7 +27,7 @@ struct condition
int sys_cond_create(u32 cond_addr, u32 mutex_id, u32 attr_addr) int sys_cond_create(u32 cond_addr, u32 mutex_id, u32 attr_addr)
{ {
sys_cond.Log("sys_cond_create(cond_addr=0x%x, mutex_id=0x%x, attr_addr=%d)", sys_cond.Warning("sys_cond_create(cond_addr=0x%x, mutex_id=0x%x, attr_addr=%d)",
cond_addr, mutex_id, attr_addr); cond_addr, mutex_id, attr_addr);
if(!Memory.IsGoodAddr(cond_addr) || !Memory.IsGoodAddr(attr_addr)) return CELL_EFAULT; if(!Memory.IsGoodAddr(cond_addr) || !Memory.IsGoodAddr(attr_addr)) return CELL_EFAULT;
@ -68,9 +68,32 @@ int sys_cond_wait(u32 cond_id, u64 timeout)
condition* cond_data = nullptr; condition* cond_data = nullptr;
if(!sys_cond.CheckId(cond_id, cond_data)) return CELL_ESRCH; if(!sys_cond.CheckId(cond_id, cond_data)) return CELL_ESRCH;
cond_data->cond.WaitTimeout(timeout ? timeout : INFINITE); u32 counter = 0;
const u32 max_counter = timeout ? (timeout / 1000) : 20000;
do
{
if (Emu.IsStopped()) return CELL_ETIMEDOUT;
return CELL_OK; switch (cond_data->cond.WaitTimeout(1))
{
wxCOND_NO_ERROR: return CELL_OK;
wxCOND_TIMEOUT: break;
default: return CELL_EPERM;
}
if (counter++ > max_counter)
{
if (!timeout)
{
sys_cond.Warning("sys_cond_wait(cond_id=0x%x, timeout=0x%llx): TIMEOUT", cond_id, timeout);
counter = 0;
}
else
{
return CELL_ETIMEDOUT;
}
}
} while (true);
} }
int sys_cond_signal(u32 cond_id) int sys_cond_signal(u32 cond_id)

View File

@ -48,9 +48,28 @@ int sys_mutex_lock(u32 mutex_id, u64 timeout)
mutex* mtx_data = nullptr; mutex* mtx_data = nullptr;
if(!sys_mtx.CheckId(mutex_id, mtx_data)) return CELL_ESRCH; if(!sys_mtx.CheckId(mutex_id, mtx_data)) return CELL_ESRCH;
mtx_data->mtx.Lock(); u32 counter = 0;
const u32 max_counter = timeout ? (timeout / 1000) : 20000;
do
{
if (Emu.IsStopped()) return CELL_ETIMEDOUT;
return CELL_OK; if (mtx_data->mtx.TryLock() == wxMUTEX_NO_ERROR) return CELL_OK;
Sleep(1);
if (counter++ > max_counter)
{
if (!timeout)
{
sys_mtx.Warning("sys_mutex_lock(mutex_id=0x%x, timeout=0x%llx): TIMEOUT", mutex_id, timeout);
counter = 0;
}
else
{
return CELL_ETIMEDOUT;
}
}
} while (true);
} }
int sys_mutex_trylock(u32 mutex_id) int sys_mutex_trylock(u32 mutex_id)
@ -60,7 +79,7 @@ int sys_mutex_trylock(u32 mutex_id)
mutex* mtx_data = nullptr; mutex* mtx_data = nullptr;
if(!sys_mtx.CheckId(mutex_id, mtx_data)) return CELL_ESRCH; if(!sys_mtx.CheckId(mutex_id, mtx_data)) return CELL_ESRCH;
if(mtx_data->mtx.TryLock()) return 1; if (mtx_data->mtx.TryLock() != wxMUTEX_NO_ERROR) return CELL_EBUSY;
return CELL_OK; return CELL_OK;
} }

View File

@ -131,7 +131,7 @@ int sys_ppu_thread_restart(u32 thread_id)
return CELL_OK; return CELL_OK;
} }
int sys_ppu_thread_create(u32 thread_id_addr, u32 entry, u32 arg, int prio, u32 stacksize, u64 flags, u32 threadname_addr) int sys_ppu_thread_create(u32 thread_id_addr, u32 entry, u64 arg, int prio, u32 stacksize, u64 flags, u32 threadname_addr)
{ {
sysPrxForUser.Log("sys_ppu_thread_create(thread_id_addr=0x%x, entry=0x%x, arg=0x%x, prio=%d, stacksize=0x%x, flags=0x%llx, threadname_addr=0x%x('%s'))", sysPrxForUser.Log("sys_ppu_thread_create(thread_id_addr=0x%x, entry=0x%x, arg=0x%x, prio=%d, stacksize=0x%x, flags=0x%llx, threadname_addr=0x%x('%s'))",
thread_id_addr, entry, arg, prio, stacksize, flags, threadname_addr, Memory.ReadString(threadname_addr).mb_str()); thread_id_addr, entry, arg, prio, stacksize, flags, threadname_addr, Memory.ReadString(threadname_addr).mb_str());