[libvirt] [PATCH v3 9/8] hellolibvirt: Adjust some comments and condition usage

John Ferlan jferlan at redhat.com
Wed Feb 27 12:28:56 UTC 2013


On 02/26/2013 07:54 PM, Eric Blake wrote:
> On 02/26/2013 07:20 AM, John Ferlan wrote:
> 
> I would have put '---' here, since...
> 

The information was only in the email not part of the git history. 
In the future I'll remember to put that after the '---'.

>>  examples/hellolibvirt/hellolibvirt.c | 26 ++++++++++++++------------
>>  1 file changed, 14 insertions(+), 12 deletions(-)
>>
> 
>> @@ -93,7 +94,7 @@ showDomains(virConnectPtr conn)
>>      char **nameList = NULL;
>>  
>>      numActiveDomains = virConnectNumOfDomains(conn);
>> -    if (-1 == numActiveDomains) {
>> +    if (numActiveDomains == -1) {
>>          ret = 1;
>>          printf("Failed to get number of active domains\n");
>>          showError(conn);
> 
> virConnectNumOfDomains is inherently racy.  Wouldn't it be better to
> just drop this section of our example?
> 

Considering the back and forth I decided to make "less" change because 
it's just an example, but I suppose I took too much off the top. 

So below are proposed adjustments.

>> @@ -101,7 +102,7 @@ showDomains(virConnectPtr conn)
>>      }
>>  
>>      numInactiveDomains = virConnectNumOfDefinedDomains(conn);
>> -    if (-1 == numInactiveDomains) {
>> +    if (numInactiveDomains == -1) {
>>          ret = 1;
>>          printf("Failed to get number of inactive domains\n");
>>          showError(conn);
> 
> Same question.
> 
>> @@ -113,17 +114,20 @@ showDomains(virConnectPtr conn)
>>  
>>      nameList = malloc(sizeof(*nameList) * numInactiveDomains);
>>  
>> -    if (NULL == nameList) {
>> +    if (!nameList) {
>>          ret = 1;
>>          printf("Could not allocate memory for list of inactive domains\n");
>>          goto out;
>>      }
>>  
>> +    /* The virConnectListDomains() will return a list of the active domains.
>> +     * Alternatively the virConnectListAllDomains() API would return a list
>> +     * of both active and inactive domains */
>>      numNames = virConnectListDefinedDomains(conn,
>>                                              nameList,
>>                                              numInactiveDomains);
> 
> I think it would be better to update the example to JUST use
> virConnectListAllDomains(), and completely avoid
> virConnectListDefinedDomains.
> 
>>  
>> -    if (-1 == numNames) {
>> +    if (numNames == -1) {
>>          ret = 1;
>>          printf("Could not get list of defined domains from hypervisor\n");
>>          showError(conn);
>> @@ -136,9 +140,7 @@ showDomains(virConnectPtr conn)
>>  
>>      for (i = 0 ; i < numNames ; i++) {
>>          printf("  %s\n", *(nameList + i));
>> -        /* The API documentation doesn't say so, but the names
>> -         * returned by virConnectListDefinedDomains are strdup'd and
>> -         * must be freed here.  */
>> +        /* must free the returned named per the API documentation */
>>          free(*(nameList + i));
> 
> Pre-existing, but '*(nameList + i)' looks odd; 'nameList[i]' looks nicer.
> 


Here's the differences from the v3 to what seems to be a happy medium.  

The virConnectNum* functions are still used just to "show" they exist 
and how to use them.  There's a comment before the usage.



diff --git a/examples/hellolibvirt/hellolibvirt.c b/examples/hellolibvirt/hellol
index 335a75e..26dd67f 100644
--- a/examples/hellolibvirt/hellolibvirt.c
+++ b/examples/hellolibvirt/hellolibvirt.c
@@ -91,8 +91,14 @@ static int
 showDomains(virConnectPtr conn)
 {
     int ret = 0, i, numNames, numInactiveDomains, numActiveDomains;
-    char **nameList = NULL;
-
+    int flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                VIR_CONNECT_LIST_DOMAINS_INACTIVE;
+    virDomainPtr *nameList = NULL;
+     * the current call.  A domain could be started or stopped and any
+     * assumptions made purely on these return values could result in
+     * unexpected results */
     numActiveDomains = virConnectNumOfDomains(conn);
     if (numActiveDomains == -1) {
         ret = 1;
@@ -112,40 +118,24 @@ showDomains(virConnectPtr conn)
     printf("There are %d active and %d inactive domains\n",
            numActiveDomains, numInactiveDomains);
 
-    nameList = malloc(sizeof(*nameList) * numInactiveDomains);
-
-    if (!nameList) {
-        ret = 1;
-        printf("Could not allocate memory for list of inactive domains\n");
-        goto out;
-    }
-
-    /* The virConnectListDomains() will return a list of the active domains.
-     * Alternatively the virConnectListAllDomains() API would return a list
-     * of both active and inactive domains */
-    numNames = virConnectListDefinedDomains(conn,
-                                            nameList,
-                                            numInactiveDomains);
-
-    if (numNames == -1) {
-        ret = 1;
-        printf("Could not get list of defined domains from hypervisor\n");
-        showError(conn);
-        goto out;
-    }
-
-    if (numNames > 0) {
-        printf("Inactive domains:\n");
-    }
-
-    for (i = 0 ; i < numNames ; i++) {
-        printf("  %s\n", *(nameList + i));
+    /* Return a list of all active and inactive domains. Using this API
+     * instead of virConnectListDomains() and virConnectListDefinedDomains()
+     * is preferred since it "solves" an inherit race between separated API
+     * calls if domains are started or stopped between calls */
+    numNames = virConnectListAllDomains(conn,
+                                        &nameList,
+                                        flags);
+    for (i = 0; i < numNames; i++) {
+        int active = virDomainIsActive(nameList[i]);
+        printf("  %8s (%s)\n",
+               virDomainGetName(nameList[i]),
+               (active == 1 ? "active" : "non-active"));
         /* must free the returned named per the API documentation */
-        free(*(nameList + i));
+        virDomainFree(nameList[i]);
     }
+    free(nameList);
 
 out:
-    free(nameList);
     return ret;
 }
 



This changes the output from:

Attempting to connect to hypervisor
Connected to hypervisor at "qemu:///system"
Hypervisor: "QEMU" version: 0.32.656
There are 0 active and 2 inactive domains
Inactive domains:
  foo
  bar
Disconnected from hypervisor


to

Attempting to connect to hypervisor
Connected to hypervisor at "qemu:///system"
Hypervisor: "QEMU" version: 0.32.656
There are 0 active and 2 inactive domains
       foo (non-active)
       bar (non-active)
Disconnected from hypervisor


John




More information about the libvir-list mailing list