Add helpers for using automatic stack'd variable cleaning for lockable
objects.
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
src/libvirt_private.syms | 2 ++
src/util/virobject.c | 29 +++++++++++++++++++++++++++++
src/util/virobject.h | 30 ++++++++++++++++++++++++++++++
3 files changed, 61 insertions(+)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 7b681fac64..5c8fd6a929 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -2635,6 +2635,8 @@ virClassForObjectRWLockable;
virClassIsDerivedFrom;
virClassName;
virClassNew;
+virObjectAutoRelease;
+virObjectAutoUnlock;
virObjectAutoUnref;
virObjectFreeCallback;
virObjectFreeHashData;
diff --git a/src/util/virobject.c b/src/util/virobject.c
index 919519735a..6bc8b08c89 100644
--- a/src/util/virobject.c
+++ b/src/util/virobject.c
@@ -381,6 +381,35 @@ virObjectAutoUnref(void *objptr)
}
+/**
+ * virObjectAutoUnlock:
+ *
+ * Helper used by VIR_AUTOUNLOCK
+ */
+void
+virObjectAutoUnlock(void *objptr)
+{
+ virObjectPtr *obj = objptr;
+ virObjectUnlock(*obj);
+ *obj = NULL;
+}
+
+
+/**
+ * virObjectAutoRelease:
+ *
+ * Helper used by VIR_AUTORELEASE
+ */
+void
+virObjectAutoRelease(void *objptr)
+{
+ virObjectPtr *obj = objptr;
+ virObjectUnlock(*obj);
+ virObjectUnref(*obj);
+ *obj = NULL;
+}
+
+
/**
* virObjectRef:
* @anyobj: any instance of virObjectPtr
diff --git a/src/util/virobject.h b/src/util/virobject.h
index 6fca4cd166..2f3f6d207e 100644
--- a/src/util/virobject.h
+++ b/src/util/virobject.h
@@ -112,6 +112,12 @@ virObjectUnref(void *obj);
void
virObjectAutoUnref(void *objptr);
+void
+virObjectAutoUnlock(void *objptr);
+
+void
+virObjectAutoRelease(void *objptr);
+
/**
* VIR_AUTOUNREF:
* @type: type of an virObject subclass to be unref'd automatically
@@ -124,6 +130,30 @@ virObjectAutoUnref(void *objptr);
#define VIR_AUTOUNREF(type) \
__attribute__((cleanup(virObjectAutoUnref))) type
+/**
+ * VIR_AUTOUNLOCK:
+ * @type: type of an virObjectLockable subclass to be unlocked automatically
+ *
+ * Declares a variable of @type which will be automatically unlocked when
+ * control goes out of the scope. The lockable object referenced by the pointer
+ * assigned to the variable declared by this macro must already be locked
+ * at the time of assignment.
+ */
+#define VIR_AUTOUNLOCK(type) \
+ __attribute__((cleanup(virObjectAutoUnlock))) type
+
+/**
+ * VIR_AUTORELEASE:
+ * @type: type of an virObjectLockable subclass to be unlocked and unref'd
automatically
+ *
+ * Declares a variable of @type which will be automatically unlocked and unref'd
+ * when control goes out of the scope. The lockable object referenced by the
+ * pointer assigned to the variable declared by this macro must already be
+ * locked and referenced at the time of assignment.
+ */
+#define VIR_AUTORELEASE(type) \
+ __attribute__((cleanup(virObjectAutoRelease))) type
+
void *
virObjectRef(void *obj);
--
2.21.0