mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-04-21 12:05:23 +00:00
sys_lwmutex_locker aux class
This commit is contained in:
parent
f7472d59aa
commit
5ba23ac4c4
2 changed files with 22 additions and 9 deletions
|
@ -24,6 +24,24 @@ s32 sys_lwmutex_trylock(ppu_thread& CPU, vm::ptr<sys_lwmutex_t> lwmutex);
|
|||
s32 sys_lwmutex_unlock(ppu_thread& CPU, vm::ptr<sys_lwmutex_t> lwmutex);
|
||||
s32 sys_lwmutex_destroy(ppu_thread& CPU, vm::ptr<sys_lwmutex_t> lwmutex);
|
||||
|
||||
struct sys_lwmutex_locker
|
||||
{
|
||||
ppu_thread& ppu;
|
||||
vm::ptr<sys_lwmutex_t> mutex;
|
||||
|
||||
sys_lwmutex_locker(ppu_thread& ppu, vm::ptr<sys_lwmutex_t> mutex)
|
||||
: ppu(ppu)
|
||||
, mutex(mutex)
|
||||
{
|
||||
verify(HERE), sys_lwmutex_lock(ppu, mutex, 0) == CELL_OK;
|
||||
}
|
||||
|
||||
~sys_lwmutex_locker() noexcept(false)
|
||||
{
|
||||
verify(HERE), sys_lwmutex_unlock(ppu, mutex) == CELL_OK;
|
||||
}
|
||||
};
|
||||
|
||||
struct sys_lwcond_t;
|
||||
struct sys_lwcond_attribute_t;
|
||||
|
||||
|
|
|
@ -182,13 +182,12 @@ error_code sys_ppu_thread_register_atexit(ppu_thread& ppu, vm::ptr<void()> func)
|
|||
{
|
||||
sysPrxForUser.notice("sys_ppu_thread_register_atexit(ptr=*0x%x)", func);
|
||||
|
||||
verify(HERE), !sys_lwmutex_lock(ppu, g_ppu_atexit_lwm, 0);
|
||||
sys_lwmutex_locker lock(ppu, g_ppu_atexit_lwm);
|
||||
|
||||
for (auto ptr : *g_ppu_atexit)
|
||||
{
|
||||
if (ptr == func)
|
||||
{
|
||||
verify(HERE), !sys_lwmutex_unlock(ppu, g_ppu_atexit_lwm);
|
||||
return CELL_EPERM;
|
||||
}
|
||||
}
|
||||
|
@ -198,12 +197,10 @@ error_code sys_ppu_thread_register_atexit(ppu_thread& ppu, vm::ptr<void()> func)
|
|||
if (pp == vm::null)
|
||||
{
|
||||
pp = func;
|
||||
verify(HERE), !sys_lwmutex_unlock(ppu, g_ppu_atexit_lwm);
|
||||
return CELL_OK;
|
||||
}
|
||||
}
|
||||
|
||||
verify(HERE), !sys_lwmutex_unlock(ppu, g_ppu_atexit_lwm);
|
||||
return CELL_ENOMEM;
|
||||
}
|
||||
|
||||
|
@ -211,19 +208,17 @@ error_code sys_ppu_thread_unregister_atexit(ppu_thread& ppu, vm::ptr<void()> fun
|
|||
{
|
||||
sysPrxForUser.notice("sys_ppu_thread_unregister_atexit(ptr=*0x%x)", func);
|
||||
|
||||
verify(HERE), !sys_lwmutex_lock(ppu, g_ppu_atexit_lwm, 0);
|
||||
sys_lwmutex_locker lock(ppu, g_ppu_atexit_lwm);
|
||||
|
||||
for (auto& pp : *g_ppu_atexit)
|
||||
{
|
||||
if (pp == func)
|
||||
{
|
||||
pp = vm::null;
|
||||
verify(HERE), !sys_lwmutex_unlock(ppu, g_ppu_atexit_lwm);
|
||||
return CELL_OK;
|
||||
}
|
||||
}
|
||||
|
||||
verify(HERE), !sys_lwmutex_unlock(ppu, g_ppu_atexit_lwm);
|
||||
return CELL_ESRCH;
|
||||
}
|
||||
|
||||
|
@ -231,7 +226,7 @@ void sys_ppu_thread_once(ppu_thread& ppu, vm::ptr<s32> once_ctrl, vm::ptr<void()
|
|||
{
|
||||
sysPrxForUser.notice("sys_ppu_thread_once(once_ctrl=*0x%x, init=*0x%x)", once_ctrl, init);
|
||||
|
||||
verify(HERE), !sys_mutex_lock(ppu, *g_ppu_once_mutex, 0);
|
||||
verify(HERE), sys_mutex_lock(ppu, *g_ppu_once_mutex, 0) == CELL_OK;
|
||||
|
||||
if (*once_ctrl == SYS_PPU_THREAD_ONCE_INIT)
|
||||
{
|
||||
|
@ -240,7 +235,7 @@ void sys_ppu_thread_once(ppu_thread& ppu, vm::ptr<s32> once_ctrl, vm::ptr<void()
|
|||
*once_ctrl = SYS_PPU_THREAD_DONE_INIT;
|
||||
}
|
||||
|
||||
verify(HERE), !sys_mutex_unlock(ppu, *g_ppu_once_mutex);
|
||||
verify(HERE), sys_mutex_unlock(ppu, *g_ppu_once_mutex) == CELL_OK;
|
||||
}
|
||||
|
||||
error_code sys_interrupt_thread_disestablish(ppu_thread& ppu, u32 ih)
|
||||
|
|
Loading…
Add table
Reference in a new issue