]> xenbits.xensource.com Git - libvirt.git/commitdiff
datatypes: Introduce some admin-related close callback handling helpers
authorErik Skultety <eskultet@redhat.com>
Thu, 10 Nov 2016 12:20:26 +0000 (13:20 +0100)
committerErik Skultety <eskultet@redhat.com>
Mon, 14 Nov 2016 09:18:56 +0000 (10:18 +0100)
Well, there were three different spots where closeCallback->freeCallback was
called, not looking the same --> potential for bugs - and there indeed is a bug
with refcounting of the @conn object. So this patch partially follows the path
set by commit 24dbb69f by introducing some close callback helpers both to
replace all the spots where we call clean the close callback data with a
dedicated function and to be able to fix the refcounting bug causing a memleak.

Signed-off-by: Erik Skultety <eskultet@redhat.com>
po/POTFILES.in
src/datatypes.c
src/datatypes.h
src/libvirt_admin_private.syms

index 14692402216a4039729bf7855dbd520864e0e3a8..5a370833a9bb4f8a8960bf7b7fce99971e3421fc 100644 (file)
@@ -47,6 +47,7 @@ src/cpu/cpu_arm.c
 src/cpu/cpu_map.c
 src/cpu/cpu_ppc64.c
 src/cpu/cpu_x86.c
+src/datatypes.c
 src/driver.c
 src/esx/esx_driver.c
 src/esx/esx_network_driver.c
index ff0c46fab0c2d0d3844b9cf7df59293b2fd7dce3..24e4f776a04288592ee1dc5aafcb8f81cb06927b 100644 (file)
@@ -935,6 +935,68 @@ virAdmConnectCloseCallbackDataDispose(void *obj)
     virObjectUnlock(cb_data);
 }
 
+void
+virAdmConnectCloseCallbackDataReset(virAdmConnectCloseCallbackDataPtr cbdata)
+{
+    if (cbdata->freeCallback)
+        cbdata->freeCallback(cbdata->opaque);
+
+    virObjectUnref(cbdata->conn);
+    cbdata->conn = NULL;
+    cbdata->freeCallback = NULL;
+    cbdata->callback = NULL;
+    cbdata->opaque = NULL;
+}
+
+int
+virAdmConnectCloseCallbackDataUnregister(virAdmConnectCloseCallbackDataPtr cbdata,
+                                         virAdmConnectCloseFunc cb)
+{
+    int ret = -1;
+
+    virObjectLock(cbdata);
+    if (cbdata->callback != cb) {
+        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+                       _("A different callback was requested"));
+        goto cleanup;
+    }
+
+    virAdmConnectCloseCallbackDataReset(cbdata);
+    ret = 0;
+ cleanup:
+    virObjectUnlock(cbdata);
+    return ret;
+}
+
+int
+virAdmConnectCloseCallbackDataRegister(virAdmConnectCloseCallbackDataPtr cbdata,
+                                       virAdmConnectPtr conn,
+                                       virAdmConnectCloseFunc cb,
+                                       void *opaque,
+                                       virFreeCallback freecb)
+{
+    int ret = -1;
+
+    virObjectLock(cbdata);
+
+    if (cbdata->callback) {
+        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+                       _("A close callback is already registered"));
+        goto cleanup;
+    }
+
+    virObjectRef(conn);
+    cbdata->conn = conn;
+    cbdata->callback = cb;
+    cbdata->opaque = opaque;
+    cbdata->freeCallback = freecb;
+
+    ret = 0;
+ cleanup:
+    virObjectUnlock(conn->closeCallback);
+    return ret;
+}
+
 virAdmServerPtr
 virAdmGetServer(virAdmConnectPtr conn, const char *name)
 {
index 2b6adb4c45b0703cd16f58e392040d43fb0d0984..9a5fbbc2a084a8505f1cba94c51c1ac03405a6b0 100644 (file)
@@ -722,5 +722,13 @@ void virConnectCloseCallbackDataCall(virConnectCloseCallbackDataPtr close,
                                      int reason);
 virConnectCloseFunc
 virConnectCloseCallbackDataGetCallback(virConnectCloseCallbackDataPtr close);
+void virAdmConnectCloseCallbackDataReset(virAdmConnectCloseCallbackDataPtr cbdata);
+int virAdmConnectCloseCallbackDataRegister(virAdmConnectCloseCallbackDataPtr cbdata,
+                                           virAdmConnectPtr conn,
+                                           virAdmConnectCloseFunc cb,
+                                           void *opaque,
+                                           virFreeCallback freecb);
+int virAdmConnectCloseCallbackDataUnregister(virAdmConnectCloseCallbackDataPtr cbdata,
+                                             virAdmConnectCloseFunc cb);
 
 #endif /* __VIR_DATATYPES_H__ */
index 8c173ab428681d4c047a35159883274ad6e1ca29..191e3f2ef853d7ecf0f331ab4006acee8ba57b79 100644 (file)
@@ -29,6 +29,9 @@ xdr_admin_server_set_threadpool_parameters_args;
 # datatypes.h
 virAdmClientClass;
 virAdmConnectClass;
+virAdmConnectCloseCallbackDataRegister;
+virAdmConnectCloseCallbackDataReset;
+virAdmConnectCloseCallbackDataUnregister;
 virAdmGetServer;
 virAdmServerClass;