From c3e308c2fe4b9c0c32307af2a5acb544681db08f Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Thu, 4 Dec 2008 22:09:35 +0000 Subject: [PATCH] Change daemon client linked list into array --- ChangeLog | 5 +++++ qemud/qemud.c | 43 ++++++++++++++++++++++++------------------- qemud/qemud.h | 4 +--- 3 files changed, 30 insertions(+), 22 deletions(-) diff --git a/ChangeLog b/ChangeLog index d64bed8053..f90b467122 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Thu Dec 4 22:09:41 GMT 2008 Daniel P. Berrange + + * 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 * qemud/remote.c: Change from a giant switch() on RPC number diff --git a/qemud/qemud.c b/qemud/qemud.c index 7d7a8ca325..117fadda4e 100644 --- a/qemud/qemud.c +++ b/qemud/qemud.c @@ -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) diff --git a/qemud/qemud.h b/qemud/qemud.h index ef5379184c..1639ae06fa 100644 --- a/qemud/qemud.h +++ b/qemud/qemud.h @@ -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;