[libvirt] [PATCH 07/13] vboxDumpDisplay: allocate the graphics structure upfront

Ján Tomko jtomko at redhat.com
Fri Feb 5 17:02:26 UTC 2016


Allocate it as soon as we know we will need it.

Add it to def->ngraphics if it's allocated, removing the need
to use the addDesktop and totalPresent variables to track this.
---
 src/vbox/vbox_common.c | 77 +++++++++++++++++++++++++++-----------------------
 1 file changed, 41 insertions(+), 36 deletions(-)

diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c
index e609e02..7a24de4 100644
--- a/src/vbox/vbox_common.c
+++ b/src/vbox/vbox_common.c
@@ -3302,7 +3302,6 @@ vboxDumpDisplay(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine)
     /* dump display options vrdp/gui/sdl */
     int sdlPresent            = 0;
     int guiPresent            = 0;
-    int totalPresent          = 0;
     char *guiDisplay          = NULL;
     char *sdlDisplay          = NULL;
     PRUnichar *keyTypeUtf16   = NULL;
@@ -3310,6 +3309,7 @@ vboxDumpDisplay(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine)
     char      *valueTypeUtf8  = NULL;
     IVRDxServer *VRDxServer   = NULL;
     PRBool VRDxEnabled        = PR_FALSE;
+    virDomainGraphicsDefPtr graphics = NULL;
     bool addDesktop = false;
     int ret = -1;
 
@@ -3330,6 +3330,9 @@ vboxDumpDisplay(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine)
         PRUnichar *valueDisplayUtf16 = NULL;
         char      *valueDisplayUtf8  = NULL;
 
+        if (VIR_ALLOC(graphics) < 0)
+            goto cleanup;
+
         VBOX_UTF8_TO_UTF16("FRONTEND/Display", &keyDislpayUtf16);
         gVBoxAPI.UIMachine.GetExtraData(machine, keyDislpayUtf16, &valueDisplayUtf16);
         VBOX_UTF16_FREE(keyDislpayUtf16);
@@ -3350,7 +3353,6 @@ vboxDumpDisplay(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine)
                  * exist and then only use it there
                  */
             }
-            totalPresent++;
         }
 
         if (STREQ(valueTypeUtf8, "gui")) {
@@ -3361,34 +3363,36 @@ vboxDumpDisplay(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine)
                  * exist and then only use it there
                  */
             }
-            totalPresent++;
         }
         VBOX_UTF8_FREE(valueDisplayUtf8);
     } else if (STRNEQ_NULLABLE(valueTypeUtf8, "vrdp")) {
-        addDesktop = true;
+        if (VIR_ALLOC(graphics) < 0)
+            goto cleanup;
     }
 
-    if (totalPresent > 0 || addDesktop) {
+    if (graphics) {
         if (VIR_ALLOC_N(def->graphics, 1) < 0)
             goto cleanup;
+
+        def->graphics[def->ngraphics] = graphics;
+        graphics = NULL;
     }
 
-    if (totalPresent > 0) {
-        if ((guiPresent) && (VIR_ALLOC(def->graphics[def->ngraphics]) >= 0)) {
+    if (guiPresent || sdlPresent) {
+        if ((guiPresent)) {
             def->graphics[def->ngraphics]->type = VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP;
             if (guiDisplay)
                 def->graphics[def->ngraphics]->data.desktop.display = guiDisplay;
             def->ngraphics++;
         }
 
-        if ((sdlPresent) && (VIR_ALLOC(def->graphics[def->ngraphics]) >= 0)) {
+        if ((sdlPresent)) {
             def->graphics[def->ngraphics]->type = VIR_DOMAIN_GRAPHICS_TYPE_SDL;
             if (sdlDisplay)
                 def->graphics[def->ngraphics]->data.sdl.display = sdlDisplay;
             def->ngraphics++;
         }
     } else if (addDesktop) {
-        if (VIR_ALLOC(def->graphics[def->ngraphics]) >= 0) {
             const char *tmp;
             def->graphics[def->ngraphics]->type = VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP;
             tmp = virGetEnvBlockSUID("DISPLAY");
@@ -3397,9 +3401,7 @@ vboxDumpDisplay(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine)
                  * display as NULL
                  */
             }
-            totalPresent++;
             def->ngraphics++;
-        }
     }
 
     gVBoxAPI.UIMachine.GetVRDxServer(machine, &VRDxServer);
@@ -3407,39 +3409,42 @@ vboxDumpDisplay(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine)
         gVBoxAPI.UIVRDxServer.GetEnabled(VRDxServer, &VRDxEnabled);
 
     if (VRDxEnabled) {
-        if (VIR_REALLOC_N(def->graphics, totalPresent) < 0)
+        PRUnichar *netAddressUtf16   = NULL;
+        char      *netAddressUtf8    = NULL;
+        PRBool allowMultiConnection  = PR_FALSE;
+        PRBool reuseSingleConnection = PR_FALSE;
+
+        if (VIR_ALLOC(graphics) < 0)
             goto cleanup;
 
-        if (VIR_ALLOC(def->graphics[def->ngraphics]) >= 0) {
-            PRUnichar *netAddressUtf16   = NULL;
-            char      *netAddressUtf8    = NULL;
-            PRBool allowMultiConnection  = PR_FALSE;
-            PRBool reuseSingleConnection = PR_FALSE;
+        if (VIR_REALLOC_N(def->graphics, def->ngraphics + 1) < 0)
+            goto cleanup;
 
-            gVBoxAPI.UIVRDxServer.GetPorts(data, VRDxServer, def->graphics[def->ngraphics]);
+        def->graphics[def->ngraphics] = graphics;
 
-            def->graphics[def->ngraphics]->type = VIR_DOMAIN_GRAPHICS_TYPE_RDP;
+        gVBoxAPI.UIVRDxServer.GetPorts(data, VRDxServer, def->graphics[def->ngraphics]);
 
-            gVBoxAPI.UIVRDxServer.GetNetAddress(data, VRDxServer, &netAddressUtf16);
-            if (netAddressUtf16) {
-                VBOX_UTF16_TO_UTF8(netAddressUtf16, &netAddressUtf8);
-                if (STRNEQ(netAddressUtf8, ""))
-                    virDomainGraphicsListenSetAddress(def->graphics[def->ngraphics], 0,
-                                                      netAddressUtf8, -1, true);
-                VBOX_UTF16_FREE(netAddressUtf16);
-                VBOX_UTF8_FREE(netAddressUtf8);
-            }
+        def->graphics[def->ngraphics]->type = VIR_DOMAIN_GRAPHICS_TYPE_RDP;
+
+        gVBoxAPI.UIVRDxServer.GetNetAddress(data, VRDxServer, &netAddressUtf16);
+        if (netAddressUtf16) {
+            VBOX_UTF16_TO_UTF8(netAddressUtf16, &netAddressUtf8);
+            if (STRNEQ(netAddressUtf8, ""))
+                virDomainGraphicsListenSetAddress(def->graphics[def->ngraphics], 0,
+                                                  netAddressUtf8, -1, true);
+            VBOX_UTF16_FREE(netAddressUtf16);
+            VBOX_UTF8_FREE(netAddressUtf8);
+        }
 
-            gVBoxAPI.UIVRDxServer.GetAllowMultiConnection(VRDxServer, &allowMultiConnection);
-            if (allowMultiConnection)
-                def->graphics[def->ngraphics]->data.rdp.multiUser = true;
+        gVBoxAPI.UIVRDxServer.GetAllowMultiConnection(VRDxServer, &allowMultiConnection);
+        if (allowMultiConnection)
+            def->graphics[def->ngraphics]->data.rdp.multiUser = true;
 
-            gVBoxAPI.UIVRDxServer.GetReuseSingleConnection(VRDxServer, &reuseSingleConnection);
-            if (reuseSingleConnection)
-                def->graphics[def->ngraphics]->data.rdp.replaceUser = true;
+        gVBoxAPI.UIVRDxServer.GetReuseSingleConnection(VRDxServer, &reuseSingleConnection);
+        if (reuseSingleConnection)
+            def->graphics[def->ngraphics]->data.rdp.replaceUser = true;
 
-            def->ngraphics++;
-        }
+        def->ngraphics++;
     }
 
     ret = 0;
-- 
2.4.10




More information about the libvir-list mailing list