Change daemon client linked list into array

This commit is contained in:
Daniel P. Berrange 2008-12-04 22:09:35 +00:00
parent 792322f00d
commit c3e308c2fe
3 changed files with 30 additions and 22 deletions

View File

@ -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> 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 * qemud/remote.c: Change from a giant switch() on RPC number

View File

@ -1158,6 +1158,12 @@ static int qemudDispatchServer(struct qemud_server *server, struct qemud_socket
return -1; 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. */ /* Disable Nagle. Unix sockets will ignore this. */
setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, (void *)&no_slow_start, setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, (void *)&no_slow_start,
sizeof 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[server->nclients++] = client;
server->clients = client;
server->nclients++;
return 0; 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) { static void qemudDispatchClientFailure(struct qemud_server *server, struct qemud_client *client) {
struct qemud_client *tmp = server->clients; int i, n = -1;
struct qemud_client *prev = NULL; for (i = 0 ; i < server->nclients ; i++) {
while (tmp) { if (server->clients[i] == client) {
if (tmp == client) { n = i;
if (prev == NULL)
server->clients = client->next;
else
prev->next = client->next;
server->nclients--;
break; 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); virEventRemoveHandleImpl(client->watch);
@ -1636,13 +1640,14 @@ qemudDispatchClientWrite(struct qemud_server *server,
static void static void
qemudDispatchClientEvent(int watch, int fd, int events, void *opaque) { qemudDispatchClientEvent(int watch, int fd, int events, void *opaque) {
struct qemud_server *server = (struct qemud_server *)opaque; struct qemud_server *server = (struct qemud_server *)opaque;
struct qemud_client *client = server->clients; struct qemud_client *client = NULL;
int i;
while (client) { for (i = 0 ; i < server->nclients ; i++) {
if (client->watch == watch) if (server->clients[i]->watch == watch) {
client = server->clients[i];
break; break;
}
client = client->next;
} }
if (!client) if (!client)

View File

@ -133,8 +133,6 @@ struct qemud_client {
/* back-pointer to our server */ /* back-pointer to our server */
struct qemud_server *server; struct qemud_server *server;
struct qemud_client *next;
}; };
#define QEMUD_CLIENT_MAGIC 0x7788aaee #define QEMUD_CLIENT_MAGIC 0x7788aaee
@ -155,7 +153,7 @@ struct qemud_server {
int nsockets; int nsockets;
struct qemud_socket *sockets; struct qemud_socket *sockets;
int nclients; int nclients;
struct qemud_client *clients; struct qemud_client **clients;
int sigread; int sigread;
char logDir[PATH_MAX]; char logDir[PATH_MAX];
unsigned int shutdown : 1; unsigned int shutdown : 1;