[vlc-commits] [Git][videolan/vlc][master] 2 commits: macosx: Correctly release dialog windows created by extension dialog provider
Felix Paul Kühne (@fkuehne)
gitlab at videolan.org
Tue Mar 24 23:10:51 UTC 2026
Felix Paul Kühne pushed to branch master at VideoLAN / VLC
Commits:
e0b8d616 by Claudio Cambra at 2026-03-24T22:01:07+01:00
macosx: Correctly release dialog windows created by extension dialog provider
Signed-off-by: Claudio Cambra <developer at claudiocambra.com>
- - - - -
06c13ef3 by Claudio Cambra at 2026-03-24T22:01:07+01:00
macosx: Add thread safety when closing extension dialog windows
Signed-off-by: Claudio Cambra <developer at claudiocambra.com>
- - - - -
1 changed file:
- modules/gui/macosx/windows/extensions/VLCExtensionsDialogProvider.m
Changes:
=====================================
modules/gui/macosx/windows/extensions/VLCExtensionsDialogProvider.m
=====================================
@@ -386,7 +386,14 @@ static void extensionDialogCallback(extension_dialog_t *p_ext_dialog,
VLCDialogWindow *window = sender;
extension_dialog_t *dialog = [window dialog];
extension_DialogClosed(dialog);
- dialog->p_sys_intf = NULL;
+
+ vlc_mutex_lock(&dialog->lock);
+ if (dialog->p_sys_intf) {
+ CFRelease(dialog->p_sys_intf);
+ dialog->p_sys_intf = NULL;
+ }
+ vlc_mutex_unlock(&dialog->lock);
+
return YES;
}
@@ -467,6 +474,7 @@ static void extensionDialogCallback(extension_dialog_t *p_ext_dialog,
styleMask:NSTitledWindowMask | NSClosableWindowMask | NSResizableWindowMask
backing:NSBackingStoreBuffered
defer:NO];
+ [dialogWindow setReleasedWhenClosed:NO];
[dialogWindow setDelegate:self];
[dialogWindow setDialog:p_dialog];
[dialogWindow setTitle:toNSStr(p_dialog->psz_title)];
@@ -496,9 +504,6 @@ static void extensionDialogCallback(extension_dialog_t *p_ext_dialog,
{
assert(p_dialog);
- /* FIXME: Creating the dialog, we CFBridgingRetain p_sys_intf but we can't
- * just CFBridgingRelease it here, as that causes a crash.
- */
VLCDialogWindow *dialogWindow = (__bridge VLCDialogWindow*)p_dialog->p_sys_intf;
if (!dialogWindow) {
msg_Warn(getIntf(), "dialog window not found");
@@ -509,6 +514,13 @@ static void extensionDialogCallback(extension_dialog_t *p_ext_dialog,
[dialogWindow close];
dialogWindow = nil;
+ /* Release the reference retained by CFBridgingRetain in
+ * createExtensionDialog. We use CFRelease rather than
+ * CFBridgingRelease to avoid transferring ownership back
+ * to ARC, which would crash as the pointer is still live
+ * on the call stack.
+ */
+ CFRelease(p_dialog->p_sys_intf);
p_dialog->p_sys_intf = NULL;
vlc_cond_signal(&p_dialog->cond);
return VLC_SUCCESS;
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/c327b544acd33b71bf40f4b611b4c2941e2718eb...06c13ef3e6962ce3c6deb531338d153edb8d5d68
--
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/c327b544acd33b71bf40f4b611b4c2941e2718eb...06c13ef3e6962ce3c6deb531338d153edb8d5d68
You're receiving this email because of your account on code.videolan.org.
More information about the vlc-commits
mailing list