[vlc-devel] commit: Implement access_GetParentInput and demux_GetParentInput and use. ( Pierre d'Herbemont )
Laurent Aimar
fenrir at via.ecp.fr
Wed Aug 26 21:32:26 CEST 2009
On Wed, Aug 26, 2009, Pierre d'Herbemont wrote:
>
> On Aug 26, 2009, at 8:01 PM, Rémi Denis-Courmont wrote:
>
>>> Are we not supposed to do that? Fine, but don't let it compile
>>> without
>>> warning.
>>
>> How do you know that the caller is right or wrong?
>
> Just don't allow vlc_object_hold() on it. Then you are safe. Or make
Nope, on correctly written object, you can call var_Set* on a reference,
but you cannot arbitrary call any accessors. For that you need to look
at the docs when present, and if not documented, assume you cannot.
> sure that you allow p_demux->psz_path to be NULL, and don't set a random
> value to it.
Without lock, it would be pointless.
> What I am trying to point out, is that our API doesn't reflect the
> reality at all. You can vlc_object_hold() an object, but that won't
> actually let you live with a valid reference of it, with apparently no
> way to know it.
It kind of does, it's more a documentation problem.
- var_Set is legal (otherwise I would consider the module/object buggy)
- For accessors, it is more complex: you have 3 categories:
1. for module usage only.
2. for object owner only.
3. for the whole world.
For demux_t/access_t/stream_t, there are only accessors of type 1 and 2 and as
there are non threaded object (internal module thread does not count), 1 and 2
can in fact be used by both module and owner (being carefull with recursion).
> Either choose, we fix demux_Delete() or we make sure vlc_object_hold()
> doesn't work on that object.
It is wrong as explain.
>>> So, if they don't need to be refcounted and doesn't support
>>> refcounting, vlc_object_hold() should be disabled on those objects
>>> then.
>>
>> The private data does not support reference counting. It is completely
>> impossible. We need to attach an object *before* we run module_need()
>> on it,
>> so that variables can be propagated in pf_open. At the same time, as
>> soon as
>> an object is attached, it becomes visible from vlc_object_find(),
>> vlc_object_find_name() and vlc_list_children().
>
> Well, I thought we were going away from this. ie, we simply let owner
> decide to expose the object when it is ready, and try to remove those
> accessors.
Even if an object is ready, it may not be exposable. A lot of module are
in this situation with sometime the exception of var_Set/Get.
>
>> So evidently, anything that pf_open initializes or modifies is outside
>> the
>> scope of reference counting. From access_t, p_module, p_sys,
>> pf_control,
>> pf_read, p_block, psz_access, psz_path and info are all in that case
>> for
>> instance. Besides, we really don't want to make all object callbacks
>> re-
>> entrant. It would be too complicated, error-prone and inefficient.
>
> Err. Creating something outside refcounting is just fine, provided that
> access to the data is thread safe and that you don't let a random
> pointer value when you free it. This is the problem I am stating above.
No, a random value is fine if you are forbidden to use it in any case...
>> I stay by my statement that pf_destructor is almost completely
>> useless. It's
>> only useful for those few object types with type-specific thread-safe
>> data.
>
> It's useful if you want a set of data to be freed when it is not needed.
> ie - when you expect to do refcounting on some memory object.
And it is actually needed in only a really few cases, that is when
accessors of type 3 are presents.
--
fenrir
More information about the vlc-devel
mailing list