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

playlist: Use PL_LOCK_IF and PL_UNLOCK_IF to perform some more checks on lock...

playlist: Use PL_LOCK_IF and PL_UNLOCK_IF to perform some more checks on lock state. And fix a unlocked usage of get_current_status_item().
parent 4d0721f0
...@@ -65,10 +65,10 @@ int playlist_Control( playlist_t * p_playlist, int i_query, ...@@ -65,10 +65,10 @@ int playlist_Control( playlist_t * p_playlist, int i_query,
va_list args; va_list args;
int i_result; int i_result;
va_start( args, b_locked ); va_start( args, b_locked );
if( !b_locked ) PL_LOCK; PL_LOCK_IF( !b_locked );
i_result = PlaylistVAControl( p_playlist, i_query, args ); i_result = PlaylistVAControl( p_playlist, i_query, args );
va_end( args ); va_end( args );
if( !b_locked ) PL_UNLOCK; PL_UNLOCK_IF( !b_locked );
return i_result; return i_result;
} }
......
...@@ -272,7 +272,6 @@ input_thread_t * playlist_CurrentInput( playlist_t * p_playlist ) ...@@ -272,7 +272,6 @@ input_thread_t * playlist_CurrentInput( playlist_t * p_playlist )
return p_input; return p_input;
} }
/** /**
* @} * @}
*/ */
......
...@@ -256,10 +256,10 @@ int playlist_DeleteInputInParent( playlist_t *p_playlist, int i_input_id, ...@@ -256,10 +256,10 @@ int playlist_DeleteInputInParent( playlist_t *p_playlist, int i_input_id,
playlist_item_t *p_root, bool b_locked ) playlist_item_t *p_root, bool b_locked )
{ {
int i_ret; int i_ret;
if( !b_locked ) PL_LOCK; PL_LOCK_IF( !b_locked );
i_ret = DeleteFromInput( p_playlist, i_input_id, i_ret = DeleteFromInput( p_playlist, i_input_id,
p_root, true ); p_root, true );
if( !b_locked ) PL_UNLOCK; PL_UNLOCK_IF( !b_locked );
return i_ret; return i_ret;
} }
...@@ -276,12 +276,12 @@ int playlist_DeleteFromInput( playlist_t *p_playlist, int i_input_id, ...@@ -276,12 +276,12 @@ int playlist_DeleteFromInput( playlist_t *p_playlist, int i_input_id,
bool b_locked ) bool b_locked )
{ {
int i_ret1, i_ret2; int i_ret1, i_ret2;
if( !b_locked ) PL_LOCK; PL_LOCK_IF( !b_locked );
i_ret1 = DeleteFromInput( p_playlist, i_input_id, i_ret1 = DeleteFromInput( p_playlist, i_input_id,
p_playlist->p_root_category, true ); p_playlist->p_root_category, true );
i_ret2 = DeleteFromInput( p_playlist, i_input_id, i_ret2 = DeleteFromInput( p_playlist, i_input_id,
p_playlist->p_root_onelevel, true ); p_playlist->p_root_onelevel, true );
if( !b_locked ) PL_UNLOCK; PL_UNLOCK_IF( !b_locked );
return ( i_ret1 == VLC_SUCCESS || i_ret2 == VLC_SUCCESS ) ? return ( i_ret1 == VLC_SUCCESS || i_ret2 == VLC_SUCCESS ) ?
VLC_SUCCESS : VLC_ENOITEM; VLC_SUCCESS : VLC_ENOITEM;
} }
...@@ -295,10 +295,10 @@ int playlist_DeleteFromInput( playlist_t *p_playlist, int i_input_id, ...@@ -295,10 +295,10 @@ int playlist_DeleteFromInput( playlist_t *p_playlist, int i_input_id,
*/ */
void playlist_Clear( playlist_t * p_playlist, bool b_locked ) void playlist_Clear( playlist_t * p_playlist, bool b_locked )
{ {
if( !b_locked ) PL_LOCK; PL_LOCK_IF( !b_locked );
playlist_NodeEmpty( p_playlist, p_playlist->p_local_category, true ); playlist_NodeEmpty( p_playlist, p_playlist->p_local_category, true );
playlist_NodeEmpty( p_playlist, p_playlist->p_local_onelevel, true ); playlist_NodeEmpty( p_playlist, p_playlist->p_local_onelevel, true );
if( !b_locked ) PL_UNLOCK; PL_UNLOCK_IF( !b_locked );
} }
/** /**
...@@ -403,7 +403,7 @@ int playlist_AddInput( playlist_t* p_playlist, input_item_t *p_input, ...@@ -403,7 +403,7 @@ int playlist_AddInput( playlist_t* p_playlist, input_item_t *p_input,
PL_DEBUG( "adding item `%s' ( %s )", p_input->psz_name, PL_DEBUG( "adding item `%s' ( %s )", p_input->psz_name,
p_input->psz_uri ); p_input->psz_uri );
if( !b_locked ) PL_LOCK; PL_LOCK_IF( !b_locked );
/* Add to ONELEVEL */ /* Add to ONELEVEL */
p_item_one = playlist_ItemNewFromInput( p_playlist, p_input ); p_item_one = playlist_ItemNewFromInput( p_playlist, p_input );
...@@ -421,7 +421,7 @@ int playlist_AddInput( playlist_t* p_playlist, input_item_t *p_input, ...@@ -421,7 +421,7 @@ int playlist_AddInput( playlist_t* p_playlist, input_item_t *p_input,
GoAndPreparse( p_playlist, i_mode, p_item_cat, p_item_one ); GoAndPreparse( p_playlist, i_mode, p_item_cat, p_item_one );
if( !b_locked ) PL_UNLOCK; PL_UNLOCK_IF( !b_locked );
return VLC_SUCCESS; return VLC_SUCCESS;
} }
...@@ -452,11 +452,11 @@ int playlist_BothAddInput( playlist_t *p_playlist, ...@@ -452,11 +452,11 @@ int playlist_BothAddInput( playlist_t *p_playlist,
int i_top; int i_top;
assert( p_input ); assert( p_input );
if( !b_locked ) PL_LOCK; PL_LOCK_IF( !b_locked );
if( !vlc_object_alive( p_playlist ) ) if( !vlc_object_alive( p_playlist ) )
{ {
if( !b_locked ) PL_UNLOCK; PL_UNLOCK_IF( !b_locked );
return VLC_EGENERIC; return VLC_EGENERIC;
} }
...@@ -491,7 +491,7 @@ int playlist_BothAddInput( playlist_t *p_playlist, ...@@ -491,7 +491,7 @@ int playlist_BothAddInput( playlist_t *p_playlist,
if( i_cat ) *i_cat = p_item_cat->i_id; if( i_cat ) *i_cat = p_item_cat->i_id;
if( i_one ) *i_one = p_item_one->i_id; if( i_one ) *i_one = p_item_one->i_id;
if( !b_locked ) PL_UNLOCK; PL_UNLOCK_IF( !b_locked );
return VLC_SUCCESS; return VLC_SUCCESS;
} }
...@@ -520,13 +520,13 @@ playlist_item_t * playlist_NodeAddInput( playlist_t *p_playlist, ...@@ -520,13 +520,13 @@ playlist_item_t * playlist_NodeAddInput( playlist_t *p_playlist,
if( p_playlist->b_die ) if( p_playlist->b_die )
return NULL; return NULL;
if( !b_locked ) PL_LOCK; PL_LOCK_IF( !b_locked );
p_item = playlist_ItemNewFromInput( p_playlist, p_input ); p_item = playlist_ItemNewFromInput( p_playlist, p_input );
if( p_item == NULL ) return NULL; if( p_item == NULL ) return NULL;
AddItem( p_playlist, p_item, p_parent, i_mode, i_pos ); AddItem( p_playlist, p_item, p_parent, i_mode, i_pos );
if( !b_locked ) PL_UNLOCK; PL_UNLOCK_IF( !b_locked );
return p_item; return p_item;
} }
...@@ -566,11 +566,11 @@ playlist_item_t *playlist_ItemToNode( playlist_t *p_playlist, ...@@ -566,11 +566,11 @@ playlist_item_t *playlist_ItemToNode( playlist_t *p_playlist,
* useful for later BothAddInput ) * useful for later BothAddInput )
*/ */
if( !b_locked ) PL_LOCK; PL_LOCK_IF( !b_locked );
/* Fast track the media library, no time to loose */ /* Fast track the media library, no time to loose */
if( p_item == p_playlist->p_ml_category ) { if( p_item == p_playlist->p_ml_category ) {
if( !b_locked ) PL_UNLOCK; PL_UNLOCK_IF( !b_locked );
return p_item; return p_item;
} }
...@@ -603,13 +603,13 @@ playlist_item_t *playlist_ItemToNode( playlist_t *p_playlist, ...@@ -603,13 +603,13 @@ playlist_item_t *playlist_ItemToNode( playlist_t *p_playlist,
vlc_object_signal_unlocked( p_playlist ); vlc_object_signal_unlocked( p_playlist );
var_SetInteger( p_playlist, "item-change", p_item_in_category-> var_SetInteger( p_playlist, "item-change", p_item_in_category->
p_input->i_id ); p_input->i_id );
if( !b_locked ) PL_UNLOCK; PL_UNLOCK_IF( !b_locked );
return p_item_in_category; return p_item_in_category;
} }
else else
{ {
ChangeToNode( p_playlist, p_item ); ChangeToNode( p_playlist, p_item );
if( !b_locked ) PL_UNLOCK; PL_UNLOCK_IF( !b_locked );
return NULL; return NULL;
} }
} }
......
...@@ -143,7 +143,18 @@ void playlist_set_current_input( ...@@ -143,7 +143,18 @@ void playlist_set_current_input(
#define PLI_NAME( p ) p && p->p_input ? p->p_input->psz_name : "null" #define PLI_NAME( p ) p && p->p_input ? p->p_input->psz_name : "null"
#define PL_ASSERT_LOCKED vlc_assert_locked( &(vlc_internals(p_playlist)->lock) ); #define PL_ASSERT_LOCKED vlc_assert_locked( &(vlc_internals(p_playlist)->lock) )
#define PL_LOCK_IF( cond ) pl_lock_if( p_playlist, cond )
static inline void pl_lock_if( playlist_t * p_playlist, bool cond )
{
if( cond ) PL_LOCK; else PL_ASSERT_LOCKED;
}
#define PL_UNLOCK_IF( cond ) pl_unlock_if( p_playlist, cond )
static inline void pl_unlock_if( playlist_t * p_playlist, bool cond )
{
if( cond ) PL_UNLOCK;
}
#endif /* !__LIBVLC_PLAYLIST_INTERNAL_H */ #endif /* !__LIBVLC_PLAYLIST_INTERNAL_H */
...@@ -44,14 +44,14 @@ playlist_item_t * playlist_ItemGetById( playlist_t * p_playlist , int i_id, ...@@ -44,14 +44,14 @@ playlist_item_t * playlist_ItemGetById( playlist_t * p_playlist , int i_id,
bool b_locked ) bool b_locked )
{ {
int i; int i;
if( !b_locked ) PL_LOCK; PL_LOCK_IF( !b_locked );
ARRAY_BSEARCH( p_playlist->all_items,->i_id, int, i_id, i ); ARRAY_BSEARCH( p_playlist->all_items,->i_id, int, i_id, i );
if( i != -1 ) if( i != -1 )
{ {
if( !b_locked ) PL_UNLOCK; PL_UNLOCK_IF( !b_locked );
return ARRAY_VAL( p_playlist->all_items, i ); return ARRAY_VAL( p_playlist->all_items, i );
} }
if( !b_locked ) PL_UNLOCK; PL_UNLOCK_IF( !b_locked );
return NULL; return NULL;
} }
...@@ -67,23 +67,26 @@ playlist_item_t * playlist_ItemGetByInput( playlist_t * p_playlist , ...@@ -67,23 +67,26 @@ playlist_item_t * playlist_ItemGetByInput( playlist_t * p_playlist ,
bool b_locked ) bool b_locked )
{ {
int i; int i;
if( !b_locked ) PL_LOCK; PL_LOCK_IF( !b_locked );
if( get_current_status_item( p_playlist ) && if( get_current_status_item( p_playlist ) &&
get_current_status_item( p_playlist )->p_input == p_item ) get_current_status_item( p_playlist )->p_input == p_item )
{ {
if( !b_locked ) PL_UNLOCK; /* FIXME: this is potentially dangerous, we could destroy
return get_current_status_item( p_playlist ); * p_ret any time soon */
input_item_t *p_ret = get_current_status_item( p_playlist );
PL_UNLOCK_IF( !b_locked );
return p_ret;
} }
/** \todo Check if this is always incremental and whether we can bsearch */ /** \todo Check if this is always incremental and whether we can bsearch */
for( i = 0 ; i < p_playlist->all_items.i_size; i++ ) for( i = 0 ; i < p_playlist->all_items.i_size; i++ )
{ {
if( ARRAY_VAL(p_playlist->all_items, i)->p_input->i_id == p_item->i_id ) if( ARRAY_VAL(p_playlist->all_items, i)->p_input->i_id == p_item->i_id )
{ {
if( !b_locked ) PL_UNLOCK; PL_UNLOCK_IF( !b_locked );
return ARRAY_VAL(p_playlist->all_items, i); return ARRAY_VAL(p_playlist->all_items, i);
} }
} }
if( !b_locked ) PL_UNLOCK; PL_UNLOCK_IF( !b_locked );
return NULL; return NULL;
} }
......
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