]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
daemon: Rework remoteClientFreeFunc cleanup loops into C macro
authorJohn Ferlan <jferlan@redhat.com>
Mon, 27 Mar 2017 16:47:36 +0000 (12:47 -0400)
committerJohn Ferlan <jferlan@redhat.com>
Tue, 25 Apr 2017 11:26:36 +0000 (07:26 -0400)
Rather than 'n' repetitive code segments, let's create a single macro
which will make the code easier to read.

Signed-off-by: John Ferlan <jferlan@redhat.com>
daemon/remote.c

index 2709c3ccdfd41ed7f0ce916b8be0f2f3c34cece8..1e13f51e8bf85b3e59a6dfc3c58584209943f5a5 100644 (file)
@@ -1666,6 +1666,24 @@ void remoteRelayConnectionClosedEvent(virConnectPtr conn ATTRIBUTE_UNUSED, int r
                                   &msg);
 }
 
+#define DEREG_CB(conn, eventCallbacks, neventCallbacks, deregFcn, name)     \
+    do {                                                                    \
+        size_t i;                                                           \
+        for (i = 0; i < neventCallbacks; i++) {                             \
+            int callbackID = eventCallbacks[i]->callbackID;                 \
+            if (callbackID < 0) {                                           \
+                VIR_WARN("unexpected incomplete %s callback %zu", name, i); \
+                continue;                                                   \
+            }                                                               \
+            VIR_DEBUG("Deregistering remote %s event relay %d",             \
+                      name, callbackID);                                    \
+            eventCallbacks[i]->callbackID = -1;                             \
+            if (deregFcn(conn, callbackID) < 0)                             \
+                VIR_WARN("unexpected %s event deregister failure", name);   \
+        }                                                                   \
+        VIR_FREE(eventCallbacks);                                           \
+    } while (0);
+
 /*
  * You must hold lock for at least the client
  * We don't free stuff here, merely disconnect the client's
@@ -1680,98 +1698,27 @@ void remoteClientFreeFunc(void *data)
     /* Deregister event delivery callback */
     if (priv->conn) {
         virIdentityPtr sysident = virIdentityGetSystem();
-        size_t i;
 
         virIdentitySetCurrent(sysident);
 
-        for (i = 0; i < priv->ndomainEventCallbacks; i++) {
-            int callbackID = priv->domainEventCallbacks[i]->callbackID;
-            if (callbackID < 0) {
-                VIR_WARN("unexpected incomplete domain callback %zu", i);
-                continue;
-            }
-            VIR_DEBUG("Deregistering remote domain event relay %d",
-                      callbackID);
-            priv->domainEventCallbacks[i]->callbackID = -1;
-            if (virConnectDomainEventDeregisterAny(priv->conn, callbackID) < 0)
-                VIR_WARN("unexpected domain event deregister failure");
-        }
-        VIR_FREE(priv->domainEventCallbacks);
-
-        for (i = 0; i < priv->nnetworkEventCallbacks; i++) {
-            int callbackID = priv->networkEventCallbacks[i]->callbackID;
-            if (callbackID < 0) {
-                VIR_WARN("unexpected incomplete network callback %zu", i);
-                continue;
-            }
-            VIR_DEBUG("Deregistering remote network event relay %d",
-                      callbackID);
-            priv->networkEventCallbacks[i]->callbackID = -1;
-            if (virConnectNetworkEventDeregisterAny(priv->conn,
-                                                    callbackID) < 0)
-                VIR_WARN("unexpected network event deregister failure");
-        }
-        VIR_FREE(priv->networkEventCallbacks);
-
-        for (i = 0; i < priv->nstorageEventCallbacks; i++) {
-            int callbackID = priv->storageEventCallbacks[i]->callbackID;
-            if (callbackID < 0) {
-                VIR_WARN("unexpected incomplete storage pool callback %zu", i);
-                continue;
-            }
-            VIR_DEBUG("Deregistering remote storage pool event relay %d",
-                      callbackID);
-            priv->storageEventCallbacks[i]->callbackID = -1;
-            if (virConnectStoragePoolEventDeregisterAny(priv->conn,
-                                                        callbackID) < 0)
-                VIR_WARN("unexpected storage pool event deregister failure");
-        }
-        VIR_FREE(priv->storageEventCallbacks);
-
-        for (i = 0; i < priv->nnodeDeviceEventCallbacks; i++) {
-            int callbackID = priv->nodeDeviceEventCallbacks[i]->callbackID;
-            if (callbackID < 0) {
-                VIR_WARN("unexpected incomplete node device callback %zu", i);
-                continue;
-            }
-            VIR_DEBUG("Deregistering remote node device event relay %d",
-                      callbackID);
-            priv->nodeDeviceEventCallbacks[i]->callbackID = -1;
-            if (virConnectNodeDeviceEventDeregisterAny(priv->conn,
-                                                       callbackID) < 0)
-                VIR_WARN("unexpected node device event deregister failure");
-        }
-        VIR_FREE(priv->nodeDeviceEventCallbacks);
-
-        for (i = 0; i < priv->nsecretEventCallbacks; i++) {
-            int callbackID = priv->secretEventCallbacks[i]->callbackID;
-            if (callbackID < 0) {
-                VIR_WARN("unexpected incomplete secret callback %zu", i);
-                continue;
-            }
-            VIR_DEBUG("Deregistering remote secret event relay %d",
-                      callbackID);
-            priv->secretEventCallbacks[i]->callbackID = -1;
-            if (virConnectSecretEventDeregisterAny(priv->conn,
-                                                   callbackID) < 0)
-                VIR_WARN("unexpected secret event deregister failure");
-        }
-        VIR_FREE(priv->secretEventCallbacks);
-
-        for (i = 0; i < priv->nqemuEventCallbacks; i++) {
-            int callbackID = priv->qemuEventCallbacks[i]->callbackID;
-            if (callbackID < 0) {
-                VIR_WARN("unexpected incomplete qemu monitor callback %zu", i);
-                continue;
-            }
-            VIR_DEBUG("Deregistering remote qemu monitor event relay %d",
-                      callbackID);
-            priv->qemuEventCallbacks[i]->callbackID = -1;
-            if (virConnectDomainQemuMonitorEventDeregister(priv->conn,
-                                                           callbackID) < 0)
-                VIR_WARN("unexpected qemu monitor event deregister failure");
-        }
-        VIR_FREE(priv->qemuEventCallbacks);
+        DEREG_CB(priv->conn, priv->domainEventCallbacks,
+                 priv->ndomainEventCallbacks,
+                 virConnectDomainEventDeregisterAny, "domain");
+        DEREG_CB(priv->conn, priv->networkEventCallbacks,
+                 priv->nnetworkEventCallbacks,
+                 virConnectNetworkEventDeregisterAny, "network");
+        DEREG_CB(priv->conn, priv->storageEventCallbacks,
+                 priv->nstorageEventCallbacks,
+                 virConnectStoragePoolEventDeregisterAny, "storage");
+        DEREG_CB(priv->conn, priv->nodeDeviceEventCallbacks,
+                 priv->nnodeDeviceEventCallbacks,
+                 virConnectNodeDeviceEventDeregisterAny, "node device");
+        DEREG_CB(priv->conn, priv->secretEventCallbacks,
+                 priv->nsecretEventCallbacks,
+                 virConnectSecretEventDeregisterAny, "secret");
+        DEREG_CB(priv->conn, priv->qemuEventCallbacks,
+                 priv->nqemuEventCallbacks,
+                 virConnectDomainQemuMonitorEventDeregister, "qemu monitor");
 
         if (priv->closeRegistered) {
             if (virConnectUnregisterCloseCallback(priv->conn,
@@ -1787,6 +1734,7 @@ void remoteClientFreeFunc(void *data)
 
     VIR_FREE(priv);
 }
+#undef DEREG_CB
 
 
 static void remoteClientCloseFunc(virNetServerClientPtr client)