1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-03-20 07:59:00 +00:00

virobject: Improve documentation

I had to inspect the code to learn whether a final virObjectUnref()
calls ALL dispose callbacks in child-to-parent order (akin to C++
destructors), or whether I manually had to call a parent-class dispose
when writing a child class dispose method.  The answer is the
former. (Thankfully, since VIR_FREE wipes out pointers for safety,
even if I had guessed wrong, I probably would not have tripped over a
double-free fault when the parent dispose ran for the second time).  I
also had to read the code to learn if a dispose method was even
mandatory (it is not, although getting NULL through VIR_CLASS_NEW
requires a macro).  While at it, the VIR_CLASS_NEW macro requires that
the virObject component at offset 0 be reached through the name
'parent', not 'object'.

Signed-off-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Erik Skultety <eskultet@redhat.com>
This commit is contained in:
Eric Blake 2019-03-14 23:14:41 -05:00
parent c2bc419131
commit 632ac8f8e7
2 changed files with 13 additions and 6 deletions

View File

@ -147,10 +147,11 @@ virClassForObjectRWLockable(void)
*
* Register a new object class with @name. The @objectSize
* should give the total size of the object struct, which
* is expected to have a 'virObject object;' field as its
* first member. When the last reference on the object is
* released, the @dispose callback will be invoked to free
* memory of the object fields
* is expected to have a 'virObject parent;' field as (or
* contained in) its first member. When the last reference
* on the object is released, the @dispose callback will be
* invoked to free memory of the local object fields, as
* well as the dispose callbacks of the parent classes.
*
* Returns a new class instance
*/
@ -326,8 +327,9 @@ virObjectRWLockableDispose(void *anyobj)
* @anyobj: any instance of virObjectPtr
*
* Decrement the reference count on @anyobj and if
* it hits zero, runs the "dispose" callback associated
* with the object class and frees @anyobj.
* it hits zero, runs the "dispose" callbacks associated
* with the object class and its parents before freeing
* @anyobj.
*
* Returns true if the remaining reference count is
* non-zero, false if the object was disposed of

View File

@ -75,6 +75,11 @@ virClassPtr virClassForObjectRWLockable(void);
# define VIR_PARENT_REQUIRED ATTRIBUTE_NONNULL(1)
# endif
/* Assign the class description nameClass to represent struct @name
* (which must have an object-based 'parent' member at offset 0), and
* with parent class @prnt. nameDispose must exist as either a
* function or as a macro defined to NULL.
*/
# define VIR_CLASS_NEW(name, prnt) \
verify_expr(offsetof(name, parent) == 0, \
(name##Class = virClassNew(prnt, #name, sizeof(name), name##Dispose)))