[vlc-devel] commit: macos playlist: fix a deadlock when deleting items. ( Derk-Jan Hartman )

git version control git at videolan.org
Wed Jun 3 23:41:53 CEST 2009


vlc | branch: 1.0-bugfix | Derk-Jan Hartman <hartman at videolan.org> | Wed Jun  3 23:08:35 2009 +0200| [31aef931068d34bb229ed099110e9a7a3a6ad577] | committer: Derk-Jan Hartman 

macos playlist: fix a deadlock when deleting items.

In general, we should avoid PL_LOCK'ing around stuff that the Datasource does,
and restrict it to the lines that directly deal with the core playlist.

This should fix #2810

Signed-off-by: Derk-Jan Hartman <hartman at videolan.org>

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=31aef931068d34bb229ed099110e9a7a3a6ad577
---

 modules/gui/macosx/playlist.m |   17 ++++++++++-------
 1 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/modules/gui/macosx/playlist.m b/modules/gui/macosx/playlist.m
index eb5cd96..996bb83 100644
--- a/modules/gui/macosx/playlist.m
+++ b/modules/gui/macosx/playlist.m
@@ -944,19 +944,20 @@
 
     p_playlist = pl_Hold( p_intf );
 
-    PL_LOCK;
     for( int i = 0; i < i_count; i++ )
     {
         o_number = [o_to_delete lastObject];
         i_row = [o_number intValue];
         id o_item = [o_outline_view itemAtRow: i_row];
+        [o_outline_view deselectRow: i_row];
+
+        PL_LOCK;
         playlist_item_t *p_item = [o_item pointerValue];
 #ifndef NDEBUG
         msg_Dbg( p_intf, "deleting item %i (of %i) with id \"%i\", pointerValue \"%p\" and %i children", i+1, i_count, 
                 p_item->p_input->i_id, [o_item pointerValue], p_item->i_children +1 );
 #endif
         [o_to_delete removeObject: o_number];
-        [o_outline_view deselectRow: i_row];
 
         if( p_item->i_children != -1 )
         //is a node and not an item
@@ -972,8 +973,12 @@
         }
         else
             playlist_DeleteFromInput( p_playlist, p_item->p_input->i_id, pl_Locked );
+
+        PL_UNLOCK;
+        [o_outline_dict removeObjectForKey:[NSString stringWithFormat:@"%p",
+                                                     [o_item pointerValue]]];
+        [o_item release];
     }
-    PL_UNLOCK;
 
     [self playlistUpdated];
     pl_Release( p_intf );
@@ -1004,19 +1009,17 @@
         p_item = p_playlist->p_root_category;
     }
 
+    PL_LOCK;
     if( p_item->i_children > -1 ) // the item is a node
     {
-        PL_LOCK;
         playlist_RecursiveNodeSort( p_playlist, p_item, i_mode, ORDER_NORMAL );
-        PL_UNLOCK;
     }
     else
     {
-        PL_LOCK;
         playlist_RecursiveNodeSort( p_playlist,
                 p_item->p_parent, i_mode, ORDER_NORMAL );
-        PL_UNLOCK;
     }
+    PL_UNLOCK;
     pl_Release( VLCIntf );
     [self playlistUpdated];
 }




More information about the vlc-devel mailing list