]> git.sesse.net Git - vlc/commitdiff
Extensions/Qt: fix the deactivation race condition
authorJean-Philippe André <jpeg@videolan.org>
Wed, 3 Feb 2010 22:56:32 +0000 (23:56 +0100)
committerJean-Philippe André <jpeg@videolan.org>
Thu, 4 Feb 2010 00:54:25 +0000 (01:54 +0100)
Bind signal EDP::destroyed() to Dialog::deleteLater()
Clear p_sys_intf variable of the dialog
Signal condition when this is done

modules/gui/qt4/dialogs/extensions.cpp
modules/gui/qt4/dialogs/extensions.hpp
modules/gui/qt4/extensions_manager.cpp

index 829dc342564f19ea9f71dc4706faa205e529a770..c2afd8bca869e1bc0f72b681d9217b5876773c75 100644 (file)
@@ -60,6 +60,7 @@ ExtensionsDialogProvider::ExtensionsDialogProvider( intf_thread_t *_p_intf,
 
 ExtensionsDialogProvider::~ExtensionsDialogProvider()
 {
+    msg_Dbg( p_intf, "ExtensionsDialogProvider is quitting..." );
     var_DelCallback( p_intf, "dialog-extension", DialogCallback, NULL );
 }
 
@@ -87,6 +88,7 @@ int ExtensionsDialogProvider::DestroyExtDialog( extension_dialog_t *p_dialog )
         return VLC_EGENERIC;
     delete dialog;
     p_dialog->p_sys_intf = NULL;
+    vlc_cond_signal( &p_dialog->cond );
     return VLC_SUCCESS;
 }
 
@@ -172,6 +174,8 @@ ExtensionDialog::ExtensionDialog( intf_thread_t *_p_intf,
          , p_dialog( _p_dialog ), has_lock(false)
 {
     assert( p_dialog );
+    CONNECT( ExtensionsDialogProvider::getInstance(), destroyed(),
+             this, deleteLater() );
 
     msg_Dbg( p_intf, "Creating a new dialog: '%s'", p_dialog->psz_title );
 #if HAS_QT45
@@ -197,7 +201,11 @@ ExtensionDialog::ExtensionDialog( intf_thread_t *_p_intf,
 ExtensionDialog::~ExtensionDialog()
 {
     msg_Dbg( p_intf, "Deleting extension dialog '%s'", qtu(windowTitle()) );
+    /* Delete all widgets */
+    extension_widget_t *p_widget;
+    p_dialog->b_kill = true;
     p_dialog->p_sys_intf = NULL;
+    vlc_cond_signal( &p_dialog->cond );
 }
 
 QWidget* ExtensionDialog::CreateWidget( extension_widget_t *p_widget )
@@ -634,20 +642,24 @@ QWidget* ExtensionDialog::UpdateWidget( extension_widget_t *p_widget )
     }
 }
 
-void ExtensionDialog::DestroyWidget( extension_widget_t *p_widget )
+void ExtensionDialog::DestroyWidget( extension_widget_t *p_widget,
+                                     bool b_cond )
 {
     assert( p_widget && p_widget->b_kill );
     QWidget *widget = static_cast< QWidget* >( p_widget->p_sys_intf );
     delete widget;
     p_widget->p_sys_intf = NULL;
+    if( b_cond )
+        vlc_cond_signal( &p_dialog->cond );
 }
 
 /** Implement closeEvent() in order to intercept the event */
 void ExtensionDialog::closeEvent( QCloseEvent *event )
 {
     assert( p_dialog != NULL );
+    msg_Dbg( p_intf, "Dialog '%s' received a closeEvent",
+             p_dialog->psz_title );
     extension_DialogClosed( p_dialog );
-    event->accept();
-    emit destroyDialog( p_dialog );
+    p_dialog->p_sys_intf = NULL;
 }
 
index cc8a32de89c2464974d2fe2c3fd9a7e573b51d90..0313b46f6971a41b29c90ca48990abe02aefc814 100644 (file)
@@ -103,7 +103,7 @@ private:
 
     QWidget *CreateWidget( extension_widget_t *p_widget );
     QWidget *UpdateWidget( extension_widget_t *p_widget );
-    void DestroyWidget( extension_widget_t *p_widget );
+    void DestroyWidget( extension_widget_t *p_widget, bool b_cond = true );
 
 protected:
     virtual void closeEvent( QCloseEvent* );
index d8e03b1e065b705927ab55bb2d3d24c2c8847dc6..653627c4241ed1eeb8dbe55d886348814fc2a39d 100644 (file)
@@ -55,6 +55,7 @@ ExtensionsManager::ExtensionsManager( intf_thread_t *_p_intf, QObject *parent )
 
 ExtensionsManager::~ExtensionsManager()
 {
+    ExtensionsDialogProvider::killInstance();
     if( p_extensions_manager )
     {
         module_unneed( p_extensions_manager, p_extensions_manager->p_module );