Commit bfef7653 authored by Pierre d'Herbemont's avatar Pierre d'Herbemont

macosx: Fix a deadlock in the broken -[VLCPlaylist isItem: inNode:...

macosx: Fix a deadlock in the broken -[VLCPlaylist isItem: inNode: checkItemExistence:]. Fixes #1711 (Deleting a playing item's parent item result in a trivial deadlock on Mac OS X.)
parent 39c89deb
...@@ -565,6 +565,14 @@ ...@@ -565,6 +565,14 @@
- (BOOL)isItem: (playlist_item_t *)p_item - (BOOL)isItem: (playlist_item_t *)p_item
inNode: (playlist_item_t *)p_node inNode: (playlist_item_t *)p_node
checkItemExistence:(BOOL)b_check 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 ); playlist_t * p_playlist = pl_Yield( VLCIntf );
...@@ -585,7 +593,7 @@ ...@@ -585,7 +593,7 @@
if ( p_temp_item ) if ( p_temp_item )
{ {
int i; int i;
PL_LOCK; if(!b_locked) PL_LOCK;
if( b_check ) if( b_check )
{ {
...@@ -597,8 +605,8 @@ ...@@ -597,8 +605,8 @@
if( ARRAY_VAL( p_playlist->all_items, i) == p_item ) break; if( ARRAY_VAL( p_playlist->all_items, i) == p_item ) break;
else if ( i == p_playlist->all_items.i_size - 1 ) else if ( i == p_playlist->all_items.i_size - 1 )
{ {
if(!b_locked) PL_UNLOCK;
vlc_object_release( p_playlist ); vlc_object_release( p_playlist );
PL_UNLOCK;
return NO; return NO;
} }
} }
...@@ -609,12 +617,12 @@ ...@@ -609,12 +617,12 @@
p_temp_item = p_temp_item->p_parent; p_temp_item = p_temp_item->p_parent;
if( p_temp_item == p_node ) if( p_temp_item == p_node )
{ {
PL_UNLOCK; if(!b_locked) PL_UNLOCK;
vlc_object_release( p_playlist ); vlc_object_release( p_playlist );
return YES; return YES;
} }
} }
PL_UNLOCK; if(!b_locked) PL_UNLOCK;
} }
vlc_object_release( p_playlist ); vlc_object_release( p_playlist );
...@@ -636,7 +644,7 @@ ...@@ -636,7 +644,7 @@
} }
if( [self isItem: [[o_items objectAtIndex:i] pointerValue] if( [self isItem: [[o_items objectAtIndex:i] pointerValue]
inNode: [[o_nodes objectAtIndex:j] pointerValue] inNode: [[o_nodes objectAtIndex:j] pointerValue]
checkItemExistence: NO] ) checkItemExistence: NO locked:NO] )
{ {
[o_items removeObjectAtIndex:i]; [o_items removeObjectAtIndex:i];
/* We need to execute the next iteration with the same index /* We need to execute the next iteration with the same index
...@@ -841,7 +849,7 @@ ...@@ -841,7 +849,7 @@
if( p_playlist->status.i_status != PLAYLIST_STOPPED && if( p_playlist->status.i_status != PLAYLIST_STOPPED &&
[self isItem: p_playlist->status.p_item inNode: [self isItem: p_playlist->status.p_item inNode:
((playlist_item_t *)[o_item pointerValue]) ((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 // if current item is in selected node and is playing then stop playlist
playlist_Stop( p_playlist ); playlist_Stop( p_playlist );
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment