diff --git a/rpcs3/Emu/Cell/Modules/cellSysutil.cpp b/rpcs3/Emu/Cell/Modules/cellSysutil.cpp index ead621394d..4873376ad6 100644 --- a/rpcs3/Emu/Cell/Modules/cellSysutil.cpp +++ b/rpcs3/Emu/Cell/Modules/cellSysutil.cpp @@ -20,6 +20,22 @@ struct sysutil_cb_manager std::array, vm::ptr>, 4> callbacks; std::queue> registered; + + std::function get_cb() + { + std::lock_guard lock(mutex); + + if (registered.empty()) + { + return nullptr; + } + + auto func = std::move(registered.front()); + + registered.pop(); + + return func; + } }; extern void sysutil_register_cb(std::function&& cb) @@ -211,23 +227,14 @@ s32 cellSysutilCheckCallback(ppu_thread& ppu) const auto cbm = fxm::get_always(); - while (true) + while (auto&& func = cbm->get_cb()) { - std::lock_guard lock(cbm->mutex); - - if (cbm->registered.empty()) - { - break; - } - - const auto func = std::move(cbm->registered.front()); - - cbm->registered.pop(); - if (s32 res = func(ppu)) { return res; } + + CHECK_EMU_STATUS; } return CELL_OK;