]> xenbits.xensource.com Git - libvirt.git/commitdiff
Introduce virNetlinkEventServiceStopAll() to stop all netlink services.
authorTang Chen <tangchen@cn.fujitsu.com>
Wed, 22 Aug 2012 04:10:24 +0000 (12:10 +0800)
committerDaniel Veillard <veillard@redhat.com>
Wed, 22 Aug 2012 10:23:58 +0000 (18:23 +0800)
This patch introduce virNetlinkEventServiceStopAll() to stop
all the monitors to receive netlink messages for libvirtd.

Signed-off-by: Tang Chen <tangchen@cn.fujitsu.com>
daemon/libvirtd.c
src/libvirt_private.syms
src/util/virnetlink.c
src/util/virnetlink.h

index 96c8dddf2c5f3cee480a54caa60a3d507d343cc8..c7f8d3b740d4ae8cf104a0f4132a68a70a504d41 100644 (file)
@@ -1327,7 +1327,7 @@ int main(int argc, char **argv) {
                 0, "shutdown", NULL, NULL);
 
 cleanup:
-    virNetlinkEventServiceStop(NETLINK_ROUTE);
+    virNetlinkEventServiceStopAll();
     virObjectUnref(remoteProgram);
     virObjectUnref(qemuProgram);
     virNetServerClose(srv);
index 8962de2ed9a7b1d6cb5b1d13f464a7da51ce9f35..d91f492cc376a02dc50e1c676f5cde66b71b4824 100644 (file)
@@ -1483,6 +1483,7 @@ virNetlinkEventRemoveClient;
 virNetlinkEventServiceIsRunning;
 virNetlinkEventServiceLocalPid;
 virNetlinkEventServiceStop;
+virNetlinkEventServiceStopAll;
 virNetlinkEventServiceStart;
 virNetlinkShutdown;
 virNetlinkStartup;
index 19619f5edc6c967859ecae786253a65b104be26c..2c5e9f315b633674a02c2cbcd6dfe3089ee640b5 100644 (file)
@@ -404,6 +404,46 @@ virNetlinkEventServiceStop(unsigned int protocol)
     return 0;
 }
 
+/**
+ * virNetlinkEventServiceStopAll:
+ *
+ * Stop all the monitors to receive netlink messages for libvirtd.
+ *
+ * Returns -1 if any monitor cannot be unregistered, 0 upon success
+ */
+int
+virNetlinkEventServiceStopAll(void)
+{
+    unsigned int i, j;
+    virNetlinkEventSrvPrivatePtr srv = NULL;
+
+    VIR_INFO("stopping all netlink event services");
+
+    for (i = 0; i < MAX_LINKS; i++) {
+        srv = server[i];
+        if (!srv)
+            continue;
+
+        virNetlinkEventServerLock(srv);
+        nl_close(srv->netlinknh);
+        virNetlinkFree(srv->netlinknh);
+        virEventRemoveHandle(srv->eventwatch);
+
+        for (j = 0; j < srv->handlesCount; j++) {
+            if (srv->handles[j].deleted == VIR_NETLINK_HANDLE_VALID)
+                virNetlinkEventRemoveClientPrimitive(j, i);
+        }
+
+        server[i] = NULL;
+        virNetlinkEventServerUnlock(srv);
+
+        virMutexDestroy(&srv->lock);
+        VIR_FREE(srv);
+    }
+
+    return 0;
+}
+
 /**
  * virNetlinkEventServiceIsRunning:
  *
@@ -731,6 +771,16 @@ int virNetlinkEventServiceStop(unsigned int protocol ATTRIBUTE_UNUSED)
     return 0;
 }
 
+/**
+ * stopNetlinkEventServerAll: stop all the monitors to receive netlink
+ * messages for libvirtd
+ */
+int virNetlinkEventServiceStopAll(void)
+{
+    VIR_DEBUG("%s", _(unsupported));
+    return 0;
+}
+
 /**
  * startNetlinkEventServer: start a monitor to receive netlink
  * messages for libvirtd
index 2e18af403f148924a392cc4f2661da1658128222..1982dae5b1549361696367133975f790a0c5d3d1 100644 (file)
@@ -53,6 +53,11 @@ typedef void (*virNetlinkEventRemoveCallback)(int watch, const virMacAddrPtr mac
  */
 int virNetlinkEventServiceStop(unsigned int protocol);
 
+/**
+ * stopNetlinkEventServerAll: stop all the monitors to receive netlink messages for libvirtd
+ */
+int virNetlinkEventServiceStopAll(void);
+
 /**
  * startNetlinkEventServer: start a monitor to receive netlink messages for libvirtd
  */