From dc843c258df1851908125ae4faa48e76e2839f24 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Wed, 10 Nov 2021 19:30:25 -0800 Subject: [PATCH] Display: Prevent lock around listener calls. Fixes #15123, crash in Bleach: Soul Carnival 2. --- Core/HLE/sceDisplay.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/Core/HLE/sceDisplay.cpp b/Core/HLE/sceDisplay.cpp index 63f6f58ea7..7c8b7099e3 100644 --- a/Core/HLE/sceDisplay.cpp +++ b/Core/HLE/sceDisplay.cpp @@ -371,15 +371,23 @@ void __DisplayForgetFlip(FlipCallback callback, void *userdata) { } static void DisplayFireVblank() { - std::lock_guard guard(listenersLock); - for (VblankCallback cb : vblankListeners) { + std::vector toCall = []{ + std::lock_guard guard(listenersLock); + return vblankListeners; + }(); + + for (VblankCallback cb : toCall) { cb(); } } static void DisplayFireFlip() { - std::lock_guard guard(listenersLock); - for (auto cb : flipListeners) { + std::vector toCall = [] { + std::lock_guard guard(listenersLock); + return flipListeners; + }(); + + for (FlipListener cb : toCall) { cb.first(cb.second); } }