prlsdkLoadDomain works in 2 different cases: 1. Called first time for a domain. Then it creates and initializes it. Then updates it from sdk handle. 2. Called when domain is already in list. In this case it updates domain from sdk handle. I think we could end up in a better series if we split this function into 2: first is to create and initialize, second update domain from sdk handle (load). On 23.01.2016 11:42, Mikhail Feoktistov wrote: > Now we create new domain by calling prlsdkNewDomain(). > In LoadDomain() we just load info from vm instance to domain object. > So remove code to create domain from LoadDomain(). > > --- > src/vz/vz_sdk.c | 55 +++++++++++++++++-------------------------------------- > 1 file changed, 17 insertions(+), 38 deletions(-) > > diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c > index 765f5f1..d9f2127 100644 > --- a/src/vz/vz_sdk.c > +++ b/src/vz/vz_sdk.c > @@ -1260,26 +1260,29 @@ prlsdkLoadDomain(vzConnPtr privconn, > PRL_UINT32 ram; > PRL_UINT32 envId; > PRL_VM_AUTOSTART_OPTION autostart; > + unsigned char uuid[VIR_UUID_BUFLEN]; > + char *name; > > virCheckNonNullArgGoto(privconn, error); > virCheckNonNullArgGoto(sdkdom, error); > > - if (!(def = virDomainDefNew())) > + if (prlsdkGetDomainIds(sdkdom, &name, uuid) < 0) > goto error; > > if (!olddom) { > - if (VIR_ALLOC(pdom) < 0) > - goto error; > + dom = prlsdkNewDomain(privconn, name, uuid); > + def = dom->def; > + pdom = dom->privateData; > } else { > + if (!(def = virDomainDefNewFull(name, uuid, -1))) > + goto error; > pdom = olddom->privateData; > + if (STREQ(privconn->drivername, "vz")) > + def->virtType = VIR_DOMAIN_VIRT_VZ; > + else > + def->virtType = VIR_DOMAIN_VIRT_PARALLELS; > } > - > - if (STREQ(privconn->drivername, "vz")) > - def->virtType = VIR_DOMAIN_VIRT_VZ; > - else > - def->virtType = VIR_DOMAIN_VIRT_PARALLELS; > - > - def->id = -1; > + VIR_FREE(name); > > /* we will remove this field in the near future, so let's set it > * to NULL temporarily */ > @@ -1292,9 +1295,6 @@ prlsdkLoadDomain(vzConnPtr privconn, > goto error; > } > > - if (prlsdkGetDomainIds(sdkdom, &def->name, def->uuid) < 0) > - goto error; > - > def->onReboot = VIR_DOMAIN_LIFECYCLE_RESTART; > def->onPoweroff = VIR_DOMAIN_LIFECYCLE_DESTROY; > def->onCrash = VIR_DOMAIN_LIFECYCLE_CRASH_DESTROY; > @@ -1369,23 +1369,10 @@ prlsdkLoadDomain(vzConnPtr privconn, > } > > if (olddom) { > - /* assign new virDomainDef without any checks */ > - /* we can't use virDomainObjAssignDef, because it checks > - * for state and domain name */ > dom = olddom; > virDomainDefFree(dom->def); > dom->def = def; > - } else { > - if (!(dom = virDomainObjListAdd(privconn->domains, def, > - privconn->xmlopt, > - 0, NULL))) > - goto error; > } > - /* dom is locked here */ > - > - dom->privateData = pdom; > - dom->privateDataFreeFunc = prlsdkDomObjFreePrivate; > - dom->persistent = 1; > > switch (autostart) { > case PAO_VM_START_ON_LOAD: > @@ -1411,19 +1398,11 @@ prlsdkLoadDomain(vzConnPtr privconn, > > return dom; > error: > - if (dom && !olddom) { > - /* Domain isn't persistent means that we haven't yet set > - * prlsdkDomObjFreePrivate and should call it manually > - */ > - if (!dom->persistent) > - prlsdkDomObjFreePrivate(pdom); > - > + VIR_FREE(name); > + if (!olddom && dom) > virDomainObjListRemove(privconn->domains, dom); > - } > - /* Delete newly allocated def only if we haven't assigned it to domain > - * Otherwise we will end up with domain having invalid def within it > - */ > - if (!dom) > + > + if (olddom && !dom) > virDomainDefFree(def); > > return NULL; > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list