From dfce9b929aa2cd6bc63e855375daf94c2942ad4e Mon Sep 17 00:00:00 2001 From: Norihiro Kamae Date: Tue, 15 Aug 2023 13:43:22 +0900 Subject: [PATCH] UI: Fix crash at resizing display followed by destruction on macOS The resize event was triggered during the shtudown of OBS. A commit 9f330050ef moves the actual resize code in `gl_update` to the main thread without synchronizing between the main thread and the graphics thread. When the display context is destroyed just after the resizing, the delayed resize code can read the destroyed display context. As a workaround, this commit will destroy the display context at the earlier timing of the shutdown process. --- UI/window-basic-main.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 02b1dafed..50f0fa53f 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -5128,6 +5128,16 @@ void OBSBasic::closeEvent(QCloseEvent *event) closing = true; + /* While closing, a resize event to OBSQTDisplay could be triggered. + * The graphics thread on macOS dispatches a lambda function to be + * executed asynchronously in the main thread. However, the display is + * sometimes deleted before the lambda function is actually executed. + * To avoid such a case, destroy displays earlier than others such as + * deleting browser docks. */ + ui->preview->DestroyDisplay(); + if (program) + program->DestroyDisplay(); + if (outputHandler->VirtualCamActive()) outputHandler->StopVirtualCam();