#define PL_UNLOCK playlist_Unlock( p_playlist )
#define PL_ASSERT_LOCKED playlist_AssertLocked( p_playlist )
-VLC_EXPORT( playlist_t *, __pl_Hold, ( vlc_object_t * ) );
-#define pl_Hold( a ) __pl_Hold( VLC_OBJECT(a) )
+VLC_EXPORT( playlist_t *, pl_Hold, ( vlc_object_t * ) );
+#define pl_Hold( a ) pl_Hold( VLC_OBJECT(a) )
-VLC_EXPORT( void, __pl_Release, ( vlc_object_t * ) );
-#define pl_Release(a) __pl_Release( VLC_OBJECT(a) )
+VLC_EXPORT( void, pl_Release, ( vlc_object_t * ) );
+#define pl_Release(a) pl_Release( VLC_OBJECT(a) )
/* Playlist control */
#define playlist_Play(p) playlist_Control(p,PLAYLIST_PLAY, pl_Unlocked )
module_EndBank( p_libvlc, true );
return VLC_EGENERIC;
}
- playlist_Activate( p_playlist );
/* Add service discovery modules */
psz_modules = var_InheritString( p_libvlc, "services-discovery" );
void libvlc_InternalCleanup( libvlc_int_t *p_libvlc )
{
libvlc_priv_t *priv = libvlc_priv (p_libvlc);
- playlist_t *p_playlist = priv->p_playlist;
+ playlist_t *p_playlist = libvlc_priv (p_libvlc)->p_playlist;
/* Deactivate the playlist */
msg_Dbg( p_libvlc, "deactivating the playlist" );
- playlist_Deactivate( p_playlist );
+ pl_Deactivate( p_libvlc );
/* Remove all services discovery */
msg_Dbg( p_libvlc, "removing all services discovery tasks" );
}
#endif
- /* Free playlist */
- /* Any thread still running must not assume pl_Hold() succeeds. */
+ /* Free playlist now */
msg_Dbg( p_libvlc, "removing playlist" );
-
- libvlc_priv(p_libvlc)->p_playlist = NULL;
- barrier(); /* FIXME is that correct ? */
-
vlc_object_release( p_playlist );
stats_TimersDumpAll( p_libvlc );
libvlc_int_t public_data;
int i_last_input_id ; ///< Last id of input item
+ bool playlist_active;
/* Messages */
msg_bank_t msg_bank; ///< The message bank
playlist_TreeMove
playlist_TreeMoveMany
playlist_Unlock
-__pl_Hold
-__pl_Release
+pl_Hold
+pl_Release
resolve_xml_special_chars
sdp_AddAttribute
sdp_AddMedia
* Playlist control
*****************************************************************************/
-playlist_t *__pl_Hold( vlc_object_t *p_this )
+static vlc_mutex_t global_lock = VLC_STATIC_MUTEX;
+
+#undef pl_Hold
+playlist_t *pl_Hold (vlc_object_t *obj)
{
playlist_t *pl;
+ libvlc_int_t *p_libvlc = obj->p_libvlc;
- barrier();
- pl = libvlc_priv (p_this->p_libvlc)->p_playlist;
+ vlc_mutex_lock (&global_lock);
+ pl = libvlc_priv (p_libvlc)->p_playlist;
+ assert (pl != NULL);
- assert( VLC_OBJECT(pl) != p_this /* This does not make sense to hold the playlist
- using pl_Hold. use vlc_object_hold in this case */ );
+ if (!libvlc_priv (p_libvlc)->playlist_active)
+ {
+ playlist_Activate (pl);
+ libvlc_priv (p_libvlc)->playlist_active = true;
+ }
+ /* The playlist should hold itself with vlc_object_hold() if ever. */
+ assert (VLC_OBJECT (pl) != obj);
if (pl)
vlc_object_hold (pl);
+ vlc_mutex_unlock (&global_lock);
return pl;
}
-void __pl_Release( vlc_object_t *p_this )
+#undef pl_Release
+void pl_Release( vlc_object_t *p_this )
{
playlist_t *pl = libvlc_priv (p_this->p_libvlc)->p_playlist;
assert( pl != NULL );
vlc_object_release( pl );
}
+void pl_Deactivate (libvlc_int_t *p_libvlc)
+{
+ vlc_mutex_lock (&global_lock);
+ if (libvlc_priv (p_libvlc)->playlist_active)
+ playlist_Deactivate (libvlc_priv (p_libvlc)->p_playlist);
+ vlc_mutex_unlock (&global_lock);
+}
+
void playlist_Lock( playlist_t *pl )
{
vlc_mutex_lock( &pl_priv(pl)->lock );
/* */
void playlist_Activate( playlist_t * );
void playlist_Deactivate( playlist_t * );
+void pl_Deactivate (libvlc_int_t *);
/* */
playlist_item_t *playlist_ItemNewFromInput( playlist_t *p_playlist,