@@ -458,6 +458,12 @@
#define LIBXL_HAVE_DEVICE_PCI_LIST_FREE 1
/*
+ * LIBXL_HAVE_DEVICE_PCI_ASSIGNABLE_LIST_FREE indicates that the
+ * libxl_device_pci_assignable_list_free() function is defined.
+ */
+#define LIBXL_HAVE_DEVICE_PCI_ASSIGNABLE_LIST_FREE 1
+
+/*
* libxl ABI compatibility
*
* The only guarantee which libxl makes regarding ABI compatibility
@@ -2369,6 +2375,7 @@ int libxl_device_events_handler(libxl_ctx *ctx,
int libxl_device_pci_assignable_add(libxl_ctx *ctx, libxl_device_pci *pci, int rebind);
int libxl_device_pci_assignable_remove(libxl_ctx *ctx, libxl_device_pci *pci, int rebind);
libxl_device_pci *libxl_device_pci_assignable_list(libxl_ctx *ctx, int *num);
+void libxl_device_pci_assignable_list_free(libxl_device_pci *list, int num);
/* CPUID handling */
int libxl_cpuid_parse_config(libxl_cpuid_policy_list *cpuid, const char* str);
@@ -438,7 +438,7 @@ libxl_device_pci *libxl_device_pci_assignable_list(libxl_ctx *ctx, int *num)
pcis = new;
new = pcis + *num;
- memset(new, 0, sizeof(*new));
+ libxl_device_pci_init(new);
pci_struct_fill(new, dom, bus, dev, func, 0);
if (pci_info_xs_read(gc, new, "domid")) /* already assigned */
@@ -453,6 +453,16 @@ out:
return pcis;
}
+void libxl_device_pci_assignable_list_free(libxl_device_pci *list, int num)
+{
+ int i;
+
+ for (i = 0; i < num; i++)
+ libxl_device_pci_dispose(&list[i]);
+
+ free(list);
+}
+
/* Unbind device from its current driver, if any. If driver_path is non-NULL,
* store the path to the original driver in it. */
static int sysfs_dev_unbind(libxl__gc *gc, libxl_device_pci *pci,
@@ -1470,7 +1480,7 @@ static int libxl_pci_assignable(libxl_ctx *ctx, libxl_device_pci *pci)
pcis[i].func == pci->func)
break;
}
- free(pcis);
+ libxl_device_pci_assignable_list_free(pcis, num);
return i != num;
}
@@ -894,9 +894,8 @@ value stub_xl_device_pci_assignable_list(value ctx)
Field(list, 1) = temp;
temp = list;
Store_field(list, 0, Val_device_pci(&c_list[i]));
- libxl_device_pci_dispose(&c_list[i]);
}
- free(c_list);
+ libxl_device_pci_assignable_list_free(c_list, nb);
CAMLreturn(list);
}
@@ -164,9 +164,8 @@ static void pciassignable_list(void)
for (i = 0; i < num; i++) {
printf("%04x:%02x:%02x.%01x\n",
pcis[i].domain, pcis[i].bus, pcis[i].dev, pcis[i].func);
- libxl_device_pci_dispose(&pcis[i]);
}
- free(pcis);
+ libxl_device_pci_assignable_list_free(pcis, num);
}
int main_pciassignable_list(int argc, char **argv)