[vlc-devel] [PATCH 01/12] input item: expose locked version of GetMeta()

Romain Vimont rom1v at videolabs.io
Sat Oct 13 17:56:23 CEST 2018

On Fri, Oct 12, 2018 at 11:46:35PM +0200, Romain Vimont wrote:
> On Fri, Oct 12, 2018 at 10:44:18PM +0300, Rémi Denis-Courmont wrote:
> > Le perjantaina 12. lokakuuta 2018, 0.14.39 EEST Romain Vimont a écrit :
> > > In order to sort the playlist correctly, the input items must be locked
> > > across several calls to GetMeta() (among others).
> > 
> > Taking multiple locks from the same class simultaneously is a terrible idea 
> > that will defeat lock dependency checkers (no that we use any, but we probably 
> > should).
> I agree. I wrote it that way (patch 7) because I wanted all these
> conditions simultaneously:
>  - _Sort() returning void (which implies sorting in place without memory
>    allocation);
>  - not unnecessarily inefficient (no lock/unlock on every compare());
>  - a correct sorting (the items must not be updated during sorting).
> > And it is theoretically only possible if there is an order, which this patch 
> > suspiciously fails to define.
> The input items instances are not supposed to be used in several
> playlists or services discoveries simultaneously (we copy them in that
> case), and in practice, _Sort() should be the only function which may
> lock several items, so lock-order inversion should never happen.
> But yes, in theory, the clients may do what they want with input items,
> including locking several of them, making lock-order inversion possible.
> So it's quite fragile.
> The alternative I have in mind is:
>  1. make _Sort() return a status (int) to report allocation failure;
>  2. create a separate temporary vector of a custom struct, containing
>     the useful properties of input_item_t and a reference to the
>     playlist item;
>  3. for each item, copy (with lock held) the properties which are
>     relevant for the requested sorting;
>  4. sort that temporary vector;
>  5. report the resulting order to the playlist items vector.
> What do you think?

Yet another alternative would be to copy the input item properties on
playlist item creation and update them on preparsing event.

More information about the vlc-devel mailing list