sys_lwmutex_locker aux class

This commit is contained in:
Nekotekina 2017-07-12 19:09:53 +03:00
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_unlock(ppu_thread& CPU, vm::ptr<sys_lwmutex_t> lwmutex);
s32 sys_lwmutex_destroy(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_t;
struct sys_lwcond_attribute_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); 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) for (auto ptr : *g_ppu_atexit)
{ {
if (ptr == func) if (ptr == func)
{ {
verify(HERE), !sys_lwmutex_unlock(ppu, g_ppu_atexit_lwm);
return CELL_EPERM; 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) if (pp == vm::null)
{ {
pp = func; pp = func;
verify(HERE), !sys_lwmutex_unlock(ppu, g_ppu_atexit_lwm);
return CELL_OK; return CELL_OK;
} }
} }
verify(HERE), !sys_lwmutex_unlock(ppu, g_ppu_atexit_lwm);
return CELL_ENOMEM; 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); 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) for (auto& pp : *g_ppu_atexit)
{ {
if (pp == func) if (pp == func)
{ {
pp = vm::null; pp = vm::null;
verify(HERE), !sys_lwmutex_unlock(ppu, g_ppu_atexit_lwm);
return CELL_OK; return CELL_OK;
} }
} }
verify(HERE), !sys_lwmutex_unlock(ppu, g_ppu_atexit_lwm);
return CELL_ESRCH; 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); 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) 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; *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) error_code sys_interrupt_thread_disestablish(ppu_thread& ppu, u32 ih)