On 9/27/21 3:30 PM, Dmitrii Shcherbakov wrote:
[...]
diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
[...]
+
+static void
+virNodeDeviceCapVPDResourceFormat(virBuffer *buf, virPCIVPDResource *res)
+{
+    GEnumValue *resRype = NULL;
+    void (*resFormatFunc)(virBuffer *buf, virPCIVPDResource *res);
+
+    if (G_TYPE_CHECK_INSTANCE_TYPE(res, VIR_TYPE_PCI_VPD_STRING_RESOURCE)) {
+        resFormatFunc = virNodeDeviceCapVPDStringResourceFormat;
+    } else if (G_TYPE_CHECK_INSTANCE_TYPE(res, 
VIR_TYPE_PCI_VPD_KEYWORD_RESOURCE))  {
+        resFormatFunc = virNodeDeviceCapVPDKeywordResourceFormat;
+    } else {
+        /* Unexpected resource type. This should not happen unless the PCI(e) 
specs
+         * change and new resource types are introduced into util.virpcivpd. 
Either way,
+         * we can only return the control back to the caller here.
+         */
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("Unexpected VPD resource type encountered during 
formatting"));
+        return;
+    }
+    virBufferAdjustIndent(buf, 2);
+
+    resRype = virPCIVPDResourceGetResourceType(res);
+    virBufferEscapeString(buf, "<resource type='%s'>", resRype->value_nick);
+    /* Format the resource in a type-specific way. */
+    resFormatFunc(buf, res);

It's probably irrelevant since this will be mostly rewritten based on Dan's suggestions, but the resFormatFunc() pointer seems like an unnecessary complication - you could just move the if/else construct down to here and call the appropriate function directly.


Reply via email to