]> git.sesse.net Git - vlc/commitdiff
- Fix playlist deadlock between Timer and Playlist stuff
authorRémi Denis-Courmont <rem@videolan.org>
Fri, 1 Apr 2005 21:57:09 +0000 (21:57 +0000)
committerRémi Denis-Courmont <rem@videolan.org>
Fri, 1 Apr 2005 21:57:09 +0000 (21:57 +0000)
There are still other deadlocks in wx though

modules/gui/wxwindows/playlist.cpp
modules/gui/wxwindows/timer.cpp
modules/gui/wxwindows/wxwindows.h

index 4c1da0e8dc08433ae1f31392a2e84c4e50c8f6cd..e239f47a9fa539fea00af59801579c8e6874ef94 100644 (file)
@@ -1,7 +1,7 @@
 /*****************************************************************************
  * playlist.cpp : wxWindows plugin for vlc
  *****************************************************************************
- * Copyright (C) 2000-2004 VideoLAN
+ * Copyright (C) 2000-2005 VideoLAN
  * $Id$
  *
  * Authors: Olivier Teulière <ipkiss@via.ecp.fr>
@@ -838,7 +838,7 @@ void Playlist::Rebuild( vlc_bool_t b_root )
         var_DelCallback( p_playlist, "item-deleted", ItemDeleted, this );
 
         /* ...and rebuild it */
-        vlc_mutex_lock( &p_playlist->object_lock );
+        LockPlaylist( p_intf->p_sys, p_playlist );
     }
 
     p_view = playlist_ViewFind( p_playlist, i_current_view ); /* FIXME */
@@ -882,7 +882,7 @@ void Playlist::Rebuild( vlc_bool_t b_root )
         var_AddCallback( p_playlist, "item-append", ItemAppended, this );
         var_AddCallback( p_playlist, "item-deleted", ItemDeleted, this );
 
-        vlc_mutex_unlock( &p_playlist->object_lock );
+        UnlockPlaylist( p_intf->p_sys, p_playlist );
     }
     vlc_object_release( p_playlist );
 }
@@ -1066,7 +1066,7 @@ void Playlist::OnSort( wxCommandEvent& event )
     {
         return;
     }
-    vlc_mutex_lock( &p_playlist->object_lock );
+    LockPlaylist( p_intf->p_sys, p_playlist );
     switch( event.GetId() )
     {
         case SortTitle_Event:
@@ -1077,7 +1077,7 @@ void Playlist::OnSort( wxCommandEvent& event )
             playlist_RecursiveNodeSort( p_playlist, p_wxitem->p_item,
                                         SORT_TITLE_NODES_FIRST, ORDER_REVERSE );
     }
-    vlc_mutex_unlock( &p_playlist->object_lock );
+    UnlockPlaylist( p_intf->p_sys, p_playlist );
 
     vlc_object_release( p_playlist );
     Rebuild( VLC_TRUE );
@@ -1557,10 +1557,10 @@ void Playlist::OnPopupSort( wxMenuEvent& event )
 
         if( p_playlist )
         {
-            vlc_mutex_lock( &p_playlist->object_lock );
+            LockPlaylist( p_intf->p_sys, p_playlist );
             playlist_RecursiveNodeSort( p_playlist, p_wxitem->p_item,
                                         SORT_TITLE_NODES_FIRST, ORDER_NORMAL );
-            vlc_mutex_unlock( &p_playlist->object_lock );
+            UnlockPlaylist( p_intf->p_sys, p_playlist );
 
             treectrl->DeleteChildren( i_popup_item );
             UpdateNodeChildren( p_playlist, p_wxitem->p_item, i_popup_item );
index 3ca4104cb7e19a9704256459ae96c7f309ba9ef4..4cb27b4786abe6c78941c9e407d3108a56f26588 100644 (file)
@@ -1,7 +1,7 @@
 /*****************************************************************************
  * timer.cpp : wxWindows plugin for vlc
  *****************************************************************************
- * Copyright (C) 2000-2003 VideoLAN
+ * Copyright (C) 2000-2005 VideoLAN
  * $Id$
  *
  * Authors: Gildas Bazin <gbazin@videolan.org>
@@ -120,11 +120,11 @@ void Timer::Notify()
                                            FIND_ANYWHERE );
         if( p_playlist != NULL )
         {
-            vlc_mutex_lock( &p_playlist->object_lock );
+            LockPlaylist( p_intf->p_sys, p_playlist );
             p_intf->p_sys->p_input = p_playlist->p_input;
             if( p_intf->p_sys->p_input )
                 vlc_object_yield( p_intf->p_sys->p_input );
-            vlc_mutex_unlock( &p_playlist->object_lock );
+            UnlockPlaylist( p_intf->p_sys, p_playlist );
             vlc_object_release( p_playlist );
         }
 
index 0d147a1ec5b39f2b5239b9c45525864487162c1a..f1944f374405138ad12dbc004b95c439e0dd1a9e 100644 (file)
@@ -124,6 +124,7 @@ struct intf_sys_t
 
     /* Playlist management */
     int                 i_playing;                 /* playlist selected item */
+    unsigned            i_playlist_usage;
 
     /* Send an event to show a dialog */
     void (*pf_show_dialog) ( intf_thread_t *p_intf, int i_dialog, int i_arg,
@@ -1083,5 +1084,24 @@ private:
 };
 
 } // end of wxvlc namespace
+
+
+/*
+ * wxWindows keeps dead locking because the timer tries to lock the playlist
+ * when it's already locked somewhere else in the very wxWindows interface
+ * module. Unless someone implements a "vlc_mutex_trylock", we need that.
+ */
+inline void LockPlaylist( intf_sys_t *p_sys, playlist_t *p_pl )
+{
+    if( p_sys->i_playlist_usage++ == 0)
+        vlc_mutex_lock( &p_pl->object_lock );
+}
+
+inline void UnlockPlaylist( intf_sys_t *p_sys, playlist_t *p_pl )
+{
+    if( --p_sys->i_playlist_usage == 0)
+        vlc_mutex_unlock( &p_pl->object_lock );
+}
+
 using namespace wxvlc;