[libvirt] [PATCH 33/66] vbox: Rewrite vboxDomainGetInfo

Taowei uaedante at gmail.com
Mon Aug 11 10:06:36 UTC 2014


---
 src/vbox/vbox_common.c        |   79 ++++++++++++++++++++++++++++++
 src/vbox/vbox_tmpl.c          |  106 ++++++++++-------------------------------
 src/vbox/vbox_uniformed_api.h |    5 ++
 3 files changed, 108 insertions(+), 82 deletions(-)

diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c
index b457c00..d661110 100644
--- a/src/vbox/vbox_common.c
+++ b/src/vbox/vbox_common.c
@@ -2669,3 +2669,82 @@ int vboxDomainSetMemory(virDomainPtr dom, unsigned long memory)
     vboxIIDUnalloc(&iid);
     return ret;
 }
+
+int vboxDomainGetInfo(virDomainPtr dom, virDomainInfoPtr info)
+{
+    VBOX_OBJECT_CHECK(dom->conn, int, -1);
+    vboxArray machines = VBOX_ARRAY_INITIALIZER;
+    char *machineName    = NULL;
+    PRUnichar *machineNameUtf16 = NULL;
+    nsresult rc;
+    size_t i = 0;
+
+    rc = gVBoxAPI.UArray.vboxArrayGet(&machines, data->vboxObj, ARRAY_GET_MACHINES);
+    if (NS_FAILED(rc)) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("Could not get list of machines, rc=%08x"), (unsigned)rc);
+        goto cleanup;
+    }
+
+    info->nrVirtCpu = 0;
+    for (i = 0; i < machines.count; ++i) {
+        IMachine *machine = machines.items[i];
+        PRBool isAccessible = PR_FALSE;
+
+        if (!machine)
+            continue;
+
+        gVBoxAPI.UIMachine.GetAccessible(machine, &isAccessible);
+        if (!isAccessible)
+            continue;
+
+        gVBoxAPI.UIMachine.GetName(machine, &machineNameUtf16);
+        VBOX_UTF16_TO_UTF8(machineNameUtf16, &machineName);
+
+        if (STREQ(dom->name, machineName)) {
+            /* Get the Machine State (also match it with
+            * virDomainState). Get the Machine memory and
+            * for time being set max_balloon and cur_balloon to same
+            * Also since there is no direct way of checking
+            * the cputime required (one condition being the
+            * VM is remote), return zero for cputime. Get the
+            * number of CPU.
+            */
+            PRUint32 CPUCount   = 0;
+            PRUint32 memorySize = 0;
+            PRUint32 state;
+            PRUint32 maxMemorySize = 4 * 1024;
+            ISystemProperties *systemProperties = NULL;
+
+            gVBoxAPI.UIVirtualBox.GetSystemProperties(data->vboxObj, &systemProperties);
+            if (systemProperties) {
+                gVBoxAPI.UISystemProperties.GetMaxGuestRAM(systemProperties, &maxMemorySize);
+                VBOX_RELEASE(systemProperties);
+                systemProperties = NULL;
+            }
+
+            gVBoxAPI.UIMachine.GetCPUCount(machine, &CPUCount);
+            gVBoxAPI.UIMachine.GetMemorySize(machine, &memorySize);
+            gVBoxAPI.UIMachine.GetState(machine, &state);
+
+            info->cpuTime = 0;
+            info->nrVirtCpu = CPUCount;
+            info->memory = memorySize * 1024;
+            info->maxMem = maxMemorySize * 1024;
+            info->state = gVBoxAPI.vboxConvertState(state);
+
+            ret = 0;
+        }
+
+        VBOX_UTF8_FREE(machineName);
+        VBOX_COM_UNALLOC_MEM(machineNameUtf16);
+        if (info->nrVirtCpu)
+            break;
+
+    }
+
+    gVBoxAPI.UArray.vboxArrayRelease(&machines);
+
+ cleanup:
+    return ret;
+}
diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
index 2cb564e..3ae1864 100644
--- a/src/vbox/vbox_tmpl.c
+++ b/src/vbox/vbox_tmpl.c
@@ -932,7 +932,7 @@ vboxSocketParseAddrUtf16(vboxGlobalData *data, const PRUnichar *utf16,
     return result;
 }
 
-static virDomainState vboxConvertState(enum MachineState state)
+static virDomainState _vboxConvertState(PRUint32 state)
 {
     switch (state) {
         case MachineState_Running:
@@ -954,86 +954,6 @@ static virDomainState vboxConvertState(enum MachineState state)
     }
 }
 
-static int vboxDomainGetInfo(virDomainPtr dom, virDomainInfoPtr info)
-{
-    VBOX_OBJECT_CHECK(dom->conn, int, -1);
-    vboxArray machines = VBOX_ARRAY_INITIALIZER;
-    char *machineName    = NULL;
-    PRUnichar *machineNameUtf16 = NULL;
-    nsresult rc;
-    size_t i = 0;
-
-    rc = vboxArrayGet(&machines, data->vboxObj, data->vboxObj->vtbl->GetMachines);
-    if (NS_FAILED(rc)) {
-        virReportError(VIR_ERR_INTERNAL_ERROR,
-                       _("Could not get list of machines, rc=%08x"), (unsigned)rc);
-        goto cleanup;
-    }
-
-    info->nrVirtCpu = 0;
-    for (i = 0; i < machines.count; ++i) {
-        IMachine *machine = machines.items[i];
-        PRBool isAccessible = PR_FALSE;
-
-        if (!machine)
-            continue;
-
-        machine->vtbl->GetAccessible(machine, &isAccessible);
-        if (isAccessible) {
-
-            machine->vtbl->GetName(machine, &machineNameUtf16);
-            VBOX_UTF16_TO_UTF8(machineNameUtf16, &machineName);
-
-            if (STREQ(dom->name, machineName)) {
-                /* Get the Machine State (also match it with
-                * virDomainState). Get the Machine memory and
-                * for time being set max_balloon and cur_balloon to same
-                * Also since there is no direct way of checking
-                * the cputime required (one condition being the
-                * VM is remote), return zero for cputime. Get the
-                * number of CPU.
-                */
-                PRUint32 CPUCount   = 0;
-                PRUint32 memorySize = 0;
-                PRUint32 state      = MachineState_Null;
-                PRUint32 maxMemorySize = 4 * 1024;
-                ISystemProperties *systemProperties = NULL;
-
-                data->vboxObj->vtbl->GetSystemProperties(data->vboxObj, &systemProperties);
-                if (systemProperties) {
-                    systemProperties->vtbl->GetMaxGuestRAM(systemProperties, &maxMemorySize);
-                    VBOX_RELEASE(systemProperties);
-                    systemProperties = NULL;
-                }
-
-
-                machine->vtbl->GetCPUCount(machine, &CPUCount);
-                machine->vtbl->GetMemorySize(machine, &memorySize);
-                machine->vtbl->GetState(machine, &state);
-
-                info->cpuTime = 0;
-                info->nrVirtCpu = CPUCount;
-                info->memory = memorySize * 1024;
-                info->maxMem = maxMemorySize * 1024;
-                info->state = vboxConvertState(state);
-
-                ret = 0;
-            }
-
-            VBOX_UTF8_FREE(machineName);
-            VBOX_COM_UNALLOC_MEM(machineNameUtf16);
-            if (info->nrVirtCpu)
-                break;
-        }
-
-    }
-
-    vboxArrayRelease(&machines);
-
- cleanup:
-    return ret;
-}
-
 static int
 vboxDomainGetState(virDomainPtr dom,
                    int *state,
@@ -1058,7 +978,7 @@ vboxDomainGetState(virDomainPtr dom,
 
     machine->vtbl->GetState(machine, &mstate);
 
-    *state = vboxConvertState(mstate);
+    *state = _vboxConvertState(mstate);
 
     if (reason)
         *reason = 0;
@@ -9556,12 +9476,24 @@ _machineGetUSBCommon(IMachine *machine, IUSBCommon **USBCommon)
 }
 
 static nsresult
+_machineGetCPUCount(IMachine *machine, PRUint32 *CPUCount)
+{
+    return machine->vtbl->GetCPUCount(machine, CPUCount);
+}
+
+static nsresult
 _machineSetCPUCount(IMachine *machine, PRUint32 CPUCount)
 {
     return machine->vtbl->SetCPUCount(machine, CPUCount);
 }
 
 static nsresult
+_machineGetMemorySize(IMachine *machine, PRUint32 *memorySize)
+{
+    return machine->vtbl->GetMemorySize(machine, memorySize);
+}
+
+static nsresult
 _machineSetMemorySize(IMachine *machine, PRUint32 memorySize)
 {
     return machine->vtbl->SetMemorySize(machine, memorySize);
@@ -9829,6 +9761,12 @@ _systemPropertiesGetMaxDevicesPerPortForStorageBus(ISystemProperties *systemProp
 #endif
 
 static nsresult
+_systemPropertiesGetMaxGuestRAM(ISystemProperties *systemProperties, PRUint32 *maxGuestRAM)
+{
+    return systemProperties->vtbl->GetMaxGuestRAM(systemProperties, maxGuestRAM);
+}
+
+static nsresult
 _biosSettingsSetACPIEnabled(IBIOSSettings *bios, PRBool ACPIEnabled)
 {
     return bios->vtbl->SetACPIEnabled(bios, ACPIEnabled);
@@ -10234,7 +10172,9 @@ static vboxUniformedIMachine _UIMachine = {
     .GetParallelPort = _machineGetParallelPort,
     .GetVRDxServer = _machineGetVRDxServer,
     .GetUSBCommon = _machineGetUSBCommon,
+    .GetCPUCount = _machineGetCPUCount,
     .SetCPUCount = _machineSetCPUCount,
+    .GetMemorySize = _machineGetMemorySize,
     .SetMemorySize = _machineSetMemorySize,
     .SetCPUProperty = _machineSetCPUProperty,
     .SetBootOrder = _machineSetBootOrder,
@@ -10278,6 +10218,7 @@ static vboxUniformedISystemProperties _UISystemProperties = {
     .GetParallelPortCount = _systemPropertiesGetParallelPortCount,
     .GetMaxPortCountForStorageBus = _systemPropertiesGetMaxPortCountForStorageBus,
     .GetMaxDevicesPerPortForStorageBus = _systemPropertiesGetMaxDevicesPerPortForStorageBus,
+    .GetMaxGuestRAM = _systemPropertiesGetMaxGuestRAM,
 };
 
 static vboxUniformedIBIOSSettings _UIBIOSSettings = {
@@ -10362,6 +10303,7 @@ void NAME(InstallUniformedAPI)(vboxUniformedAPI *pVBoxAPI)
     pVBoxAPI->unregisterMachine = _unregisterMachine;
     pVBoxAPI->deleteConfig = _deleteConfig;
     pVBoxAPI->vboxAttachDrivesOld = _vboxAttachDrivesOld;
+    pVBoxAPI->vboxConvertState = _vboxConvertState;
     pVBoxAPI->UPFN = _UPFN;
     pVBoxAPI->UIID = _UIID;
     pVBoxAPI->UArray = _UArray;
diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h
index bc76904..897e10c 100644
--- a/src/vbox/vbox_uniformed_api.h
+++ b/src/vbox/vbox_uniformed_api.h
@@ -212,7 +212,9 @@ typedef struct {
     nsresult (*GetParallelPort)(IMachine *machine, PRUint32 slot, IParallelPort **port);
     nsresult (*GetVRDxServer)(IMachine *machine, IVRDxServer **VRDxServer);
     nsresult (*GetUSBCommon)(IMachine *machine, IUSBCommon **USBCommon);
+    nsresult (*GetCPUCount)(IMachine *machine, PRUint32 *CPUCount);
     nsresult (*SetCPUCount)(IMachine *machine, PRUint32 CPUCount);
+    nsresult (*GetMemorySize)(IMachine *machine, PRUint32 *memorySize);
     nsresult (*SetMemorySize)(IMachine *machine, PRUint32 memorySize);
     nsresult (*SetCPUProperty)(IMachine *machine, PRUint32 property, PRBool value);
     nsresult (*SetBootOrder)(IMachine *machine, PRUint32 position, PRUint32 device);
@@ -263,6 +265,7 @@ typedef struct {
                                              PRUint32 *maxPortCount);
     nsresult (*GetMaxDevicesPerPortForStorageBus)(ISystemProperties *systemProperties,
                                                   PRUint32 bus, PRUint32 *maxDevicesPerPort);
+    nsresult (*GetMaxGuestRAM)(ISystemProperties *systemProperties, PRUint32 *maxGuestRAM);
 } vboxUniformedISystemProperties;
 
 /* Functions for IBIOSSettings */
@@ -360,6 +363,7 @@ typedef struct {
     nsresult (*unregisterMachine)(vboxGlobalData *data, vboxIIDUnion *iidu, IMachine **machine);
     void (*deleteConfig)(IMachine *machine);
     void (*vboxAttachDrivesOld)(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine);
+    virDomainState (*vboxConvertState)(PRUint32 state);
     vboxUniformedPFN UPFN;
     vboxUniformedIID UIID;
     vboxUniformedArray UArray;
@@ -431,6 +435,7 @@ int vboxDomainDestroyFlags(virDomainPtr dom, unsigned int flags);
 int vboxDomainDestroy(virDomainPtr dom);
 char *vboxDomainGetOSType(virDomainPtr dom);
 int vboxDomainSetMemory(virDomainPtr dom, unsigned long memory);
+int vboxDomainGetInfo(virDomainPtr dom, virDomainInfoPtr info);
 
 /* Version specified functions for installing uniformed API */
 void vbox22InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI);
-- 
1.7.9.5




More information about the libvir-list mailing list