From 89a31292dcb518ed5953e52024d7042fbaf25429 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Sun, 9 Jun 2019 01:38:01 +0300 Subject: [PATCH] sys_cond: add vm::temporary_unlock --- rpcs3/Emu/Cell/Modules/cellSpurs.cpp | 8 ++++---- rpcs3/Emu/Cell/Modules/sysPrxForUser.h | 4 ++-- rpcs3/Emu/Cell/Modules/sys_lwcond_.cpp | 8 ++++---- rpcs3/Emu/Cell/Modules/sys_mempool.cpp | 4 ++-- rpcs3/Emu/Cell/lv2/sys_cond.cpp | 18 ++++++++++++++---- rpcs3/Emu/Cell/lv2/sys_cond.h | 4 ++-- 6 files changed, 28 insertions(+), 18 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellSpurs.cpp b/rpcs3/Emu/Cell/Modules/cellSpurs.cpp index 3d13726aa4..a33436371e 100644 --- a/rpcs3/Emu/Cell/Modules/cellSpurs.cpp +++ b/rpcs3/Emu/Cell/Modules/cellSpurs.cpp @@ -1147,7 +1147,7 @@ s32 _spurs::initialize(ppu_thread& ppu, vm::ptr spurs, u32 revision, } // Create condition variable to signal the SPURS handler thread - if (s32 rc = sys_lwcond_create(lwCond, lwMutex, vm::make_var(sys_lwcond_attribute_t{ "_spuPrv" }))) + if (s32 rc = sys_lwcond_create(ppu, lwCond, lwMutex, vm::make_var(sys_lwcond_attribute_t{ "_spuPrv" }))) { sys_lwmutex_destroy(ppu, lwMutex); _spurs::finalize_spu(ppu, spurs); @@ -1165,7 +1165,7 @@ s32 _spurs::initialize(ppu_thread& ppu, vm::ptr spurs, u32 revision, // Create the SPURS event helper thread if (s32 rc = _spurs::create_event_helper(ppu, spurs, ppuPriority)) { - sys_lwcond_destroy(lwCond); + sys_lwcond_destroy(ppu, lwCond); sys_lwmutex_destroy(ppu, lwMutex); _spurs::finalize_spu(ppu, spurs); return rollback(), rc; @@ -1175,7 +1175,7 @@ s32 _spurs::initialize(ppu_thread& ppu, vm::ptr spurs, u32 revision, if (s32 rc = _spurs::create_handler(spurs, ppuPriority)) { _spurs::stop_event_helper(ppu, spurs); - sys_lwcond_destroy(lwCond); + sys_lwcond_destroy(ppu, lwCond); sys_lwmutex_destroy(ppu, lwMutex); _spurs::finalize_spu(ppu, spurs); return rollback(), rc; @@ -1187,7 +1187,7 @@ s32 _spurs::initialize(ppu_thread& ppu, vm::ptr spurs, u32 revision, _spurs::signal_to_handler_thread(ppu, spurs); _spurs::join_handler_thread(ppu, spurs); _spurs::stop_event_helper(ppu, spurs); - sys_lwcond_destroy(lwCond); + sys_lwcond_destroy(ppu, lwCond); sys_lwmutex_destroy(ppu, lwMutex); _spurs::finalize_spu(ppu, spurs); return rollback(), rc; diff --git a/rpcs3/Emu/Cell/Modules/sysPrxForUser.h b/rpcs3/Emu/Cell/Modules/sysPrxForUser.h index 4472998c9e..5d892ef303 100644 --- a/rpcs3/Emu/Cell/Modules/sysPrxForUser.h +++ b/rpcs3/Emu/Cell/Modules/sysPrxForUser.h @@ -58,8 +58,8 @@ struct sys_crash_dump_log_area_info_t struct sys_lwcond_t; struct sys_lwcond_attribute_t; -error_code sys_lwcond_create(vm::ptr lwcond, vm::ptr lwmutex, vm::ptr attr); -error_code sys_lwcond_destroy(vm::ptr lwcond); +error_code sys_lwcond_create(ppu_thread& ppu, vm::ptr lwcond, vm::ptr lwmutex, vm::ptr attr); +error_code sys_lwcond_destroy(ppu_thread& ppu, vm::ptr lwcond); error_code sys_lwcond_signal(ppu_thread& CPU, vm::ptr lwcond); error_code sys_lwcond_signal_all(ppu_thread& CPU, vm::ptr lwcond); error_code sys_lwcond_signal_to(ppu_thread& CPU, vm::ptr lwcond, u32 ppu_thread_id); diff --git a/rpcs3/Emu/Cell/Modules/sys_lwcond_.cpp b/rpcs3/Emu/Cell/Modules/sys_lwcond_.cpp index e880284f1a..a143c0670b 100644 --- a/rpcs3/Emu/Cell/Modules/sys_lwcond_.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_lwcond_.cpp @@ -11,7 +11,7 @@ extern logs::channel sysPrxForUser; -error_code sys_lwcond_create(vm::ptr lwcond, vm::ptr lwmutex, vm::ptr attr) +error_code sys_lwcond_create(ppu_thread& ppu, vm::ptr lwcond, vm::ptr lwmutex, vm::ptr attr) { sysPrxForUser.trace("sys_lwcond_create(lwcond=*0x%x, lwmutex=*0x%x, attr=*0x%x)", lwcond, lwmutex, attr); @@ -20,7 +20,7 @@ error_code sys_lwcond_create(vm::ptr lwcond, vm::ptrpshared = SYS_SYNC_NOT_PROCESS_SHARED; attrs->name_u64 = attr->name_u64; - if (auto res = g_cfg.core.hle_lwmutex ? sys_cond_create(out_id, lwmutex->sleep_queue, attrs) : _sys_lwcond_create(out_id, lwmutex->sleep_queue, lwcond, attr->name_u64, 0)) + if (auto res = g_cfg.core.hle_lwmutex ? sys_cond_create(ppu, out_id, lwmutex->sleep_queue, attrs) : _sys_lwcond_create(out_id, lwmutex->sleep_queue, lwcond, attr->name_u64, 0)) { return res; } @@ -30,13 +30,13 @@ error_code sys_lwcond_create(vm::ptr lwcond, vm::ptr lwcond) +error_code sys_lwcond_destroy(ppu_thread& ppu, vm::ptr lwcond) { sysPrxForUser.trace("sys_lwcond_destroy(lwcond=*0x%x)", lwcond); if (g_cfg.core.hle_lwmutex) { - return sys_cond_destroy(lwcond->lwcond_queue); + return sys_cond_destroy(ppu, lwcond->lwcond_queue); } if (error_code res = _sys_lwcond_destroy(lwcond->lwcond_queue)) diff --git a/rpcs3/Emu/Cell/Modules/sys_mempool.cpp b/rpcs3/Emu/Cell/Modules/sys_mempool.cpp index c5fa96f271..db0d7e762c 100644 --- a/rpcs3/Emu/Cell/Modules/sys_mempool.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_mempool.cpp @@ -102,7 +102,7 @@ s32 sys_mempool_create(ppu_thread& ppu, vm::ptr mempool, vm::ptr< condAttr->ipc_key = 0; // Also no idea what this is strcpy_trunc(condAttr->name, "mp_c" + std::to_string(*mempool)); - ret = sys_cond_create(condid, *mutexid, condAttr); + ret = sys_cond_create(ppu, condid, *mutexid, condAttr); if (ret != CELL_OK) { // TODO: Better exception handling. fmt::throw_exception("mempool %x failed to create condition variable", mempool); @@ -126,7 +126,7 @@ void sys_mempool_destroy(ppu_thread& ppu, sys_mempool_t mempool) idm::remove(mempool); sys_mutex_unlock(ppu, mutexid); sys_mutex_destroy(mutexid); - sys_cond_destroy(condid); + sys_cond_destroy(ppu, condid); } else { diff --git a/rpcs3/Emu/Cell/lv2/sys_cond.cpp b/rpcs3/Emu/Cell/lv2/sys_cond.cpp index ccb02e26b4..7671ffe17e 100644 --- a/rpcs3/Emu/Cell/lv2/sys_cond.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_cond.cpp @@ -9,16 +9,16 @@ #include "sys_mutex.h" #include "sys_cond.h" - - LOG_CHANNEL(sys_cond); template<> DECLARE(ipc_manager::g_ipc) {}; extern u64 get_system_time(); -error_code sys_cond_create(vm::ptr cond_id, u32 mutex_id, vm::ptr attr) +error_code sys_cond_create(ppu_thread& ppu, vm::ptr cond_id, u32 mutex_id, vm::ptr attr) { + vm::temporary_unlock(ppu); + sys_cond.warning("sys_cond_create(cond_id=*0x%x, mutex_id=0x%x, attr=*0x%x)", cond_id, mutex_id, attr); auto mutex = idm::get(mutex_id); @@ -45,8 +45,10 @@ error_code sys_cond_create(vm::ptr cond_id, u32 mutex_id, vm::ptr(cond_id, [&](lv2_cond& cond) -> CellError @@ -74,6 +76,8 @@ error_code sys_cond_destroy(u32 cond_id) error_code sys_cond_signal(ppu_thread& ppu, u32 cond_id) { + vm::temporary_unlock(ppu); + sys_cond.trace("sys_cond_signal(cond_id=0x%x)", cond_id); const auto cond = idm::check(cond_id, [](lv2_cond& cond) -> cpu_thread* @@ -111,6 +115,8 @@ error_code sys_cond_signal(ppu_thread& ppu, u32 cond_id) error_code sys_cond_signal_all(ppu_thread& ppu, u32 cond_id) { + vm::temporary_unlock(ppu); + sys_cond.trace("sys_cond_signal_all(cond_id=0x%x)", cond_id); const auto cond = idm::check(cond_id, [](lv2_cond& cond) @@ -150,6 +156,8 @@ error_code sys_cond_signal_all(ppu_thread& ppu, u32 cond_id) error_code sys_cond_signal_to(ppu_thread& ppu, u32 cond_id, u32 thread_id) { + vm::temporary_unlock(ppu); + sys_cond.trace("sys_cond_signal_to(cond_id=0x%x, thread_id=0x%x)", cond_id, thread_id); const auto cond = idm::check(cond_id, [&](lv2_cond& cond) -> cpu_thread* @@ -201,6 +209,8 @@ error_code sys_cond_signal_to(ppu_thread& ppu, u32 cond_id, u32 thread_id) error_code sys_cond_wait(ppu_thread& ppu, u32 cond_id, u64 timeout) { + vm::temporary_unlock(ppu); + sys_cond.trace("sys_cond_wait(cond_id=0x%x, timeout=%lld)", cond_id, timeout); const auto cond = idm::get(cond_id, [&](lv2_cond& cond) diff --git a/rpcs3/Emu/Cell/lv2/sys_cond.h b/rpcs3/Emu/Cell/lv2/sys_cond.h index 58363e3d4b..d83e92f55e 100644 --- a/rpcs3/Emu/Cell/lv2/sys_cond.h +++ b/rpcs3/Emu/Cell/lv2/sys_cond.h @@ -50,8 +50,8 @@ class ppu_thread; // Syscalls -error_code sys_cond_create(vm::ptr cond_id, u32 mutex_id, vm::ptr attr); -error_code sys_cond_destroy(u32 cond_id); +error_code sys_cond_create(ppu_thread& ppu, vm::ptr cond_id, u32 mutex_id, vm::ptr attr); +error_code sys_cond_destroy(ppu_thread& ppu, u32 cond_id); error_code sys_cond_wait(ppu_thread& ppu, u32 cond_id, u64 timeout); error_code sys_cond_signal(ppu_thread& ppu, u32 cond_id); error_code sys_cond_signal_all(ppu_thread& ppu, u32 cond_id);