mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-02-14 06:40:53 +00:00
sys_cond: add vm::temporary_unlock
This commit is contained in:
parent
5d45a3e47d
commit
89a31292dc
@ -1147,7 +1147,7 @@ s32 _spurs::initialize(ppu_thread& ppu, vm::ptr<CellSpurs> 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<CellSpurs> 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<CellSpurs> 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<CellSpurs> 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;
|
||||
|
@ -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<sys_lwcond_t> lwcond, vm::ptr<sys_lwmutex_t> lwmutex, vm::ptr<sys_lwcond_attribute_t> attr);
|
||||
error_code sys_lwcond_destroy(vm::ptr<sys_lwcond_t> lwcond);
|
||||
error_code sys_lwcond_create(ppu_thread& ppu, vm::ptr<sys_lwcond_t> lwcond, vm::ptr<sys_lwmutex_t> lwmutex, vm::ptr<sys_lwcond_attribute_t> attr);
|
||||
error_code sys_lwcond_destroy(ppu_thread& ppu, vm::ptr<sys_lwcond_t> lwcond);
|
||||
error_code sys_lwcond_signal(ppu_thread& CPU, vm::ptr<sys_lwcond_t> lwcond);
|
||||
error_code sys_lwcond_signal_all(ppu_thread& CPU, vm::ptr<sys_lwcond_t> lwcond);
|
||||
error_code sys_lwcond_signal_to(ppu_thread& CPU, vm::ptr<sys_lwcond_t> lwcond, u32 ppu_thread_id);
|
||||
|
@ -11,7 +11,7 @@
|
||||
|
||||
extern logs::channel sysPrxForUser;
|
||||
|
||||
error_code sys_lwcond_create(vm::ptr<sys_lwcond_t> lwcond, vm::ptr<sys_lwmutex_t> lwmutex, vm::ptr<sys_lwcond_attribute_t> attr)
|
||||
error_code sys_lwcond_create(ppu_thread& ppu, vm::ptr<sys_lwcond_t> lwcond, vm::ptr<sys_lwmutex_t> lwmutex, vm::ptr<sys_lwcond_attribute_t> 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<sys_lwcond_t> lwcond, vm::ptr<sys_lwmutex_t
|
||||
attrs->pshared = 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<sys_lwcond_t> lwcond, vm::ptr<sys_lwmutex_t
|
||||
return CELL_OK;
|
||||
}
|
||||
|
||||
error_code sys_lwcond_destroy(vm::ptr<sys_lwcond_t> lwcond)
|
||||
error_code sys_lwcond_destroy(ppu_thread& ppu, vm::ptr<sys_lwcond_t> 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))
|
||||
|
@ -102,7 +102,7 @@ s32 sys_mempool_create(ppu_thread& ppu, vm::ptr<sys_mempool_t> 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<memory_pool_t>(mempool);
|
||||
sys_mutex_unlock(ppu, mutexid);
|
||||
sys_mutex_destroy(mutexid);
|
||||
sys_cond_destroy(condid);
|
||||
sys_cond_destroy(ppu, condid);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -9,16 +9,16 @@
|
||||
#include "sys_mutex.h"
|
||||
#include "sys_cond.h"
|
||||
|
||||
|
||||
|
||||
LOG_CHANNEL(sys_cond);
|
||||
|
||||
template<> DECLARE(ipc_manager<lv2_cond, u64>::g_ipc) {};
|
||||
|
||||
extern u64 get_system_time();
|
||||
|
||||
error_code sys_cond_create(vm::ptr<u32> cond_id, u32 mutex_id, vm::ptr<sys_cond_attribute_t> attr)
|
||||
error_code sys_cond_create(ppu_thread& ppu, vm::ptr<u32> cond_id, u32 mutex_id, vm::ptr<sys_cond_attribute_t> 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<lv2_obj, lv2_mutex>(mutex_id);
|
||||
@ -45,8 +45,10 @@ error_code sys_cond_create(vm::ptr<u32> cond_id, u32 mutex_id, vm::ptr<sys_cond_
|
||||
return CELL_OK;
|
||||
}
|
||||
|
||||
error_code sys_cond_destroy(u32 cond_id)
|
||||
error_code sys_cond_destroy(ppu_thread& ppu, u32 cond_id)
|
||||
{
|
||||
vm::temporary_unlock(ppu);
|
||||
|
||||
sys_cond.warning("sys_cond_destroy(cond_id=0x%x)", cond_id);
|
||||
|
||||
const auto cond = idm::withdraw<lv2_obj, lv2_cond>(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<lv2_obj, lv2_cond>(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<lv2_obj, lv2_cond>(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<lv2_obj, lv2_cond>(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<lv2_obj, lv2_cond>(cond_id, [&](lv2_cond& cond)
|
||||
|
@ -50,8 +50,8 @@ class ppu_thread;
|
||||
|
||||
// Syscalls
|
||||
|
||||
error_code sys_cond_create(vm::ptr<u32> cond_id, u32 mutex_id, vm::ptr<sys_cond_attribute_t> attr);
|
||||
error_code sys_cond_destroy(u32 cond_id);
|
||||
error_code sys_cond_create(ppu_thread& ppu, vm::ptr<u32> cond_id, u32 mutex_id, vm::ptr<sys_cond_attribute_t> 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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user