[vlc-devel] commit: 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(). (Pierre d' Herbemont )
git version control
git at videolan.org
Tue Jul 15 09:45:47 CEST 2008
vlc | branch: master | Pierre d'Herbemont <pdherbemont at videolan.org> | Tue Jul 15 09:40:39 2008 +0200| [ace44bc9f59e2ced98bb8534aa225fce9a479d8b]
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().
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=ace44bc9f59e2ced98bb8534aa225fce9a479d8b
---
src/playlist/control.c | 4 ++--
src/playlist/engine.c | 1 -
src/playlist/item.c | 34 +++++++++++++++++-----------------
src/playlist/playlist_internal.h | 13 ++++++++++++-
src/playlist/search.c | 19 +++++++++++--------
5 files changed, 42 insertions(+), 29 deletions(-)
diff --git a/src/playlist/control.c b/src/playlist/control.c
index fbbf941..2cb00e9 100644
--- a/src/playlist/control.c
+++ b/src/playlist/control.c
@@ -65,10 +65,10 @@ int playlist_Control( playlist_t * p_playlist, int i_query,
va_list args;
int i_result;
va_start( args, b_locked );
- if( !b_locked ) PL_LOCK;
+ PL_LOCK_IF( !b_locked );
i_result = PlaylistVAControl( p_playlist, i_query, args );
va_end( args );
- if( !b_locked ) PL_UNLOCK;
+ PL_UNLOCK_IF( !b_locked );
return i_result;
}
diff --git a/src/playlist/engine.c b/src/playlist/engine.c
index c01450e..ba516c8 100644
--- a/src/playlist/engine.c
+++ b/src/playlist/engine.c
@@ -272,7 +272,6 @@ input_thread_t * playlist_CurrentInput( playlist_t * p_playlist )
return p_input;
}
-
/**
* @}
*/
diff --git a/src/playlist/item.c b/src/playlist/item.c
index 66573c9..5d09181 100644
--- a/src/playlist/item.c
+++ b/src/playlist/item.c
@@ -256,10 +256,10 @@ int playlist_DeleteInputInParent( playlist_t *p_playlist, int i_input_id,
playlist_item_t *p_root, bool b_locked )
{
int i_ret;
- if( !b_locked ) PL_LOCK;
+ PL_LOCK_IF( !b_locked );
i_ret = DeleteFromInput( p_playlist, i_input_id,
p_root, true );
- if( !b_locked ) PL_UNLOCK;
+ PL_UNLOCK_IF( !b_locked );
return i_ret;
}
@@ -276,12 +276,12 @@ int playlist_DeleteFromInput( playlist_t *p_playlist, int i_input_id,
bool b_locked )
{
int i_ret1, i_ret2;
- if( !b_locked ) PL_LOCK;
+ PL_LOCK_IF( !b_locked );
i_ret1 = DeleteFromInput( p_playlist, i_input_id,
p_playlist->p_root_category, true );
i_ret2 = DeleteFromInput( p_playlist, i_input_id,
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 ) ?
VLC_SUCCESS : VLC_ENOITEM;
}
@@ -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 )
{
- 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_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,
PL_DEBUG( "adding item `%s' ( %s )", p_input->psz_name,
p_input->psz_uri );
- if( !b_locked ) PL_LOCK;
+ PL_LOCK_IF( !b_locked );
/* Add to ONELEVEL */
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,
GoAndPreparse( p_playlist, i_mode, p_item_cat, p_item_one );
- if( !b_locked ) PL_UNLOCK;
+ PL_UNLOCK_IF( !b_locked );
return VLC_SUCCESS;
}
@@ -452,11 +452,11 @@ int playlist_BothAddInput( playlist_t *p_playlist,
int i_top;
assert( p_input );
- if( !b_locked ) PL_LOCK;
+ PL_LOCK_IF( !b_locked );
if( !vlc_object_alive( p_playlist ) )
{
- if( !b_locked ) PL_UNLOCK;
+ PL_UNLOCK_IF( !b_locked );
return VLC_EGENERIC;
}
@@ -491,7 +491,7 @@ int playlist_BothAddInput( playlist_t *p_playlist,
if( i_cat ) *i_cat = p_item_cat->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;
}
@@ -520,13 +520,13 @@ playlist_item_t * playlist_NodeAddInput( playlist_t *p_playlist,
if( p_playlist->b_die )
return NULL;
- if( !b_locked ) PL_LOCK;
+ PL_LOCK_IF( !b_locked );
p_item = playlist_ItemNewFromInput( p_playlist, p_input );
if( p_item == NULL ) return NULL;
AddItem( p_playlist, p_item, p_parent, i_mode, i_pos );
- if( !b_locked ) PL_UNLOCK;
+ PL_UNLOCK_IF( !b_locked );
return p_item;
}
@@ -566,11 +566,11 @@ playlist_item_t *playlist_ItemToNode( playlist_t *p_playlist,
* useful for later BothAddInput )
*/
- if( !b_locked ) PL_LOCK;
+ PL_LOCK_IF( !b_locked );
/* Fast track the media library, no time to loose */
if( p_item == p_playlist->p_ml_category ) {
- if( !b_locked ) PL_UNLOCK;
+ PL_UNLOCK_IF( !b_locked );
return p_item;
}
@@ -603,13 +603,13 @@ playlist_item_t *playlist_ItemToNode( playlist_t *p_playlist,
vlc_object_signal_unlocked( p_playlist );
var_SetInteger( p_playlist, "item-change", p_item_in_category->
p_input->i_id );
- if( !b_locked ) PL_UNLOCK;
+ PL_UNLOCK_IF( !b_locked );
return p_item_in_category;
}
else
{
ChangeToNode( p_playlist, p_item );
- if( !b_locked ) PL_UNLOCK;
+ PL_UNLOCK_IF( !b_locked );
return NULL;
}
}
diff --git a/src/playlist/playlist_internal.h b/src/playlist/playlist_internal.h
index 155dae0..e4369e3 100644
--- a/src/playlist/playlist_internal.h
+++ b/src/playlist/playlist_internal.h
@@ -143,7 +143,18 @@ void playlist_set_current_input(
#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 */
diff --git a/src/playlist/search.c b/src/playlist/search.c
index 5d9238a..fc46c56 100644
--- a/src/playlist/search.c
+++ b/src/playlist/search.c
@@ -44,14 +44,14 @@ playlist_item_t * playlist_ItemGetById( playlist_t * p_playlist , int i_id,
bool b_locked )
{
int i;
- if( !b_locked ) PL_LOCK;
+ PL_LOCK_IF( !b_locked );
ARRAY_BSEARCH( p_playlist->all_items,->i_id, int, i_id, i );
if( i != -1 )
{
- if( !b_locked ) PL_UNLOCK;
+ PL_UNLOCK_IF( !b_locked );
return ARRAY_VAL( p_playlist->all_items, i );
}
- if( !b_locked ) PL_UNLOCK;
+ PL_UNLOCK_IF( !b_locked );
return NULL;
}
@@ -67,23 +67,26 @@ playlist_item_t * playlist_ItemGetByInput( playlist_t * p_playlist ,
bool b_locked )
{
int i;
- if( !b_locked ) PL_LOCK;
+ PL_LOCK_IF( !b_locked );
if( get_current_status_item( p_playlist ) &&
get_current_status_item( p_playlist )->p_input == p_item )
{
- if( !b_locked ) PL_UNLOCK;
- return get_current_status_item( p_playlist );
+ /* FIXME: this is potentially dangerous, we could destroy
+ * 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 */
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( !b_locked ) PL_UNLOCK;
+ PL_UNLOCK_IF( !b_locked );
return ARRAY_VAL(p_playlist->all_items, i);
}
}
- if( !b_locked ) PL_UNLOCK;
+ PL_UNLOCK_IF( !b_locked );
return NULL;
}
More information about the vlc-devel
mailing list