mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-04-21 03:55:32 +00:00
sys_mutex: add vm::temporary_unlock
This commit is contained in:
parent
89a31292dc
commit
d021d9e14a
7 changed files with 27 additions and 19 deletions
|
@ -1140,7 +1140,7 @@ s32 _spurs::initialize(ppu_thread& ppu, vm::ptr<CellSpurs> spurs, u32 revision,
|
|||
const auto lwCond = spurs.ptr(&CellSpurs::cond);
|
||||
|
||||
// Create a mutex to protect access to SPURS handler thread data
|
||||
if (s32 rc = sys_lwmutex_create(lwMutex, vm::make_var(sys_lwmutex_attribute_t{ SYS_SYNC_PRIORITY, SYS_SYNC_NOT_RECURSIVE, "_spuPrv" })))
|
||||
if (s32 rc = sys_lwmutex_create(ppu, lwMutex, vm::make_var(sys_lwmutex_attribute_t{ SYS_SYNC_PRIORITY, SYS_SYNC_NOT_RECURSIVE, "_spuPrv" })))
|
||||
{
|
||||
_spurs::finalize_spu(ppu, spurs);
|
||||
return rollback(), rc;
|
||||
|
|
|
@ -18,7 +18,7 @@ vm::ptr<void> _sys_memset(vm::ptr<void> dst, s32 value, u32 size);
|
|||
struct sys_lwmutex_t;
|
||||
struct sys_lwmutex_attribute_t;
|
||||
|
||||
error_code sys_lwmutex_create(vm::ptr<sys_lwmutex_t> lwmutex, vm::ptr<sys_lwmutex_attribute_t> attr);
|
||||
error_code sys_lwmutex_create(ppu_thread& ppu, vm::ptr<sys_lwmutex_t> lwmutex, vm::ptr<sys_lwmutex_attribute_t> attr);
|
||||
error_code sys_lwmutex_lock(ppu_thread& CPU, vm::ptr<sys_lwmutex_t> lwmutex, u64 timeout);
|
||||
error_code sys_lwmutex_trylock(ppu_thread& CPU, vm::ptr<sys_lwmutex_t> lwmutex);
|
||||
error_code sys_lwmutex_unlock(ppu_thread& CPU, vm::ptr<sys_lwmutex_t> lwmutex);
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
|
||||
extern logs::channel sysPrxForUser;
|
||||
|
||||
error_code sys_lwmutex_create(vm::ptr<sys_lwmutex_t> lwmutex, vm::ptr<sys_lwmutex_attribute_t> attr)
|
||||
error_code sys_lwmutex_create(ppu_thread& ppu, vm::ptr<sys_lwmutex_t> lwmutex, vm::ptr<sys_lwmutex_attribute_t> attr)
|
||||
{
|
||||
sysPrxForUser.trace("sys_lwmutex_create(lwmutex=*0x%x, attr=*0x%x)", lwmutex, attr);
|
||||
|
||||
|
@ -42,7 +42,7 @@ error_code sys_lwmutex_create(vm::ptr<sys_lwmutex_t> lwmutex, vm::ptr<sys_lwmute
|
|||
attrs->flags = 0;
|
||||
attrs->name_u64 = attr->name_u64;
|
||||
|
||||
if (error_code res = g_cfg.core.hle_lwmutex ? sys_mutex_create(out_id, attrs) : _sys_lwmutex_create(out_id, protocol, lwmutex, 0x80000001, attr->name_u64))
|
||||
if (error_code res = g_cfg.core.hle_lwmutex ? sys_mutex_create(ppu, out_id, attrs) : _sys_lwmutex_create(out_id, protocol, lwmutex, 0x80000001, attr->name_u64))
|
||||
{
|
||||
return res;
|
||||
}
|
||||
|
@ -60,7 +60,7 @@ error_code sys_lwmutex_destroy(ppu_thread& ppu, vm::ptr<sys_lwmutex_t> lwmutex)
|
|||
|
||||
if (g_cfg.core.hle_lwmutex)
|
||||
{
|
||||
return sys_mutex_destroy(lwmutex->sleep_queue);
|
||||
return sys_mutex_destroy(ppu, lwmutex->sleep_queue);
|
||||
}
|
||||
|
||||
// check to prevent recursive locking in the next call
|
||||
|
|
|
@ -88,7 +88,7 @@ s32 sys_mempool_create(ppu_thread& ppu, vm::ptr<sys_mempool_t> mempool, vm::ptr<
|
|||
attr->flags = 0; // Also no idea what this is.
|
||||
strcpy_trunc(attr->name, "mp_m" + std::to_string(*mempool));
|
||||
|
||||
error_code ret = sys_mutex_create(mutexid, attr);
|
||||
error_code ret = sys_mutex_create(ppu, mutexid, attr);
|
||||
if (ret != 0)
|
||||
{ // TODO: Better exception handling.
|
||||
fmt::throw_exception("mempool %x failed to create mutex", mempool);
|
||||
|
@ -125,7 +125,7 @@ void sys_mempool_destroy(ppu_thread& ppu, sys_mempool_t mempool)
|
|||
sys_mutex_lock(ppu, memory_pool->mutexid, 0);
|
||||
idm::remove<memory_pool_t>(mempool);
|
||||
sys_mutex_unlock(ppu, mutexid);
|
||||
sys_mutex_destroy(mutexid);
|
||||
sys_mutex_destroy(ppu, mutexid);
|
||||
sys_cond_destroy(ppu, condid);
|
||||
}
|
||||
else
|
||||
|
|
|
@ -35,7 +35,7 @@ static u32 ppu_alloc_tls()
|
|||
{
|
||||
// Default (small) TLS allocation
|
||||
addr = s_tls_area + i * s_tls_size;
|
||||
break;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -101,7 +101,7 @@ void sys_initialize_tls(ppu_thread& ppu, u64 main_thread_id, u32 tls_seg_addr, u
|
|||
lwa->protocol = SYS_SYNC_PRIORITY;
|
||||
lwa->recursive = SYS_SYNC_RECURSIVE;
|
||||
lwa->name_u64 = "atexit!\0"_u64;
|
||||
sys_lwmutex_create(g_ppu_atexit_lwm, lwa);
|
||||
sys_lwmutex_create(ppu, g_ppu_atexit_lwm, lwa);
|
||||
|
||||
vm::var<sys_mutex_attribute_t> attr;
|
||||
attr->protocol = SYS_SYNC_PRIORITY;
|
||||
|
@ -111,16 +111,16 @@ void sys_initialize_tls(ppu_thread& ppu, u64 main_thread_id, u32 tls_seg_addr, u
|
|||
attr->ipc_key = 0;
|
||||
attr->flags = 0;
|
||||
attr->name_u64 = "_lv2ppu\0"_u64;
|
||||
sys_mutex_create(g_ppu_once_mutex, attr);
|
||||
sys_mutex_create(ppu, g_ppu_once_mutex, attr);
|
||||
|
||||
attr->recursive = SYS_SYNC_RECURSIVE;
|
||||
attr->name_u64 = "_lv2tls\0"_u64;
|
||||
sys_mutex_create(g_ppu_exit_mutex, attr);
|
||||
sys_mutex_create(ppu, g_ppu_exit_mutex, attr);
|
||||
|
||||
lwa->protocol = SYS_SYNC_PRIORITY;
|
||||
lwa->recursive = SYS_SYNC_RECURSIVE;
|
||||
lwa->name_u64 = "_lv2prx\0"_u64;
|
||||
sys_lwmutex_create(g_ppu_prx_lwm, lwa);
|
||||
sys_lwmutex_create(ppu, g_ppu_prx_lwm, lwa);
|
||||
// TODO: missing prx initialization
|
||||
}
|
||||
|
||||
|
@ -182,7 +182,7 @@ void sys_ppu_thread_exit(ppu_thread& ppu, u64 val)
|
|||
}
|
||||
|
||||
verify(HERE), !sys_lwmutex_unlock(ppu, g_ppu_atexit_lwm);
|
||||
|
||||
|
||||
// Deallocate TLS
|
||||
ppu_free_tls(vm::cast(ppu.gpr[13], HERE) - 0x7030);
|
||||
|
||||
|
|
|
@ -8,16 +8,16 @@
|
|||
#include "Emu/Cell/PPUThread.h"
|
||||
#include "sys_mutex.h"
|
||||
|
||||
|
||||
|
||||
LOG_CHANNEL(sys_mutex);
|
||||
|
||||
template<> DECLARE(ipc_manager<lv2_mutex, u64>::g_ipc) {};
|
||||
|
||||
extern u64 get_system_time();
|
||||
|
||||
error_code sys_mutex_create(vm::ptr<u32> mutex_id, vm::ptr<sys_mutex_attribute_t> attr)
|
||||
error_code sys_mutex_create(ppu_thread& ppu, vm::ptr<u32> mutex_id, vm::ptr<sys_mutex_attribute_t> attr)
|
||||
{
|
||||
vm::temporary_unlock(ppu);
|
||||
|
||||
sys_mutex.warning("sys_mutex_create(mutex_id=*0x%x, attr=*0x%x)", mutex_id, attr);
|
||||
|
||||
if (!mutex_id || !attr)
|
||||
|
@ -74,8 +74,10 @@ error_code sys_mutex_create(vm::ptr<u32> mutex_id, vm::ptr<sys_mutex_attribute_t
|
|||
return CELL_OK;
|
||||
}
|
||||
|
||||
error_code sys_mutex_destroy(u32 mutex_id)
|
||||
error_code sys_mutex_destroy(ppu_thread& ppu, u32 mutex_id)
|
||||
{
|
||||
vm::temporary_unlock(ppu);
|
||||
|
||||
sys_mutex.warning("sys_mutex_destroy(mutex_id=0x%x)", mutex_id);
|
||||
|
||||
const auto mutex = idm::withdraw<lv2_obj, lv2_mutex>(mutex_id, [](lv2_mutex& mutex) -> CellError
|
||||
|
@ -110,6 +112,8 @@ error_code sys_mutex_destroy(u32 mutex_id)
|
|||
|
||||
error_code sys_mutex_lock(ppu_thread& ppu, u32 mutex_id, u64 timeout)
|
||||
{
|
||||
vm::temporary_unlock(ppu);
|
||||
|
||||
sys_mutex.trace("sys_mutex_lock(mutex_id=0x%x, timeout=0x%llx)", mutex_id, timeout);
|
||||
|
||||
const auto mutex = idm::get<lv2_obj, lv2_mutex>(mutex_id, [&](lv2_mutex& mutex)
|
||||
|
@ -190,6 +194,8 @@ error_code sys_mutex_lock(ppu_thread& ppu, u32 mutex_id, u64 timeout)
|
|||
|
||||
error_code sys_mutex_trylock(ppu_thread& ppu, u32 mutex_id)
|
||||
{
|
||||
vm::temporary_unlock(ppu);
|
||||
|
||||
sys_mutex.trace("sys_mutex_trylock(mutex_id=0x%x)", mutex_id);
|
||||
|
||||
const auto mutex = idm::check<lv2_obj, lv2_mutex>(mutex_id, [&](lv2_mutex& mutex)
|
||||
|
@ -217,6 +223,8 @@ error_code sys_mutex_trylock(ppu_thread& ppu, u32 mutex_id)
|
|||
|
||||
error_code sys_mutex_unlock(ppu_thread& ppu, u32 mutex_id)
|
||||
{
|
||||
vm::temporary_unlock(ppu);
|
||||
|
||||
sys_mutex.trace("sys_mutex_unlock(mutex_id=0x%x)", mutex_id);
|
||||
|
||||
const auto mutex = idm::check<lv2_obj, lv2_mutex>(mutex_id, [&](lv2_mutex& mutex)
|
||||
|
|
|
@ -147,8 +147,8 @@ class ppu_thread;
|
|||
|
||||
// Syscalls
|
||||
|
||||
error_code sys_mutex_create(vm::ptr<u32> mutex_id, vm::ptr<sys_mutex_attribute_t> attr);
|
||||
error_code sys_mutex_destroy(u32 mutex_id);
|
||||
error_code sys_mutex_create(ppu_thread& ppu, vm::ptr<u32> mutex_id, vm::ptr<sys_mutex_attribute_t> attr);
|
||||
error_code sys_mutex_destroy(ppu_thread& ppu, u32 mutex_id);
|
||||
error_code sys_mutex_lock(ppu_thread& ppu, u32 mutex_id, u64 timeout);
|
||||
error_code sys_mutex_trylock(ppu_thread& ppu, u32 mutex_id);
|
||||
error_code sys_mutex_unlock(ppu_thread& ppu, u32 mutex_id);
|
||||
|
|
Loading…
Add table
Reference in a new issue