diff --git a/rpcs3/Emu/Cell/lv2/sys_prx.cpp b/rpcs3/Emu/Cell/lv2/sys_prx.cpp index 44980dc627..76e206fbbb 100644 --- a/rpcs3/Emu/Cell/lv2/sys_prx.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_prx.cpp @@ -236,10 +236,9 @@ error_code _sys_prx_start_module(u32 id, u64 flags, vm::ptris_started) - // return CELL_PRX_ERROR_ALREADY_STARTED; + if (prx->is_started.exchange(true)) + return not_an_error(CELL_PRX_ERROR_ALREADY_STARTED); - //prx->is_started = true; pOpt->entry.set(prx->start ? prx->start.addr() : ~0ull); pOpt->entry2.set(prx->prologue ? prx->prologue.addr() : ~0ull); return CELL_OK; @@ -256,10 +255,9 @@ error_code _sys_prx_stop_module(u32 id, u64 flags, vm::ptris_started) - // return CELL_PRX_ERROR_ALREADY_STOPPED; + if (!prx->is_started.exchange(false)) + return not_an_error(CELL_PRX_ERROR_ALREADY_STOPPED); - //prx->is_started = false; pOpt->entry.set(prx->stop ? prx->stop.addr() : ~0ull); pOpt->entry2.set(prx->epilogue ? prx->epilogue.addr() : ~0ull); diff --git a/rpcs3/Emu/Cell/lv2/sys_prx.h b/rpcs3/Emu/Cell/lv2/sys_prx.h index 26643b517d..ffc967e604 100644 --- a/rpcs3/Emu/Cell/lv2/sys_prx.h +++ b/rpcs3/Emu/Cell/lv2/sys_prx.h @@ -119,7 +119,7 @@ struct lv2_prx final : lv2_obj, ppu_module { static const u32 id_base = 0x23000000; - bool is_started = false; + atomic_t is_started = false; std::unordered_map specials; std::unordered_map imports;