From 488c4d198fc63916cad2adbef4085c0480080cc3 Mon Sep 17 00:00:00 2001 From: Jake Date: Tue, 23 Jan 2018 20:37:29 +0100 Subject: [PATCH] trophyfix --- rpcs3/Emu/Cell/Modules/cellSysutil.cpp | 17 +++++++++++++++++ rpcs3/Emu/Cell/Modules/cellSysutil.h | 1 + rpcs3/Emu/Cell/Modules/sceNpTrophy.cpp | 26 +++++++++++++++++--------- rpcs3/rpcs3qt/msg_dialog_frame.cpp | 1 - 4 files changed, 35 insertions(+), 10 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellSysutil.cpp b/rpcs3/Emu/Cell/Modules/cellSysutil.cpp index 6e28e8ce43..33306cc06b 100644 --- a/rpcs3/Emu/Cell/Modules/cellSysutil.cpp +++ b/rpcs3/Emu/Cell/Modules/cellSysutil.cpp @@ -2,6 +2,7 @@ #include "Emu/System.h" #include "Emu/IdManager.h" #include "Emu/Cell/PPUModule.h" +#include "Emu/Cell/lv2/sys_sync.h" #include "cellSysutil.h" @@ -46,6 +47,22 @@ extern void sysutil_register_cb(std::function&& cb) cbm->registered.push(std::move(cb)); } +extern s32 sysutil_register_cb_wait(ppu_thread& caller, std::function&& cb) { + atomic_t wait{true}; + u32 rtn = -1; + + sysutil_register_cb([&](ppu_thread& ppu) -> s32 { + rtn = cb(ppu); + wait = false; + caller.notify(); + return CELL_OK; + }); + + lv2_obj::sleep(caller); + while (wait && !Emu.IsStopped()) thread_ctrl::wait(); + return rtn; +} + extern void sysutil_send_system_cmd(u64 status, u64 param) { if (const auto cbm = fxm::get()) diff --git a/rpcs3/Emu/Cell/Modules/cellSysutil.h b/rpcs3/Emu/Cell/Modules/cellSysutil.h index 1430c51c0a..d4f4712dba 100644 --- a/rpcs3/Emu/Cell/Modules/cellSysutil.h +++ b/rpcs3/Emu/Cell/Modules/cellSysutil.h @@ -199,3 +199,4 @@ struct CellSysCacheParam extern void sysutil_register_cb(std::function&&); extern void sysutil_send_system_cmd(u64 status, u64 param); +extern s32 sysutil_register_cb_wait(ppu_thread&, std::function&&); diff --git a/rpcs3/Emu/Cell/Modules/sceNpTrophy.cpp b/rpcs3/Emu/Cell/Modules/sceNpTrophy.cpp index af0ae9ad81..3f6e50f094 100644 --- a/rpcs3/Emu/Cell/Modules/sceNpTrophy.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNpTrophy.cpp @@ -2,6 +2,7 @@ #include "Emu/System.h" #include "Emu/IdManager.h" #include "Emu/Cell/PPUModule.h" +#include "Emu/Cell/Modules/cellSysutil.h" #include "restore_new.h" #include "Utilities/rXml.h" @@ -315,16 +316,23 @@ error_code sceNpTrophyRegisterContext(ppu_thread& ppu, u32 context, u32 handle, tropusr->Load(trophyUsrPath, trophyConfPath); ctxt->tropusr.reset(tropusr); - // TODO: Callbacks - if (statusCb(ppu, context, SCE_NP_TROPHY_STATUS_INSTALLED, 100, 100, arg) < 0) - { - return SCE_NP_TROPHY_ERROR_PROCESSING_ABORTED; - } + s32 rtn = sysutil_register_cb_wait(ppu, [=](ppu_thread& ppu) -> s32 { + return statusCb(ppu, context, SCE_NP_TROPHY_STATUS_INSTALLED, 100, 100, arg); + }); - if (statusCb(ppu, context, SCE_NP_TROPHY_STATUS_PROCESSING_COMPLETE, 100, 100, arg) < 0) - { - return SCE_NP_TROPHY_ERROR_PROCESSING_ABORTED; - } + if (rtn < 0) + return SCE_NP_TROPHY_ERROR_PROCESSING_ABORTED; + + rtn = sysutil_register_cb_wait(ppu, [=](ppu_thread& ppu) -> s32 { + return statusCb(ppu, context, SCE_NP_TROPHY_STATUS_PROCESSING_COMPLETE, 100, 100, arg); + }); + + if (rtn < 0) + return SCE_NP_TROPHY_ERROR_PROCESSING_ABORTED; + + rtn = sysutil_register_cb_wait(ppu, [=](ppu_thread& ppu) -> s32 { + return CELL_OK; + }); return CELL_OK; } diff --git a/rpcs3/rpcs3qt/msg_dialog_frame.cpp b/rpcs3/rpcs3qt/msg_dialog_frame.cpp index a479818316..7624f9ef9b 100644 --- a/rpcs3/rpcs3qt/msg_dialog_frame.cpp +++ b/rpcs3/rpcs3qt/msg_dialog_frame.cpp @@ -130,7 +130,6 @@ void msg_dialog_frame::Create(const std::string& msg) connect(m_button_ok, &QAbstractButton::clicked, [=] { on_close(CELL_MSGDIALOG_BUTTON_OK); - m_dialog->accept(); }); }