sys_lwmutex_locker aux class

This commit is contained in:
Nekotekina 2017-07-12 19:09:53 +03:00
parent f7472d59aa
commit 5ba23ac4c4
2 changed files with 22 additions and 9 deletions

View file

@ -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;

View file

@ -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)