void libxl_domain_config_dispose(libxl_domain_config *d_config) { int i; for (i=0; i<d_config->num_disks; i++) libxl_device_disk_dispose(&d_config->disks[i]); free(d_config->disks); for (i=0; i<d_config->num_nics; i++) libxl_device_nic_dispose(&d_config->nics[i]); free(d_config->nics); for (i=0; i<d_config->num_pcidevs; i++) libxl_device_pci_dispose(&d_config->pcidevs[i]); free(d_config->pcidevs); for (i=0; i<d_config->num_vfbs; i++) libxl_device_vfb_dispose(&d_config->vfbs[i]); free(d_config->vfbs); for (i=0; i<d_config->num_vkbs; i++) libxl_device_vkb_dispose(&d_config->vkbs[i]); free(d_config->vkbs); libxl_domain_create_info_dispose(&d_config->c_info); libxl_domain_build_info_dispose(&d_config->b_info); }
static int libxlMakePCIList(virDomainDefPtr def, libxl_domain_config *d_config) { virDomainHostdevDefPtr *l_hostdevs = def->hostdevs; size_t nhostdevs = def->nhostdevs; size_t npcidevs = 0; libxl_device_pci *x_pcidevs; size_t i, j; if (nhostdevs == 0) return 0; if (VIR_ALLOC_N(x_pcidevs, nhostdevs) < 0) return -1; for (i = 0, j = 0; i < nhostdevs; i++) { if (l_hostdevs[i]->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) continue; if (l_hostdevs[i]->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) continue; libxl_device_pci_init(&x_pcidevs[j]); if (libxlMakePCI(l_hostdevs[i], &x_pcidevs[j]) < 0) goto error; npcidevs++; j++; } VIR_SHRINK_N(x_pcidevs, nhostdevs, nhostdevs - npcidevs); d_config->pcidevs = x_pcidevs; d_config->num_pcidevs = npcidevs; return 0; error: for (i = 0; i < npcidevs; i++) libxl_device_pci_dispose(&x_pcidevs[i]); VIR_FREE(x_pcidevs); return -1; }