[vlc-commits] playlist: add/fix some documentation
Rémi Denis-Courmont
git at videolan.org
Sun Nov 27 17:17:00 CET 2016
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sun Nov 27 18:16:52 2016 +0200| [8f2629d9d2800d621a1456d773686bed3589fd7d] | committer: Rémi Denis-Courmont
playlist: add/fix some documentation
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=8f2629d9d2800d621a1456d773686bed3589fd7d
---
include/vlc_playlist.h | 96 +++++++++++++++++++++++++++++++++++++-------------
1 file changed, 71 insertions(+), 25 deletions(-)
diff --git a/include/vlc_playlist.h b/include/vlc_playlist.h
index a3cd171..b602345 100644
--- a/include/vlc_playlist.h
+++ b/include/vlc_playlist.h
@@ -44,25 +44,25 @@ struct intf_thread_t;
* The VLC playlist system has a tree structure. This allows advanced
* categorization, like for SAP streams (which are grouped by "sap groups").
*
- * The base structure for all playlist operations is the input_item_t. This
- * contains all information needed to play a stream and get info, ie, mostly,
- * mrl and metadata.
+ * The base structure for all playlist operations is the playlist_item_t.
+ * This is essentially a node within the playlist tree. Each playlist item
+ * references an input_item_t which contain the input stream infos, such as
+ * location, name and meta-data.
*
- * Input items are not used directly, but through playlist items.
- * The playlist items are themselves in a tree structure. They only contain
- * a link to the input item, a unique id and a few flags.
- * Several playlist items can be attached to a single input item. The input
- * item is refcounted and is automatically destroyed when it is not used
- * anymore.
+ * A playlist item is uniquely identified by its input item:
+ * \ref playlist_ItemGetByInput(). A single input item cannot be used by more
+ * than one playlist item at a time; if necessary, a copy of the input item can
+ * be made instead.
*
- * The top-level items are the main media sources and include:
- * playlist, media library, SAP, Shoutcast, devices, ...
+ * The same playlist tree is visible to all user interfaces. To arbitrate
+ * access, a lock is used, see \ref playlist_Lock() and \ref playlist_Unlock().
*
- * It is envisioned that a third tree will appear: VLM, but it's not done yet
- *
- * The playlist also stores, for utility purposes, an array of all input
- * items, an array of all playlist items and an array of all playlist items
- * and nodes (both are represented by the same structure).
+ * The under the playlist root item node, the top-level items are the main
+ * media sources and include:
+ * - the actual playlist,
+ * - the media library,
+ * - the service discovery root node, whose children are services discovery
+ * module instances.
*
* So, here is an example:
* \verbatim
@@ -79,23 +79,23 @@ struct intf_thread_t;
* \endverbatim
*
* Sometimes, an item creates subitems. This happens for the directory access
- * for example. In that case, if the item is under the "playlist" top-level item
- * and playlist is configured to be flat then the item will be deleted and
+ * for example. In that case, if the item is under the "playlist" top-level
+ * item and playlist is configured to be flat then the item will be deleted and
* replaced with new subitems. If the item is under another top-level item, it
* will be transformed to a node and removed from the list of all items without
* nodes.
*
- * For "standard" item addition, you can use playlist_Add, playlist_AddExt
- * (more options) or playlist_AddInput if you already created your input
+ * For "standard" item addition, you can use playlist_Add(), playlist_AddExt()
+ * (more options) or playlist_AddInput() if you already created your input
* item. This will add the item at the root of "Playlist" or of "Media library"
* in each of the two trees.
*
- * You can create nodes with playlist_NodeCreate and can create items from
- * existing input items to be placed under any node with playlist_NodeAddInput.
+ * You can create nodes with playlist_NodeCreate() and can create items from
+ * existing input items to be placed under any node with
+ * playlist_NodeAddInput().
*
* To delete an item, use playlist_NodeDelete( p_item ).
*
- *
* The playlist defines the following event variables:
*
* - "item-change": It will contain a pointer to the input_item_t of a
@@ -108,8 +108,8 @@ struct intf_thread_t;
* - "leaf-to-parent": It will contain the playlist_item_t->i_id of an item that is transformed
* into a node.
*
- * The playlist contains rate-variable which is propagated to current input if available
- * also rate-slower/rate-faster is in use
+ * The playlist contains rate-variable which is propagated to current input if
+ * available also rate-slower/rate-faster is in use.
*/
/** Helper structure to export to file part of the playlist */
@@ -244,8 +244,54 @@ enum {
#define playlist_Resume(p) \
playlist_Control(p, PLAYLIST_RESUME, pl_Unlocked)
+/**
+ * Locks the playlist.
+ *
+ * This function locks the playlist. While the playlist is locked, no other
+ * thread can modify the playlist tree layout or current playing item and node.
+ *
+ * Locking the playlist is necessary before accessing, either for reading or
+ * writing, any playlist item.
+ *
+ * \note Because of the potential for lock inversion / deadlocks, locking the
+ * playlist shall not be attemped while holding an input item lock. An input
+ * item lock can be acquired while holding the playlist lock.
+ *
+ * While holding the playlist lock, a thread shall not attempt to:
+ * - probe, initialize or deinitialize a module or a plugin,
+ * - install or deinstall a variable or event callback,
+ * - set a variable or trigger a variable callback, with the sole exception
+ * of the playlist core triggerting add/remove/leaf item callbacks,
+ * - invoke a module/plugin callback other than:
+ * - playlist export,
+ * - logger message callback.
+ */
VLC_API void playlist_Lock( playlist_t * );
+
+/**
+ * Unlocks the playlist.
+ *
+ * This function unlocks the playlist, allowing other threads to lock it. The
+ * calling thread must have called playlist_Lock() before.
+ *
+ * This function invalidates all or any playlist item pointers.
+ * There are no ways to ensure that playlist item are not modified or deleted
+ * by another thread past this function call.
+ *
+ * To retain a reference to a playlist item while not holding the playlist
+ * lock, a thread should take a reference to the input item within the
+ * playlist item before unlocking. If this is not practical, then the thread
+ * can store the playlist item ID (i_id) before unlocking.
+ * Either way, this will not ensure that the playlist item is not deleted, so
+ * the thread must be ready to handle that case later when calling
+ * playlist_ItemGetByInput() or playlist_ItemGetById().
+ *
+ * Furthermore, if ID is used, then the playlist item might be deleted, and
+ * another item could be assigned the same ID. To avoid that problem, use
+ * the input item instead of the ID.
+ */
VLC_API void playlist_Unlock( playlist_t * );
+
VLC_API void playlist_AssertLocked( playlist_t * );
VLC_API void playlist_Deactivate( playlist_t * );
More information about the vlc-commits
mailing list