[libvirt] [PATCH 5/9] lxc: switch to virCloseCallbacks API

Michal Privoznik mprivozn at redhat.com
Wed Jul 17 13:04:22 UTC 2013


---
 src/libvirt_private.syms     |   1 +
 src/lxc/lxc_conf.h           |   5 +-
 src/lxc/lxc_driver.c         |   6 +--
 src/lxc/lxc_process.c        | 113 ++++++++-----------------------------------
 src/lxc/lxc_process.h        |   1 -
 src/util/virclosecallbacks.c |  24 +++++++++
 src/util/virclosecallbacks.h |   3 ++
 7 files changed, 53 insertions(+), 100 deletions(-)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 53b1153..f55ab57 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1206,6 +1206,7 @@ virCgroupSetMemSwapHardLimit;
 
 # util/virclosecallbacks.h
 virCloseCallbacksGet;
+virCloseCallbacksGetConn;
 virCloseCallbacksNew;
 virCloseCallbacksRun;
 virCloseCallbacksSet;
diff --git a/src/lxc/lxc_conf.h b/src/lxc/lxc_conf.h
index 831e3e5..6c81368 100644
--- a/src/lxc/lxc_conf.h
+++ b/src/lxc/lxc_conf.h
@@ -35,6 +35,7 @@
 # include "vircgroup.h"
 # include "virsysinfo.h"
 # include "virusb.h"
+# include "virclosecallbacks.h"
 
 # define LXC_DRIVER_NAME "LXC"
 
@@ -103,8 +104,8 @@ struct _virLXCDriver {
     /* Immutable pointer. self-locking APIs */
     virSecurityManagerPtr securityManager;
 
-    /* Immutable pointer. Unsafe APIs. XXX */
-    virHashTablePtr autodestroy;
+    /* Immutable pointer, self-locking APIs */
+    virCloseCallbacksPtr closeCallbacks;
 };
 
 virLXCDriverConfigPtr virLXCDriverConfigNew(void);
diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
index 855dad3..60d21e3 100644
--- a/src/lxc/lxc_driver.c
+++ b/src/lxc/lxc_driver.c
@@ -163,7 +163,7 @@ static int lxcConnectClose(virConnectPtr conn)
     virLXCDriverPtr driver = conn->privateData;
 
     lxcDriverLock(driver);
-    virLXCProcessAutoDestroyRun(driver, conn);
+    virCloseCallbacksRun(driver->closeCallbacks, conn, driver->domains, driver);
     lxcDriverUnlock(driver);
 
     conn->privateData = NULL;
@@ -1563,7 +1563,7 @@ static int lxcStateInitialize(bool privileged,
     if (!(lxc_driver->xmlopt = lxcDomainXMLConfInit()))
         goto cleanup;
 
-    if (virLXCProcessAutoDestroyInit(lxc_driver) < 0)
+    if (!(lxc_driver->closeCallbacks = virCloseCallbacksNew()))
         goto cleanup;
 
     /* Get all the running persistent or transient configs first */
@@ -1653,7 +1653,7 @@ static int lxcStateCleanup(void)
     virObjectUnref(lxc_driver->domains);
     virDomainEventStateFree(lxc_driver->domainEventState);
 
-    virLXCProcessAutoDestroyShutdown(lxc_driver);
+    virObjectUnref(lxc_driver->closeCallbacks);
 
     virSysinfoDefFree(lxc_driver->hostsysinfo);
 
diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c
index 4b83729..931aee9 100644
--- a/src/lxc/lxc_process.c
+++ b/src/lxc/lxc_process.c
@@ -54,122 +54,45 @@
 
 #define START_POSTFIX ": starting up\n"
 
-int virLXCProcessAutoDestroyInit(virLXCDriverPtr driver)
+static virDomainObjPtr
+lxcProcessAutoDestroy(void *drv,
+                      virDomainObjPtr dom,
+                      virConnectPtr conn)
 {
-    if (!(driver->autodestroy = virHashCreate(5, NULL)))
-        return -1;
-
-    return 0;
-}
-
-struct virLXCProcessAutoDestroyData {
-    virLXCDriverPtr driver;
-    virConnectPtr conn;
-};
-
-static void virLXCProcessAutoDestroyDom(void *payload,
-                                        const void *name,
-                                        void *opaque)
-{
-    struct virLXCProcessAutoDestroyData *data = opaque;
-    virConnectPtr conn = payload;
-    const char *uuidstr = name;
-    unsigned char uuid[VIR_UUID_BUFLEN];
-    virDomainObjPtr dom;
+    virLXCDriverPtr driver = drv;
     virDomainEventPtr event = NULL;
     virLXCDomainObjPrivatePtr priv;
 
-    VIR_DEBUG("conn=%p uuidstr=%s thisconn=%p", conn, uuidstr, data->conn);
-
-    if (data->conn != conn)
-        return;
-
-    if (virUUIDParse(uuidstr, uuid) < 0) {
-        VIR_WARN("Failed to parse %s", uuidstr);
-        return;
-    }
-
-    if (!(dom = virDomainObjListFindByUUID(data->driver->domains,
-                                           uuid))) {
-        VIR_DEBUG("No domain object to kill");
-        return;
-    }
+    VIR_DEBUG("driver=%p dom=%s conn=%p", driver, dom->def->name, conn);
 
     priv = dom->privateData;
     VIR_DEBUG("Killing domain");
-    virLXCProcessStop(data->driver, dom, VIR_DOMAIN_SHUTOFF_DESTROYED);
+    virLXCProcessStop(driver, dom, VIR_DOMAIN_SHUTOFF_DESTROYED);
     virDomainAuditStop(dom, "destroyed");
     event = virDomainEventNewFromObj(dom,
                                      VIR_DOMAIN_EVENT_STOPPED,
                                      VIR_DOMAIN_EVENT_STOPPED_DESTROYED);
     priv->doneStopEvent = true;
 
-    if (dom && !dom->persistent)
-        virDomainObjListRemove(data->driver->domains, dom);
+    if (dom && !dom->persistent) {
+        virDomainObjListRemove(driver->domains, dom);
+        dom = NULL;
+    }
 
-    if (dom)
-        virObjectUnlock(dom);
     if (event)
-        virDomainEventStateQueue(data->driver->domainEventState, event);
-    virHashRemoveEntry(data->driver->autodestroy, uuidstr);
+        virDomainEventStateQueue(driver->domainEventState, event);
+
+    return dom;
 }
 
 /*
  * Precondition: driver is locked
  */
-void virLXCProcessAutoDestroyRun(virLXCDriverPtr driver, virConnectPtr conn)
-{
-    struct virLXCProcessAutoDestroyData data = {
-        driver, conn
-    };
-    VIR_DEBUG("conn=%p", conn);
-    virHashForEach(driver->autodestroy, virLXCProcessAutoDestroyDom, &data);
-}
-
-void virLXCProcessAutoDestroyShutdown(virLXCDriverPtr driver)
-{
-    virHashFree(driver->autodestroy);
-}
-
-int virLXCProcessAutoDestroyAdd(virLXCDriverPtr driver,
-                                virDomainObjPtr vm,
-                                virConnectPtr conn)
-{
-    char uuidstr[VIR_UUID_STRING_BUFLEN];
-    virUUIDFormat(vm->def->uuid, uuidstr);
-    VIR_DEBUG("vm=%s uuid=%s conn=%p", vm->def->name, uuidstr, conn);
-    if (virHashAddEntry(driver->autodestroy, uuidstr, conn) < 0)
-        return -1;
-    return 0;
-}
-
-int virLXCProcessAutoDestroyRemove(virLXCDriverPtr driver,
-                                   virDomainObjPtr vm)
-{
-    char uuidstr[VIR_UUID_STRING_BUFLEN];
-    virUUIDFormat(vm->def->uuid, uuidstr);
-    VIR_DEBUG("vm=%s uuid=%s", vm->def->name, uuidstr);
-    if (virHashRemoveEntry(driver->autodestroy, uuidstr) < 0)
-        return -1;
-    return 0;
-}
-
-static virConnectPtr
-virLXCProcessAutoDestroyGetConn(virLXCDriverPtr driver,
-                                virDomainObjPtr vm)
-{
-    char uuidstr[VIR_UUID_STRING_BUFLEN];
-    virUUIDFormat(vm->def->uuid, uuidstr);
-    VIR_DEBUG("vm=%s uuid=%s", vm->def->name, uuidstr);
-    return virHashLookup(driver->autodestroy, uuidstr);
-}
-
-
 static int
 virLXCProcessReboot(virLXCDriverPtr driver,
                     virDomainObjPtr vm)
 {
-    virConnectPtr conn = virLXCProcessAutoDestroyGetConn(driver, vm);
+    virConnectPtr conn = virCloseCallbacksGetConn(driver->closeCallbacks, vm);
     int reason = vm->state.reason;
     bool autodestroy = false;
     int ret = -1;
@@ -242,7 +165,8 @@ static void virLXCProcessCleanup(virLXCDriverPtr driver,
     }
 
     /* Stop autodestroy in case guest is restarted */
-    virLXCProcessAutoDestroyRemove(driver, vm);
+    virCloseCallbacksUnset(driver->closeCallbacks, vm,
+                           lxcProcessAutoDestroy);
 
     if (priv->monitor) {
         virLXCMonitorClose(priv->monitor);
@@ -1288,7 +1212,8 @@ int virLXCProcessStart(virConnectPtr conn,
     }
 
     if (autoDestroy &&
-        virLXCProcessAutoDestroyAdd(driver, vm, conn) < 0)
+        virCloseCallbacksSet(driver->closeCallbacks, vm,
+                             conn, lxcProcessAutoDestroy) < 0)
         goto error;
 
     if (virDomainObjSetDefTransient(driver->caps, driver->xmlopt,
diff --git a/src/lxc/lxc_process.h b/src/lxc/lxc_process.h
index 779cc5f..4403ae8 100644
--- a/src/lxc/lxc_process.h
+++ b/src/lxc/lxc_process.h
@@ -33,7 +33,6 @@ int virLXCProcessStop(virLXCDriverPtr driver,
                       virDomainObjPtr vm,
                       virDomainShutoffReason reason);
 
-int virLXCProcessAutoDestroyInit(virLXCDriverPtr driver);
 void virLXCProcessAutoDestroyRun(virLXCDriverPtr driver,
                                  virConnectPtr conn);
 void virLXCProcessAutoDestroyShutdown(virLXCDriverPtr driver);
diff --git a/src/util/virclosecallbacks.c b/src/util/virclosecallbacks.c
index a926456..1de822d 100644
--- a/src/util/virclosecallbacks.c
+++ b/src/util/virclosecallbacks.c
@@ -208,6 +208,30 @@ virCloseCallbacksGet(virCloseCallbacksPtr closeCallbacks,
     return cb;
 }
 
+virConnectPtr
+virCloseCallbacksGetConn(virCloseCallbacksPtr closeCallbacks,
+                         virDomainObjPtr vm)
+{
+    char uuidstr[VIR_UUID_STRING_BUFLEN];
+    virDriverCloseDefPtr closeDef;
+    virConnectPtr conn = NULL;
+
+    virUUIDFormat(vm->def->uuid, uuidstr);
+    VIR_DEBUG("vm=%s, uuid=%s", vm->def->name, uuidstr);
+
+    virObjectLock(closeCallbacks);
+
+    closeDef = virHashLookup(closeCallbacks->list, uuidstr);
+    if (closeDef)
+        conn = closeDef->conn;
+
+    virObjectUnlock(closeCallbacks);
+
+    VIR_DEBUG("conn=%p", conn);
+    return conn;
+}
+
+
 typedef struct _virCloseCallbacksListEntry virCloseCallbacksListEntry;
 typedef virCloseCallbacksListEntry *virCloseCallbacksListEntryPtr;
 struct _virCloseCallbacksListEntry {
diff --git a/src/util/virclosecallbacks.h b/src/util/virclosecallbacks.h
index 9db641f..ca02e5c 100644
--- a/src/util/virclosecallbacks.h
+++ b/src/util/virclosecallbacks.h
@@ -45,6 +45,9 @@ virCloseCallback
 virCloseCallbacksGet(virCloseCallbacksPtr closeCallbacks,
                      virDomainObjPtr vm,
                      virConnectPtr conn);
+virConnectPtr
+virCloseCallbacksGetConn(virCloseCallbacksPtr closeCallbacks,
+                         virDomainObjPtr vm);
 void
 virCloseCallbacksRun(virCloseCallbacksPtr closeCallbacks,
                      virConnectPtr conn,
-- 
1.8.1.5




More information about the libvir-list mailing list