From dd48e929c74661e53c4c5968d925bf8c074429ca Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Fri, 10 Oct 2008 14:50:26 +0000 Subject: [PATCH] Switch network objects to array instead of linked list --- ChangeLog | 6 +++ src/network_conf.c | 88 ++++++++++++++++++------------- src/network_conf.h | 20 +++++--- src/network_driver.c | 120 +++++++++++++++++++------------------------ src/test.c | 75 ++++++++++----------------- 5 files changed, 151 insertions(+), 158 deletions(-) diff --git a/ChangeLog b/ChangeLog index b86e727047..5e3e389520 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Fri Oct 10 15:39:00 BST 2008 Daniel P. Berrange + + * src/network_conf.c, src/network_conf.h, src/network_driver.c, + src/test.c: Switch to using array instead of linked list for + network objects + Fri Oct 10 15:19:00 BST 2008 Daniel P. Berrange * src/domain_conf.c, src/domain_conf.h: Switch to using diff --git a/src/network_conf.c b/src/network_conf.c index 800ead9748..8107b39ea1 100644 --- a/src/network_conf.c +++ b/src/network_conf.c @@ -52,28 +52,26 @@ VIR_ENUM_IMPL(virNetworkForward, __virReportErrorHelper(conn, VIR_FROM_NETWORK, code, __FILE__, \ __FUNCTION__, __LINE__, fmt) -virNetworkObjPtr virNetworkFindByUUID(const virNetworkObjPtr nets, +virNetworkObjPtr virNetworkFindByUUID(const virNetworkObjListPtr nets, const unsigned char *uuid) { - virNetworkObjPtr net = nets; - while (net) { - if (!memcmp(net->def->uuid, uuid, VIR_UUID_BUFLEN)) - return net; - net = net->next; - } + unsigned int i; + + for (i = 0 ; i < nets->count ; i++) + if (!memcmp(nets->objs[i]->def->uuid, uuid, VIR_UUID_BUFLEN)) + return nets->objs[i]; return NULL; } -virNetworkObjPtr virNetworkFindByName(const virNetworkObjPtr nets, +virNetworkObjPtr virNetworkFindByName(const virNetworkObjListPtr nets, const char *name) { - virNetworkObjPtr net = nets; - while (net) { - if (STREQ(net->def->name, name)) - return net; - net = net->next; - } + unsigned int i; + + for (i = 0 ; i < nets->count ; i++) + if (STREQ(nets->objs[i]->def->name, name)) + return nets->objs[i]; return NULL; } @@ -124,13 +122,24 @@ void virNetworkObjFree(virNetworkObjPtr net) VIR_FREE(net); } +void virNetworkObjListFree(virNetworkObjListPtr nets) +{ + unsigned int i; + + for (i = 0 ; i < nets->count ; i++) + virNetworkObjFree(nets->objs[i]); + + VIR_FREE(nets->objs); + nets->count = 0; +} + virNetworkObjPtr virNetworkAssignDef(virConnectPtr conn, - virNetworkObjPtr *nets, + virNetworkObjListPtr nets, const virNetworkDefPtr def) { virNetworkObjPtr network; - if ((network = virNetworkFindByName(*nets, def->name))) { + if ((network = virNetworkFindByName(nets, def->name))) { if (!virNetworkIsActive(network)) { virNetworkDefFree(network->def); network->def = def; @@ -149,34 +158,41 @@ virNetworkObjPtr virNetworkAssignDef(virConnectPtr conn, } network->def = def; - network->next = *nets; - *nets = network; + if (VIR_REALLOC_N(nets->objs, nets->count + 1) < 0) { + virNetworkReportError(conn, VIR_ERR_NO_MEMORY, NULL); + VIR_FREE(network); + return NULL; + } + + nets->objs[nets->count] = network; + nets->count++; return network; } -void virNetworkRemoveInactive(virNetworkObjPtr *nets, +void virNetworkRemoveInactive(virNetworkObjListPtr nets, const virNetworkObjPtr net) { - virNetworkObjPtr prev = NULL; - virNetworkObjPtr curr = *nets; + unsigned int i; - while (curr && - curr != net) { - prev = curr; - curr = curr->next; + for (i = 0 ; i < nets->count ; i++) { + if (nets->objs[i] == net) { + virNetworkObjFree(nets->objs[i]); + + if (i < (nets->count - 1)) + memmove(nets->objs + i, nets->objs + i + 1, + sizeof(*(nets->objs)) * (nets->count - (i + 1))); + + if (VIR_REALLOC_N(nets->objs, nets->count - 1) < 0) { + ; /* Failure to reduce memory allocation isn't fatal */ + } + nets->count--; + + break; + } } - - if (curr) { - if (prev) - prev->next = curr->next; - else - *nets = curr->next; - } - - virNetworkObjFree(net); } @@ -682,7 +698,7 @@ int virNetworkSaveConfig(virConnectPtr conn, } virNetworkObjPtr virNetworkLoadConfig(virConnectPtr conn, - virNetworkObjPtr *nets, + virNetworkObjListPtr nets, const char *configDir, const char *autostartDir, const char *file) @@ -736,7 +752,7 @@ error: } int virNetworkLoadAllConfigs(virConnectPtr conn, - virNetworkObjPtr *nets, + virNetworkObjListPtr nets, const char *configDir, const char *autostartDir) { diff --git a/src/network_conf.h b/src/network_conf.h index 7d9490e438..5304ccd775 100644 --- a/src/network_conf.h +++ b/src/network_conf.h @@ -88,8 +88,13 @@ struct _virNetworkObj { virNetworkDefPtr def; /* The current definition */ virNetworkDefPtr newDef; /* New definition to activate at shutdown */ +}; - virNetworkObjPtr next; +typedef struct _virNetworkObjList virNetworkObjList; +typedef virNetworkObjList *virNetworkObjListPtr; +struct _virNetworkObjList { + unsigned int count; + virNetworkObjPtr *objs; }; static inline int @@ -99,19 +104,20 @@ virNetworkIsActive(const virNetworkObjPtr net) } -virNetworkObjPtr virNetworkFindByUUID(const virNetworkObjPtr nets, +virNetworkObjPtr virNetworkFindByUUID(const virNetworkObjListPtr nets, const unsigned char *uuid); -virNetworkObjPtr virNetworkFindByName(const virNetworkObjPtr nets, +virNetworkObjPtr virNetworkFindByName(const virNetworkObjListPtr nets, const char *name); void virNetworkDefFree(virNetworkDefPtr def); void virNetworkObjFree(virNetworkObjPtr net); +void virNetworkObjListFree(virNetworkObjListPtr vms); virNetworkObjPtr virNetworkAssignDef(virConnectPtr conn, - virNetworkObjPtr *nets, + virNetworkObjListPtr nets, const virNetworkDefPtr def); -void virNetworkRemoveInactive(virNetworkObjPtr *nets, +void virNetworkRemoveInactive(virNetworkObjListPtr nets, const virNetworkObjPtr net); virNetworkDefPtr virNetworkDefParseString(virConnectPtr conn, @@ -132,13 +138,13 @@ int virNetworkSaveConfig(virConnectPtr conn, virNetworkObjPtr net); virNetworkObjPtr virNetworkLoadConfig(virConnectPtr conn, - virNetworkObjPtr *nets, + virNetworkObjListPtr nets, const char *configDir, const char *autostartDir, const char *file); int virNetworkLoadAllConfigs(virConnectPtr conn, - virNetworkObjPtr *nets, + virNetworkObjListPtr nets, const char *configDir, const char *autostartDir); diff --git a/src/network_driver.c b/src/network_driver.c index 72860b1d26..3d68cdd624 100644 --- a/src/network_driver.c +++ b/src/network_driver.c @@ -58,7 +58,7 @@ /* Main driver state */ struct network_driver { - virNetworkObjPtr networks; + virNetworkObjList networks; iptablesContext *iptables; brControl *brctl; @@ -89,23 +89,18 @@ static int networkShutdownNetworkDaemon(virConnectPtr conn, static struct network_driver *driverState = NULL; -static -void networkAutostartConfigs(struct network_driver *driver) { - virNetworkObjPtr network; +static void +networkAutostartConfigs(struct network_driver *driver) { + unsigned int i; - network = driver->networks; - while (network != NULL) { - virNetworkObjPtr next = network->next; - - if (network->autostart && - !virNetworkIsActive(network) && - networkStartNetworkDaemon(NULL, driver, network) < 0) { + for (i = 0 ; i < driver->networks.count ; i++) { + if (driver->networks.objs[i]->autostart && + !virNetworkIsActive(driver->networks.objs[i]) && + networkStartNetworkDaemon(NULL, driver, driver->networks.objs[i]) < 0) { virErrorPtr err = virGetLastError(); networkLog(NETWORK_ERR, _("Failed to autostart network '%s': %s\n"), - network->def->name, err->message); + driver->networks.objs[i]->def->name, err->message); } - - network = next; } } @@ -187,6 +182,9 @@ networkStartup(void) { */ static int networkReload(void) { + if (!driverState) + return 0; + virNetworkLoadAllConfigs(NULL, &driverState->networks, driverState->networkConfigDir, @@ -213,13 +211,14 @@ networkReload(void) { */ static int networkActive(void) { - virNetworkObjPtr net = driverState->networks; + unsigned int i; - while (net) { - if (virNetworkIsActive(net)) + if (!driverState) + return 0; + + for (i = 0 ; i < driverState->networks.count ; i++) + if (virNetworkIsActive(driverState->networks.objs[i])) return 1; - net = net->next; - } /* Otherwise we're happy to deal with a shutdown */ return 0; @@ -232,28 +231,19 @@ networkActive(void) { */ static int networkShutdown(void) { - virNetworkObjPtr network; + unsigned int i; if (!driverState) return -1; /* shutdown active networks */ - network = driverState->networks; - while (network) { - virNetworkObjPtr next = network->next; - if (virNetworkIsActive(network)) - networkShutdownNetworkDaemon(NULL, driverState, network); - network = next; - } + for (i = 0 ; i < driverState->networks.count ; i++) + if (virNetworkIsActive(driverState->networks.objs[i])) + networkShutdownNetworkDaemon(NULL, driverState, + driverState->networks.objs[i]); /* free inactive networks */ - network = driverState->networks; - while (network) { - virNetworkObjPtr next = network->next; - virNetworkObjFree(network); - network = next; - } - driverState->networks = NULL; + virNetworkObjListFree(&driverState->networks); VIR_FREE(driverState->logDir); VIR_FREE(driverState->networkConfigDir); @@ -815,7 +805,7 @@ static int networkShutdownNetworkDaemon(virConnectPtr conn ATTRIBUTE_UNUSED, static virNetworkPtr networkLookupByUUID(virConnectPtr conn ATTRIBUTE_UNUSED, const unsigned char *uuid) { struct network_driver *driver = (struct network_driver *)conn->networkPrivateData; - virNetworkObjPtr network = virNetworkFindByUUID(driver->networks, uuid); + virNetworkObjPtr network = virNetworkFindByUUID(&driver->networks, uuid); virNetworkPtr net; if (!network) { @@ -830,7 +820,7 @@ static virNetworkPtr networkLookupByUUID(virConnectPtr conn ATTRIBUTE_UNUSED, static virNetworkPtr networkLookupByName(virConnectPtr conn ATTRIBUTE_UNUSED, const char *name) { struct network_driver *driver = (struct network_driver *)conn->networkPrivateData; - virNetworkObjPtr network = virNetworkFindByName(driver->networks, name); + virNetworkObjPtr network = virNetworkFindByName(&driver->networks, name); virNetworkPtr net; if (!network) { @@ -860,31 +850,29 @@ static int networkCloseNetwork(virConnectPtr conn) { } static int networkNumNetworks(virConnectPtr conn) { - int nactive = 0; + int nactive = 0, i; struct network_driver *driver = (struct network_driver *)conn->networkPrivateData; - virNetworkObjPtr net = driver->networks; - while (net) { - if (virNetworkIsActive(net)) + + for (i = 0 ; i < driver->networks.count ; i++) + if (virNetworkIsActive(driver->networks.objs[i])) nactive++; - net = net->next; - } + return nactive; } static int networkListNetworks(virConnectPtr conn, char **const names, int nnames) { struct network_driver *driver = (struct network_driver *)conn->networkPrivateData; - virNetworkObjPtr network = driver->networks; int got = 0, i; - while (network && got < nnames) { - if (virNetworkIsActive(network)) { - if (!(names[got] = strdup(network->def->name))) { + + for (i = 0 ; i < driver->networks.count && got < nnames ; i++) { + if (virNetworkIsActive(driver->networks.objs[i])) { + if (!(names[got] = strdup(driver->networks.objs[i]->def->name))) { networkReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY, - "%s", _("failed to allocate space for VM name string")); + "%s", _("failed to allocate space for VM name string")); goto cleanup; } got++; } - network = network->next; } return got; @@ -895,31 +883,29 @@ static int networkListNetworks(virConnectPtr conn, char **const names, int nname } static int networkNumDefinedNetworks(virConnectPtr conn) { - int ninactive = 0; + int ninactive = 0, i; struct network_driver *driver = (struct network_driver *)conn->networkPrivateData; - virNetworkObjPtr net = driver->networks; - while (net) { - if (!virNetworkIsActive(net)) + + for (i = 0 ; i < driver->networks.count ; i++) + if (!virNetworkIsActive(driver->networks.objs[i])) ninactive++; - net = net->next; - } + return ninactive; } static int networkListDefinedNetworks(virConnectPtr conn, char **const names, int nnames) { struct network_driver *driver = (struct network_driver *)conn->networkPrivateData; - virNetworkObjPtr network = driver->networks; int got = 0, i; - while (network && got < nnames) { - if (!virNetworkIsActive(network)) { - if (!(names[got] = strdup(network->def->name))) { + + for (i = 0 ; i < driver->networks.count && got < nnames ; i++) { + if (!virNetworkIsActive(driver->networks.objs[i])) { + if (!(names[got] = strdup(driver->networks.objs[i]->def->name))) { networkReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY, - "%s", _("failed to allocate space for VM name string")); + "%s", _("failed to allocate space for VM name string")); goto cleanup; } got++; } - network = network->next; } return got; @@ -984,7 +970,7 @@ static virNetworkPtr networkDefine(virConnectPtr conn, const char *xml) { static int networkUndefine(virNetworkPtr net) { struct network_driver *driver = (struct network_driver *)net->conn->networkPrivateData; - virNetworkObjPtr network = virNetworkFindByUUID(driver->networks, net->uuid); + virNetworkObjPtr network = virNetworkFindByUUID(&driver->networks, net->uuid); if (!network) { networkReportError(net->conn, NULL, net, VIR_ERR_INVALID_DOMAIN, @@ -1009,7 +995,7 @@ static int networkUndefine(virNetworkPtr net) { static int networkStart(virNetworkPtr net) { struct network_driver *driver = (struct network_driver *)net->conn->networkPrivateData; - virNetworkObjPtr network = virNetworkFindByUUID(driver->networks, net->uuid); + virNetworkObjPtr network = virNetworkFindByUUID(&driver->networks, net->uuid); if (!network) { networkReportError(net->conn, NULL, net, VIR_ERR_INVALID_NETWORK, @@ -1022,7 +1008,7 @@ static int networkStart(virNetworkPtr net) { static int networkDestroy(virNetworkPtr net) { struct network_driver *driver = (struct network_driver *)net->conn->networkPrivateData; - virNetworkObjPtr network = virNetworkFindByUUID(driver->networks, net->uuid); + virNetworkObjPtr network = virNetworkFindByUUID(&driver->networks, net->uuid); int ret; if (!network) { @@ -1038,7 +1024,7 @@ static int networkDestroy(virNetworkPtr net) { static char *networkDumpXML(virNetworkPtr net, int flags ATTRIBUTE_UNUSED) { struct network_driver *driver = (struct network_driver *)net->conn->networkPrivateData; - virNetworkObjPtr network = virNetworkFindByUUID(driver->networks, net->uuid); + virNetworkObjPtr network = virNetworkFindByUUID(&driver->networks, net->uuid); if (!network) { networkReportError(net->conn, NULL, net, VIR_ERR_INVALID_NETWORK, @@ -1051,7 +1037,7 @@ static char *networkDumpXML(virNetworkPtr net, int flags ATTRIBUTE_UNUSED) { static char *networkGetBridgeName(virNetworkPtr net) { struct network_driver *driver = (struct network_driver *)net->conn->networkPrivateData; - virNetworkObjPtr network = virNetworkFindByUUID(driver->networks, net->uuid); + virNetworkObjPtr network = virNetworkFindByUUID(&driver->networks, net->uuid); char *bridge; if (!network) { networkReportError(net->conn, NULL, net, VIR_ERR_INVALID_NETWORK, @@ -1071,7 +1057,7 @@ static char *networkGetBridgeName(virNetworkPtr net) { static int networkGetAutostart(virNetworkPtr net, int *autostart) { struct network_driver *driver = (struct network_driver *)net->conn->networkPrivateData; - virNetworkObjPtr network = virNetworkFindByUUID(driver->networks, net->uuid); + virNetworkObjPtr network = virNetworkFindByUUID(&driver->networks, net->uuid); if (!network) { networkReportError(net->conn, NULL, net, VIR_ERR_INVALID_NETWORK, @@ -1087,7 +1073,7 @@ static int networkGetAutostart(virNetworkPtr net, static int networkSetAutostart(virNetworkPtr net, int autostart) { struct network_driver *driver = (struct network_driver *)net->conn->networkPrivateData; - virNetworkObjPtr network = virNetworkFindByUUID(driver->networks, net->uuid); + virNetworkObjPtr network = virNetworkFindByUUID(&driver->networks, net->uuid); if (!network) { networkReportError(net->conn, NULL, net, VIR_ERR_INVALID_NETWORK, diff --git a/src/test.c b/src/test.c index d40917d64e..ebf48bf384 100644 --- a/src/test.c +++ b/src/test.c @@ -58,7 +58,7 @@ struct _testConn { virCapsPtr caps; virNodeInfo nodeInfo; virDomainObjList domains; - virNetworkObjPtr networks; + virNetworkObjList networks; int numCells; testCell cells[MAX_CELLS]; }; @@ -100,7 +100,7 @@ static const virNodeInfo defaultNodeInfo = { \ privconn = (testConnPtr)net->conn->privateData; \ do { \ - if ((privnet = virNetworkFindByName(privconn->networks, \ + if ((privnet = virNetworkFindByName(&privconn->networks, \ (net)->name)) == NULL) { \ testError((net)->conn, NULL, (net), VIR_ERR_INVALID_ARG, \ __FUNCTION__); \ @@ -260,7 +260,7 @@ static int testOpenDefault(virConnectPtr conn) { error: virDomainObjListFree(&privconn->domains); - virNetworkObjFree(privconn->networks); + virNetworkObjListFree(&privconn->networks); virCapabilitiesFree(privconn->caps); VIR_FREE(privconn); return VIR_DRV_OPEN_ERROR; @@ -495,12 +495,7 @@ static int testOpenFromFile(virConnectPtr conn, if (fd != -1) close(fd); virDomainObjListFree(&privconn->domains); - net = privconn->networks; - while (net) { - virNetworkObjPtr tmp = net->next; - virNetworkObjFree(net); - net = tmp; - } + virNetworkObjListFree(&privconn->networks); VIR_FREE(privconn); conn->privateData = NULL; return VIR_DRV_OPEN_ERROR; @@ -547,16 +542,12 @@ static int testOpen(virConnectPtr conn, static int testClose(virConnectPtr conn) { - virNetworkObjPtr net; GET_CONNECTION(conn); + virCapabilitiesFree(privconn->caps); virDomainObjListFree(&privconn->domains); - net = privconn->networks; - while (net) { - virNetworkObjPtr tmp = net->next; - virNetworkObjFree(net); - net = tmp; - } + virNetworkObjListFree(&privconn->networks); + VIR_FREE (privconn); conn->privateData = conn; return 0; @@ -1283,7 +1274,7 @@ static virNetworkPtr testLookupNetworkByUUID(virConnectPtr conn, virNetworkObjPtr net = NULL; GET_CONNECTION(conn); - if ((net = virNetworkFindByUUID(privconn->networks, uuid)) == NULL) { + if ((net = virNetworkFindByUUID(&privconn->networks, uuid)) == NULL) { testError (conn, NULL, NULL, VIR_ERR_NO_NETWORK, NULL); return NULL; } @@ -1297,7 +1288,7 @@ static virNetworkPtr testLookupNetworkByName(virConnectPtr conn, virNetworkObjPtr net = NULL; GET_CONNECTION(conn); - if ((net = virNetworkFindByName(privconn->networks, name)) == NULL) { + if ((net = virNetworkFindByName(&privconn->networks, name)) == NULL) { testError (conn, NULL, NULL, VIR_ERR_NO_NETWORK, NULL); return NULL; } @@ -1307,32 +1298,26 @@ static virNetworkPtr testLookupNetworkByName(virConnectPtr conn, static int testNumNetworks(virConnectPtr conn) { - int numActive = 0; - virNetworkObjPtr net; + int numActive = 0, i; GET_CONNECTION(conn); - net = privconn->networks; - while (net) { - if (virNetworkIsActive(net)) + for (i = 0 ; i < privconn->networks.count ; i++) + if (virNetworkIsActive(privconn->networks.objs[i])) numActive++; - net = net->next; - } + return numActive; } static int testListNetworks(virConnectPtr conn, char **const names, int nnames) { - int n = 0; - virNetworkObjPtr net; + int n = 0, i; GET_CONNECTION(conn); - net = privconn->networks; memset(names, 0, sizeof(*names)*nnames); - while (net && n < nnames) { - if (virNetworkIsActive(net) && - !(names[n++] = strdup(net->def->name))) + for (i = 0 ; i < privconn->networks.count && n < nnames ; i++) + if (virNetworkIsActive(privconn->networks.objs[i]) && + !(names[n++] = strdup(privconn->networks.objs[i]->def->name))) goto no_memory; - net = net->next; - } + return n; no_memory: @@ -1343,32 +1328,26 @@ no_memory: } static int testNumDefinedNetworks(virConnectPtr conn) { - int numInactive = 0; - virNetworkObjPtr net; + int numInactive = 0, i; GET_CONNECTION(conn); - net = privconn->networks; - while (net) { - if (!virNetworkIsActive(net)) + for (i = 0 ; i < privconn->networks.count ; i++) + if (!virNetworkIsActive(privconn->networks.objs[i])) numInactive++; - net = net->next; - } + return numInactive; } static int testListDefinedNetworks(virConnectPtr conn, char **const names, int nnames) { - int n = 0; - virNetworkObjPtr net; + int n = 0, i; GET_CONNECTION(conn); - net = privconn->networks; memset(names, 0, sizeof(*names)*nnames); - while (net && n < nnames) { - if (!virNetworkIsActive(net) && - !(names[n++] = strdup(net->def->name))) + for (i = 0 ; i < privconn->networks.count && n < nnames ; i++) + if (!virNetworkIsActive(privconn->networks.objs[i]) && + !(names[n++] = strdup(privconn->networks.objs[i]->def->name))) goto no_memory; - net = net->next; - } + return n; no_memory: