]> xenbits.xensource.com Git - libvirt.git/commitdiff
util: alloc: Introduce VIR_AUTOUNREF macro
authorPeter Krempa <pkrempa@redhat.com>
Fri, 15 Feb 2019 11:35:12 +0000 (12:35 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 18 Feb 2019 09:31:21 +0000 (10:31 +0100)
Add helper for utilizing __attribute__(cleanup())) for unref-ing
instances of sublasses of virObject.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Erik Skultety <eskultet@redhat.com>
src/libvirt_private.syms
src/util/viralloc.h
src/util/virobject.c
src/util/virobject.h

index 0a959c4bf9907db0d2fead27aa9e928957b10ec5..b6fec233f1d56278af727729d6a301901112ce83 100644 (file)
@@ -2511,6 +2511,7 @@ virClassForObjectRWLockable;
 virClassIsDerivedFrom;
 virClassName;
 virClassNew;
+virObjectAutoUnref;
 virObjectFreeCallback;
 virObjectFreeHashData;
 virObjectIsClass;
index aa1b92241deb087671c592ec15b7f430d6bdad20..1d67fff95c247e47e1b4466945fa29a71e380bde 100644 (file)
@@ -637,4 +637,14 @@ void virAllocTestHook(void (*func)(int, void*), void *data);
 # define VIR_AUTOPTR(type) \
     __attribute__((cleanup(VIR_AUTOPTR_FUNC_NAME(type)))) type *
 
+/**
+ * VIR_AUTOUNREF:
+ * @type: type of an virObject subclass to be unref'd automatically
+ *
+ * Declares a variable of @type which will be automatically unref'd when
+ * control goes out of the scope.
+ */
+# define VIR_AUTOUNREF(type) \
+    __attribute__((cleanup(virObjectAutoUnref))) type
+
 #endif /* LIBVIRT_VIRALLOC_H */
index b6ea299420ba328cbb975642b4f6ca7098aec435..a4cbd0807752599f80d7f132a0a2d08546d2d42a 100644 (file)
@@ -362,6 +362,19 @@ virObjectUnref(void *anyobj)
 }
 
 
+/**
+ * virObjectAutoUnref:
+ *
+ * Helper used by VIR_AUTOUNREF
+ */
+void
+virObjectAutoUnref(void *objptr)
+{
+    virObjectPtr *obj = objptr;
+    virObjectUnref(*obj);
+}
+
+
 /**
  * virObjectRef:
  * @anyobj: any instance of virObjectPtr
index b39b9946fffa955ca0a7c5b52289a5c0d89f333e..56bc9f232459c02b899d601b28fb505123cf1f29 100644 (file)
@@ -102,6 +102,9 @@ virObjectNew(virClassPtr klass)
 bool
 virObjectUnref(void *obj);
 
+void
+virObjectAutoUnref(void *objptr);
+
 void *
 virObjectRef(void *obj);