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