]> git.sesse.net Git - vlc/commitdiff
macosx: Fix a deadlock in the broken -[VLCPlaylist isItem: inNode: checkItemExistence...
authorPierre d'Herbemont <pdherbemont@videolan.org>
Tue, 15 Jul 2008 11:42:52 +0000 (13:42 +0200)
committerPierre d'Herbemont <pdherbemont@videolan.org>
Tue, 15 Jul 2008 17:34:03 +0000 (19:34 +0200)
modules/gui/macosx/playlist.m

index 0b0d130cb6d5b4a0ab127cce09231cef6fa49ee1..69d9fbbc90cf73323070621febd40c21badb5b0e 100644 (file)
 - (BOOL)isItem: (playlist_item_t *)p_item
                     inNode: (playlist_item_t *)p_node
                     checkItemExistence:(BOOL)b_check
+{
+    [self isItem:p_item inNode:p_node checkItemExistence:b_check locked:NO];
+}
+
+- (BOOL)isItem: (playlist_item_t *)p_item
+                    inNode: (playlist_item_t *)p_node
+                    checkItemExistence:(BOOL)b_check
+                    locked:(BOOL)b_locked
 
 {
     playlist_t * p_playlist = pl_Yield( VLCIntf );
     if ( p_temp_item )
     {
         int i;
-        PL_LOCK;
+        if(!b_locked) PL_LOCK;
 
         if( b_check )
         {
                 if( ARRAY_VAL( p_playlist->all_items, i) == p_item ) break;
                 else if ( i == p_playlist->all_items.i_size - 1 )
                 {
+                    if(!b_locked) PL_UNLOCK;
                     vlc_object_release( p_playlist );
-                    PL_UNLOCK;
                     return NO;
                 }
             }
             p_temp_item = p_temp_item->p_parent;
             if( p_temp_item == p_node )
             {
-                PL_UNLOCK;
+                if(!b_locked) PL_UNLOCK;
                 vlc_object_release( p_playlist );
                 return YES;
             }
         }
-        PL_UNLOCK;
+        if(!b_locked) PL_UNLOCK;
     }
 
     vlc_object_release( p_playlist );
             }
             if( [self isItem: [[o_items objectAtIndex:i] pointerValue]
                     inNode: [[o_nodes objectAtIndex:j] pointerValue]
-                    checkItemExistence: NO] )
+                    checkItemExistence: NO locked:NO] )
             {
                 [o_items removeObjectAtIndex:i];
                 /* We need to execute the next iteration with the same index
             if( p_playlist->status.i_status != PLAYLIST_STOPPED &&
                 [self isItem: p_playlist->status.p_item inNode:
                         ((playlist_item_t *)[o_item pointerValue])
-                        checkItemExistence: NO] == YES )
+                        checkItemExistence: NO locked:YES] == YES )
                 // if current item is in selected node and is playing then stop playlist
                 playlist_Stop( p_playlist );