[PATCH 44/55] hyperv: use GLib auto-cleanup in hypervInvokeMsvmComputerSystemRequestStateChange

Matt Coleman mcoleman at datto.com
Thu Jan 21 18:51:24 UTC 2021


Signed-off-by: Matt Coleman <matt at datto.com>
---
 src/hyperv/hyperv_wmi.c | 50 +++++++++++++++--------------------------
 1 file changed, 18 insertions(+), 32 deletions(-)

diff --git a/src/hyperv/hyperv_wmi.c b/src/hyperv/hyperv_wmi.c
index 459d207ee7..bd62174739 100644
--- a/src/hyperv/hyperv_wmi.c
+++ b/src/hyperv/hyperv_wmi.c
@@ -1169,18 +1169,17 @@ int
 hypervInvokeMsvmComputerSystemRequestStateChange(virDomainPtr domain,
                                                  int requestedState)
 {
-    int result = -1;
     hypervPrivate *priv = domain->conn->privateData;
     char uuid_string[VIR_UUID_STRING_BUFLEN];
-    WsXmlDocH response = NULL;
-    client_opt_t *options = NULL;
-    char *selector = NULL;
-    char *properties = NULL;
-    char *returnValue = NULL;
+    g_auto(WsXmlDocH) response = NULL;
+    g_autoptr(client_opt_t) options = NULL;
+    g_autofree char *selector = NULL;
+    g_autofree char *properties = NULL;
+    g_autofree char *returnValue = NULL;
     int returnCode;
-    char *instanceID = NULL;
+    g_autofree char *instanceID = NULL;
     g_auto(virBuffer) query = VIR_BUFFER_INITIALIZER;
-    Msvm_ConcreteJob *concreteJob = NULL;
+    g_autoptr(Msvm_ConcreteJob) concreteJob = NULL;
     bool completed = false;
 
     virUUIDFormat(domain->uuid, uuid_string);
@@ -1193,7 +1192,7 @@ hypervInvokeMsvmComputerSystemRequestStateChange(virDomainPtr domain,
     if (options == NULL) {
         virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                        _("Could not initialize options"));
-        goto cleanup;
+        return -1;
     }
 
     wsmc_add_selectors_from_str(options, selector);
@@ -1204,7 +1203,7 @@ hypervInvokeMsvmComputerSystemRequestStateChange(virDomainPtr domain,
                                   options, "RequestStateChange", NULL);
 
     if (hypervVerifyResponse(priv->client, response, "invocation") < 0)
-        goto cleanup;
+        return -1;
 
     /* Check return value */
     returnValue = ws_xml_get_xpath_value(response, (char *)"/s:Envelope/s:Body/p:RequestStateChange_OUTPUT/p:ReturnValue");
@@ -1213,13 +1212,13 @@ hypervInvokeMsvmComputerSystemRequestStateChange(virDomainPtr domain,
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("Could not lookup %s for %s invocation"),
                        "ReturnValue", "RequestStateChange");
-        goto cleanup;
+        return -1;
     }
 
     if (virStrToLong_i(returnValue, NULL, 10, &returnCode) < 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("Could not parse return code from '%s'"), returnValue);
-        goto cleanup;
+        return -1;
     }
 
     if (returnCode == CIM_RETURNCODE_TRANSITION_STARTED) {
@@ -1230,7 +1229,7 @@ hypervInvokeMsvmComputerSystemRequestStateChange(virDomainPtr domain,
             virReportError(VIR_ERR_INTERNAL_ERROR,
                            _("Could not lookup %s for %s invocation"),
                            "InstanceID", "RequestStateChange");
-            goto cleanup;
+            return -1;
         }
 
         /* FIXME: Poll every 100ms until the job completes or fails. There
@@ -1241,13 +1240,13 @@ hypervInvokeMsvmComputerSystemRequestStateChange(virDomainPtr domain,
                               "WHERE InstanceID = '%s'", instanceID);
 
             if (hypervGetWmiClass(Msvm_ConcreteJob, &concreteJob) < 0)
-                goto cleanup;
+                return -1;
 
             if (concreteJob == NULL) {
                 virReportError(VIR_ERR_INTERNAL_ERROR,
                                _("Could not lookup %s for %s invocation"),
                                "Msvm_ConcreteJob", "RequestStateChange");
-                goto cleanup;
+                return -1;
             }
 
             switch (concreteJob->data->JobState) {
@@ -1272,13 +1271,13 @@ hypervInvokeMsvmComputerSystemRequestStateChange(virDomainPtr domain,
                 virReportError(VIR_ERR_INTERNAL_ERROR,
                                _("Concrete job for %s invocation is in error state"),
                                "RequestStateChange");
-                goto cleanup;
+                return -1;
 
             default:
                 virReportError(VIR_ERR_INTERNAL_ERROR,
                                _("Concrete job for %s invocation is in unknown state"),
                                "RequestStateChange");
-                goto cleanup;
+                return -1;
             }
         }
     } else if (returnCode != CIM_RETURNCODE_COMPLETED_WITH_NO_ERROR) {
@@ -1286,23 +1285,10 @@ hypervInvokeMsvmComputerSystemRequestStateChange(virDomainPtr domain,
                        _("Invocation of %s returned an error: %s (%d)"),
                        "RequestStateChange", hypervReturnCodeToString(returnCode),
                        returnCode);
-        goto cleanup;
+        return -1;
     }
 
-    result = 0;
-
- cleanup:
-    if (options != NULL)
-        wsmc_options_destroy(options);
-
-    ws_xml_destroy_doc(response);
-    VIR_FREE(selector);
-    VIR_FREE(properties);
-    VIR_FREE(returnValue);
-    VIR_FREE(instanceID);
-    hypervFreeObject((hypervObject *)concreteJob);
-
-    return result;
+    return 0;
 }
 
 
-- 
2.30.0





More information about the libvir-list mailing list