[vlc-devel] commit: Qt4: store input_item_t* in plitem and handle metadata in model ( Ilkka Ollakka )
Pierre d'Herbemont
pdherbemont at gmail.com
Fri Aug 14 12:43:56 CEST 2009
On Aug 14, 2009, at 12:19 PM, Jakob Leben wrote:
> On Fri, Aug 14, 2009 at 11:11 AM, Pierre d'Herbemont <pdherbemont at gmail.com
> > wrote:
> But imagine that in the time when we don't hold the lock the other
> thread adds a child to the playlist item, so changes it's
> pp_children field, but then unreferences both the item and its new
> child, before we could add a reference to the child! The former item
> will still exist as we had a reference to it, but with wrong
> reference to a child that got already deleted, as we didn't add a
> reference for it.
>
> That's one of the weakness of the playlist. However, this won't
> happen as playlist_item are only freed when the playlist is freed.
> See src/playlist/item.c
>
> int playlist_ItemRelease( playlist_item_t *p_item )
> {
> /* For the assert */
> playlist_t *p_playlist = p_item->p_playlist;
> PL_ASSERT_LOCKED;
>
> /* Surprise, we can't actually do more because we
> * don't do refcounting, or eauivalent.
> * Because item are not only accessed by their id
> * using playlist_item outside the PL_LOCK isn't safe.
> * modules do that.
> *
> * Who wants to add proper memory management? */
> uninstall_input_item_observer( p_item );
> ARRAY_APPEND( pl_priv(p_playlist)->items_to_delete, p_item);
> return VLC_SUCCESS;
> }
>
> As the comment in the above code suggests, the point of adding
> reference counting to playlist items is exactly that they can be
> freed sooner then when the playlist is freed. And I guess it is
> desirable so, instead of just hanging on to the current behavior.
It is the point of my mail, right.
> So then we *will* have the problem I was writing about.
For sure, there will be a synchronization issue between the playlist
data and the view.
> However, now I think of a possible solution: even if both parent and
> it's children are being removed, they shouldn't be just freed, but
> their internal pointers (parent -> children, child -> parent) should
> still be adjusted.
What is to be freed? The playlist_item? If there is someone holding a
reference to it, it won't happen with refcounting. With current
implementation those pointers will also always be valid
> This way when control in a qt interface returns from a view to our
> implementation of a model's function and it uses a QModelIndex with
> a pointer to the parent item, both that pointer and it's internal
> pointer to children are valid (only the pointer to children is NULL).
If you use refcounting they will *alway* be valid. Again, with current
implementation those pointer will also always be valid.
> This way we can still serve the view's request for data about the
> parent, even if it changed since it obtained the QModelIndex. I
> guess qt views should be (cosmetically) protected against this
> change of data, since the documentation states that QModelIndex is
> only temporary. The main concern is just to prevent segmentation
> faults.
This is addressed by refcounting, and proper ownership. You are not
trying to address segmentation fault but synchronization, unless I am
mistaken.
Pierre.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20090814/3854669a/attachment.html>
More information about the vlc-devel
mailing list