More preparation for multi-thread support, this time in the libvirtd daemon. This removes the embedded linked list of 'struct qemud_client' and replaces it with an explicit array of pointers of client objects. This makes per-client locking more practical in a patch to follow. This touches suprisingly little code :-) qemud.c | 43 ++++++++++++++++++++++++------------------- qemud.h | 4 +--- 2 files changed, 25 insertions(+), 22 deletions(-) Daniel diff --git a/qemud/qemud.c b/qemud/qemud.c --- a/qemud/qemud.c +++ b/qemud/qemud.c @@ -1086,6 +1086,12 @@ static int qemudDispatchServer(struct qe 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); @@ -1165,9 +1171,7 @@ static int qemudDispatchServer(struct qe } } - client->next = server->clients; - server->clients = client; - server->nclients++; + server->clients[server->nclients++] = client; return 0; @@ -1182,19 +1186,19 @@ static int qemudDispatchServer(struct qe 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->fd); @@ -1554,13 +1558,14 @@ static void qemudDispatchClientWrite(str static void qemudDispatchClientEvent(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->fd == fd) + for (i = 0 ; i < server->nclients ; i++) { + if (server->clients[i]->fd == fd) { + client = server->clients[i]; break; - - client = client->next; + } } if (!client) diff --git a/qemud/qemud.h b/qemud/qemud.h --- a/qemud/qemud.h +++ b/qemud/qemud.h @@ -131,8 +131,6 @@ struct qemud_client { * called, it will be set back to NULL if that succeeds. */ virConnectPtr conn; - - struct qemud_client *next; }; #define QEMUD_CLIENT_MAGIC 0x7788aaee @@ -152,7 +150,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; -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :| -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list