[Libvirt-cim] [PATCH 09/10] DevicePool: Use the virConnectListAll interfaces
Wenchao Xia
xiawenc at linux.vnet.ibm.com
Fri Mar 15 08:27:59 UTC 2013
于 2013-3-15 6:56, John Ferlan 写道:
> Rather than the somewhat unreliable get a count and get a list of active
> names, use the newer virConnectListAll* interfaces in order to retrieve both
> a count and list in one call.
> ---
> src/Virt_DevicePool.c | 121 +++++++++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 119 insertions(+), 2 deletions(-)
>
> diff --git a/src/Virt_DevicePool.c b/src/Virt_DevicePool.c
> index bf3dd3b..bffa0cf 100644
> --- a/src/Virt_DevicePool.c
> +++ b/src/Virt_DevicePool.c
> @@ -146,13 +146,24 @@ static int get_diskpool_config(virConnectPtr conn,
> struct tmp_disk_pool **_pools,
> int *_count)
> {
> +#if LIBVIR_VERSION_NUMBER >= 100002
> + int i, realcount = 0, count = 0;
> + virStoragePoolPtr *nameList = NULL;
> + int flags = VIR_CONNECT_LIST_STORAGE_POOLS_ACTIVE;
> +#else
> int count = 0, realcount = 0;
> int i;
> char ** names = NULL;
> +#endif
> struct tmp_disk_pool *pools = NULL;
> int ret = 0;
> bool bret;
>
> +#if LIBVIR_VERSION_NUMBER >= 100002
> + realcount = virConnectListAllStoragePools(conn,
> + &nameList,
> + flags);
> +#else
> count = virConnectNumOfStoragePools(conn);
> if (count < 0) {
> ret = count;
> @@ -169,6 +180,7 @@ static int get_diskpool_config(virConnectPtr conn,
> }
>
> realcount = virConnectListStoragePools(conn, names, count);
> +#endif
> if (realcount < 0) {
> CU_DEBUG("Failed to get storage pools, return %d.", realcount);
> ret = realcount;
> @@ -187,7 +199,13 @@ static int get_diskpool_config(virConnectPtr conn,
> }
>
> for (i = 0; i < realcount; i++) {
> - pools[i].tag = strdup(names[i]);
> +#if LIBVIR_VERSION_NUMBER >= 100002
> + pools[i].tag = strdup(getVirStoragePoolName(nameList[i]));
> +#else
> + /* Just take names[i], since we're free()'ing later */
> + pools[i].tag = names[i];
> + names[i] = NULL;
> +#endif
> if (pools[i].tag == NULL) {
> CU_DEBUG("Failed in strdup for name '%s'.", names[i]);
> ret = -3;
> @@ -213,10 +231,18 @@ static int get_diskpool_config(virConnectPtr conn,
> free_diskpool(pools, realcount);
>
> free_names:
> +#if LIBVIR_VERSION_NUMBER >= 100002
> + if (nameList != NULL) {
> + for (i = 0; i < realcount; i++)
> + virStoragePoolFree(nameList[i]);
> + free(nameList);
> + }
> +#else
> for (i = 0; i < count; i++) {
> free(names[i]);
> }
> free(names);
> +#endif
>
> out:
> return ret;
> @@ -529,6 +555,40 @@ static char *diskpool_member_of(const CMPIBroker *broker,
> static virNetworkPtr bridge_to_network(virConnectPtr conn,
> const char *bridge)
> {
> +#if LIBVIR_VERSION_NUMBER >= 100002
> + int num;
> + virNetworkPtr **nameList = NULL;
> + virNetworkPtr network = NULL;
> + flags = VIR_CONNECT_LIST_NETWORKS_ACTIVE;
> +
> + num = virConnectListAllNetworks(conn,
> + &nameList,
> + flags);
> + if (num < 0) {
> + CU_DEBUG("Failed to get network pools.");
> + return NULL;
> + }
> +
> + for (i = 0; i < num; i++) {
> + char *_netname;
> + char *_bridge;
> +
> + _netname = virNetworkGetName(nameList[i]);
> + _bridge = virNetworkGetBridgeName(network);
> + CU_DEBUG("Network `%s' has bridge `%s'", _netname, _bridge);
> + if (STREQ(bridge, _bridge)) {
> + network = nameList[i];
> + nameList[i] = NULL;
> + i = num; /* Loop breaker */
> + }
> + free(_bridge);
> + }
> +
> + for (i = 0; i < num; i++) {
> + virNetworkFree(nameList[i]);
> + }
> + free(nameList);
> +#else
> char **networks = NULL;
> virNetworkPtr network = NULL;
> int num;
> @@ -566,7 +626,7 @@ static virNetworkPtr bridge_to_network(virConnectPtr conn,
> for (i = 0; i < num; i++)
> free(networks[i]);
> free(networks);
> -
> +#endif
> return network;
> }
>
> @@ -748,6 +808,29 @@ static bool mempool_set_total(CMPIInstance *inst, virConnectPtr conn)
> static bool mempool_set_consumed(CMPIInstance *inst, virConnectPtr conn)
> {
> uint64_t memory = 0;
> +#if LIBVIR_VERSION_NUMBER >= 9013
> + virDomainPtr *nameList = NULL;
> + int n_names, i;
> + int flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE;
> +
> + n_names = virConnectListAllDomains(conn,
> + &nameList,
> + flags);
> + if (n_names < 0) {
> + CU_DEBUG("Failed to get a list of all domains");
> + goto out;
> + }
> +
> + for (i = 0; i < n_names; i++) {
> + virDomainInfo dom_info;
> + if (virDomainGetInfo(nameList[i], &dom_info) == 0)
> + memory += dom_info.memory;
> + virDomainFree(nameList[i]);
> + }
> + free(nameList);
> +
> + out:
> +#else
> int *domain_ids = NULL;
> int count, i = 0;
>
> @@ -781,6 +864,7 @@ static bool mempool_set_consumed(CMPIInstance *inst, virConnectPtr conn)
>
> out:
> free(domain_ids);
> +#endif /* LIBVIR_VERSION_NUMBER >= 0913 */
>
> CMSetProperty(inst, "Reserved",
> (CMPIValue *)&memory, CMPI_uint64);
> @@ -1034,6 +1118,10 @@ static CMPIStatus netpool_instance(virConnectPtr conn,
> char **netnames = NULL;
> int i;
> int nets = 0;
> +#if LIBVIR_VERSION_NUMBER >= 100002
> + virNetworkPtr **nameList = NULL;
> + flags = VIR_CONNECT_LIST_NETWORKS_ACTIVE;
> +#endif
>
> if (id != NULL) {
> return _netpool_for_network(list,
> @@ -1044,7 +1132,16 @@ static CMPIStatus netpool_instance(virConnectPtr conn,
> broker);
> }
>
> +#if LIBVIR_VERSION_NUMBER >= 100002
> + nets = virConnectListAllNetworks(conn,
> + &nameList,
> + flags);
> + /* Avoids the need to realloc since we have a true number */
> + if (nets >= 0)
> + nets++;
> +#else
> nets = virConnectNumOfNetworks(conn);
> +#endif
> if (nets < 0) {
> virt_set_status(broker, &s,
> CMPI_RC_ERR_FAILED,
> @@ -1062,6 +1159,18 @@ static CMPIStatus netpool_instance(virConnectPtr conn,
> goto out;
> }
>
> +#if LIBVIR_VERSION_NUMBER >= 100002
> + for (i = 0; i < nets - 1; i++) {
> + netnames[i] = strdup(virNetworkGetName(nameList[i]));
> + if (netnames[i] == NULL) {
> + cu_statusf(broker, &s,
> + CMPI_RC_ERR_FAILED,
> + "Failed to strdup memory for %i net names",
> + nets);
> + goto out;
> + }
> + }
> +#else
> nets = virConnectListNetworks(conn, netnames, nets);
>
> nets++;
> @@ -1072,6 +1181,7 @@ static CMPIStatus netpool_instance(virConnectPtr conn,
> "Failed to allocate memory for %i net names", nets);
> goto out;
> }
> +#endif
>
> netnames[nets - 1] = strdup("0");
>
> @@ -1085,6 +1195,13 @@ static CMPIStatus netpool_instance(virConnectPtr conn,
> }
>
> out:
> +#if LIBVIR_VERSION_NUMBER >= 100002
> + if (nameList != NULL) {
> + for (i = 0; i < nets - 1; i++)
> + virNetworkFree(nameList[i]);
> + free(nameList);
> + }
> +#endif
> if (netnames != NULL) {
> for (i = 0; i < nets; i++)
> free(netnames[i]);
>
-1, too much inline macros, which will make the file very hard to read
later, please use mirrored function pairs.
--
Best Regards
Wenchao Xia
More information about the Libvirt-cim
mailing list