[vlc-devel] [PATCH 1/2] lua: Fix deadlock when deactivating extension due to timeout.

Hugo Beauzée-Luyssen hugo at beauzee.fr
Mon Mar 27 17:03:33 CEST 2017


lua_ExecuteFunctionVa is not meant to be called with the command_lock
held.
This partially reverts 7a94f2e6b22bad255ddcca6e095ed33bc4803e45
Fix #17565
---
 modules/lua/extension.c        | 6 +++---
 modules/lua/extension_thread.c | 4 +++-
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/modules/lua/extension.c b/modules/lua/extension.c
index 92c2eb7fa7..32009cc0ba 100644
--- a/modules/lua/extension.c
+++ b/modules/lua/extension.c
@@ -1223,8 +1223,8 @@ static void WatchTimerCallback( void *data )
                 vlc_dialog_release( p_mgr, p_ext->p_sys->p_progress_id );
                 p_ext->p_sys->p_progress_id = NULL;
             }
-            KillExtension( p_mgr, p_ext );
             vlc_mutex_unlock( &p_ext->p_sys->command_lock );
+            KillExtension( p_mgr, p_ext );
             return;
         }
 
@@ -1239,8 +1239,8 @@ static void WatchTimerCallback( void *data )
                                          p_ext->psz_title );
         if( p_ext->p_sys->p_progress_id == NULL )
         {
-            KillExtension( p_mgr, p_ext );
             vlc_mutex_unlock( &p_ext->p_sys->command_lock );
+            KillExtension( p_mgr, p_ext );
             return;
         }
         vlc_timer_schedule( p_ext->p_sys->timer, false, 100000, 0 );
@@ -1251,8 +1251,8 @@ static void WatchTimerCallback( void *data )
         {
             vlc_dialog_release( p_mgr, p_ext->p_sys->p_progress_id );
             p_ext->p_sys->p_progress_id = NULL;
-            KillExtension( p_mgr, p_ext );
             vlc_mutex_unlock( &p_ext->p_sys->command_lock );
+            KillExtension( p_mgr, p_ext );
             return;
         }
         vlc_timer_schedule( p_ext->p_sys->timer, false, 100000, 0 );
diff --git a/modules/lua/extension_thread.c b/modules/lua/extension_thread.c
index affa65912b..6cf3ca6e92 100644
--- a/modules/lua/extension_thread.c
+++ b/modules/lua/extension_thread.c
@@ -153,8 +153,8 @@ int Deactivate( extensions_manager_t *p_mgr, extension_t *p_ext )
         // Extension is stuck, kill it now
         vlc_dialog_release( p_mgr, p_ext->p_sys->p_progress_id );
         p_ext->p_sys->p_progress_id = NULL;
-        KillExtension( p_mgr, p_ext );
         vlc_mutex_unlock( &p_ext->p_sys->command_lock );
+        KillExtension( p_mgr, p_ext );
         return VLC_SUCCESS;
     }
 
@@ -217,8 +217,10 @@ void KillExtension( extensions_manager_t *p_mgr, extension_t *p_ext )
 {
     msg_Dbg( p_mgr, "Killing extension now" );
     lua_ExtensionDeactivate( p_mgr, p_ext );
+    vlc_mutex_lock( &p_ext->p_sys->command_lock );
     p_ext->p_sys->b_exiting = true;
     vlc_cond_signal( &p_ext->p_sys->wait );
+    vlc_mutex_unlock( &p_ext->p_sys->command_lock );
     RemoveActivated( p_mgr, p_ext );
 }
 
-- 
2.11.0



More information about the vlc-devel mailing list