]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Change daemon client linked list into array
authorDaniel P. Berrange <berrange@redhat.com>
Thu, 4 Dec 2008 22:09:35 +0000 (22:09 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Thu, 4 Dec 2008 22:09:35 +0000 (22:09 +0000)
ChangeLog
qemud/qemud.c
qemud/qemud.h

index d64bed805395212b44e03545a4ee86153449faf6..f90b4671223ed167f8a1566c99081edb353c06c1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Thu Dec  4 22:09:41 GMT 2008 Daniel P. Berrange <berrange@redhat.com>
+
+       * qemud/qemud.h, qemud/qemud.c: Change client linked list into
+       an array for easier thread safety
+
 Thu Dec  4 22:01:41 GMT 2008 Daniel P. Berrange <berrange@redhat.com>
 
        * qemud/remote.c: Change from a giant switch() on RPC number
index 7d7a8ca325c8d94a8fe702b9f057a093e36a73c3..117fadda4ee8a95bfe0d404823c3a1511bddafc0 100644 (file)
@@ -1158,6 +1158,12 @@ static int qemudDispatchServer(struct qemud_server *server, struct qemud_socket
         return -1;
     }
 
+    if (VIR_REALLOC_N(server->clients, server->nclients+1) < 0) {
+        qemudLog(QEMUD_ERR, "%s", _("Out of memory allocating clients"));
+        close(fd);
+        return -1;
+    }
+
     /* Disable Nagle.  Unix sockets will ignore this. */
     setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, (void *)&no_slow_start,
                 sizeof no_slow_start);
@@ -1238,9 +1244,7 @@ static int qemudDispatchServer(struct qemud_server *server, struct qemud_socket
         }
     }
 
-    client->next = server->clients;
-    server->clients = client;
-    server->nclients++;
+    server->clients[server->nclients++] = client;
 
     return 0;
 
@@ -1255,19 +1259,19 @@ static int qemudDispatchServer(struct qemud_server *server, struct qemud_socket
 
 
 static void qemudDispatchClientFailure(struct qemud_server *server, struct qemud_client *client) {
-    struct qemud_client *tmp = server->clients;
-    struct qemud_client *prev = NULL;
-    while (tmp) {
-        if (tmp == client) {
-            if (prev == NULL)
-                server->clients = client->next;
-            else
-                prev->next = client->next;
-            server->nclients--;
+    int i, n = -1;
+    for (i = 0 ; i < server->nclients ; i++) {
+        if (server->clients[i] == client) {
+            n = i;
             break;
         }
-        prev = tmp;
-        tmp = tmp->next;
+    }
+    if (n != -1) {
+        if (n < (server->nclients-1))
+            memmove(server->clients + n,
+                    server->clients + n + 1,
+                    server->nclients - (n + 1));
+        server->nclients--;
     }
 
     virEventRemoveHandleImpl(client->watch);
@@ -1636,13 +1640,14 @@ qemudDispatchClientWrite(struct qemud_server *server,
 static void
 qemudDispatchClientEvent(int watch, int fd, int events, void *opaque) {
     struct qemud_server *server = (struct qemud_server *)opaque;
-    struct qemud_client *client = server->clients;
+    struct qemud_client *client = NULL;
+    int i;
 
-    while (client) {
-        if (client->watch == watch)
+    for (i = 0 ; i < server->nclients ; i++) {
+        if (server->clients[i]->watch == watch) {
+            client = server->clients[i];
             break;
-
-        client = client->next;
+        }
     }
 
     if (!client)
index ef5379184cd9ebe59f5a1b15f897699171eb09d5..1639ae06fa021fe82100145d29fc5380ca9b8c9f 100644 (file)
@@ -133,8 +133,6 @@ struct qemud_client {
 
     /* back-pointer to our server */
     struct qemud_server *server;
-
-    struct qemud_client *next;
 };
 
 #define QEMUD_CLIENT_MAGIC 0x7788aaee
@@ -155,7 +153,7 @@ struct qemud_server {
     int nsockets;
     struct qemud_socket *sockets;
     int nclients;
-    struct qemud_client *clients;
+    struct qemud_client **clients;
     int sigread;
     char logDir[PATH_MAX];
     unsigned int shutdown : 1;