On 07/02/2017 21:03, Marc-André Lureau wrote:
> Hi
>
> ----- Original Message -----
>>
>>
>> On 02/02/2017 15:51, Marc-André Lureau wrote:
>>> + if (QTAILQ_IN_USE(chr, next)) {
>>> + QTAILQ_REMOVE(&chardevs, chr, next);
>>> + }
>>> + if (OBJECT(chr)->parent) {
>>> + object_unparent(OBJECT(chr));
>>> + } else {
>>> + object_unref(OBJECT(chr));
>>> + }
>>
>> What's the case where the "else" is used? Probably qemu_chr_delete
>> callers should be changed to use object_unparent or object_unref directly.
>
> I thought about that, but calling object_unparent() seems weird,
> since callers aren't much aware of the fact that chardev are added or not to a
> container (useless distinction imho). I wish the last object_unref()
> would automatically unparent, if the object has a parent. Would that be
> acceptable?
There is a distinction between the two. The idea is that unparent
removes all persistent references in the object tree, while unref only
removes transient references. So for example unparent will detach a
device from its bus. Unparent is basically exploiting the object tree
in order to simplify the handling of reference cycles.
Once you add an object with object_property_add_child, you probably
should remove any transient references you have (such as the one you got
with object_new) and from that point on use object_unparent only.
Paolo