mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-04-01 20:05:19 +00:00
vz: make more accurate closing connection to sdk
Current code for example can call unsubscribe if connection succeeds but subscribing fails. This will probabaly lead only to spurious error messages without any actual inconsistencies but nevertheless.
This commit is contained in:
parent
ff029e4434
commit
0518aae304
@ -163,11 +163,7 @@ static void vzDriverDispose(void * obj)
|
||||
{
|
||||
vzDriverPtr driver = obj;
|
||||
|
||||
if (driver->server) {
|
||||
prlsdkUnsubscribeFromPCSEvents(driver);
|
||||
prlsdkDisconnect(driver);
|
||||
}
|
||||
|
||||
prlsdkDisconnect(driver);
|
||||
virObjectUnref(driver->domains);
|
||||
virObjectUnref(driver->caps);
|
||||
virObjectUnref(driver->xmlopt);
|
||||
@ -348,8 +344,7 @@ vzDriverObjNew(void)
|
||||
!(driver->domains = virDomainObjListNew()) ||
|
||||
!(driver->domainEventState = virObjectEventStateNew()) ||
|
||||
(vzInitVersion(driver) < 0) ||
|
||||
(prlsdkConnect(driver) < 0) ||
|
||||
(prlsdkSubscribeToPCSEvents(driver) < 0)) {
|
||||
(prlsdkConnect(driver) < 0)) {
|
||||
virObjectUnref(driver);
|
||||
return NULL;
|
||||
}
|
||||
|
@ -43,6 +43,8 @@ static int
|
||||
prlsdkUUIDParse(const char *uuidstr, unsigned char *uuid);
|
||||
static void
|
||||
prlsdkConvertError(PRL_RESULT pret);
|
||||
static PRL_RESULT
|
||||
prlsdkEventsHandler(PRL_HANDLE prlEvent, PRL_VOID_PTR opaque);
|
||||
|
||||
VIR_LOG_INIT("parallels.sdk");
|
||||
|
||||
@ -363,41 +365,62 @@ prlsdkConnect(vzDriverPtr driver)
|
||||
job = PrlSrv_LoginLocalEx(driver->server, NULL, 0,
|
||||
PSL_HIGH_SECURITY, PACF_NON_INTERACTIVE_MODE);
|
||||
if (PRL_FAILED(getJobResult(job, &result)))
|
||||
goto cleanup;
|
||||
goto destroy;
|
||||
|
||||
pret = PrlResult_GetParam(result, &response);
|
||||
prlsdkCheckRetGoto(pret, cleanup);
|
||||
prlsdkCheckRetGoto(pret, logoff);
|
||||
|
||||
pret = prlsdkGetStringParamBuf(PrlLoginResponse_GetSessionUuid,
|
||||
response, session_uuid, sizeof(session_uuid));
|
||||
prlsdkCheckRetGoto(pret, cleanup);
|
||||
prlsdkCheckRetGoto(pret, logoff);
|
||||
|
||||
if (prlsdkUUIDParse(session_uuid, driver->session_uuid) < 0)
|
||||
goto cleanup;
|
||||
goto logoff;
|
||||
|
||||
pret = PrlSrv_RegEventHandler(driver->server,
|
||||
prlsdkEventsHandler,
|
||||
driver);
|
||||
prlsdkCheckRetGoto(pret, logoff);
|
||||
|
||||
ret = 0;
|
||||
|
||||
cleanup:
|
||||
if (ret < 0) {
|
||||
PrlHandle_Free(driver->server);
|
||||
driver->server = PRL_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
PrlHandle_Free(result);
|
||||
PrlHandle_Free(response);
|
||||
|
||||
return ret;
|
||||
|
||||
logoff:
|
||||
job = PrlSrv_Logoff(driver->server);
|
||||
waitJob(job);
|
||||
|
||||
destroy:
|
||||
PrlHandle_Free(driver->server);
|
||||
driver->server = PRL_INVALID_HANDLE;
|
||||
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
void
|
||||
prlsdkDisconnect(vzDriverPtr driver)
|
||||
{
|
||||
PRL_HANDLE job;
|
||||
PRL_RESULT ret;
|
||||
|
||||
if (driver->server == PRL_INVALID_HANDLE)
|
||||
return;
|
||||
|
||||
ret = PrlSrv_UnregEventHandler(driver->server,
|
||||
prlsdkEventsHandler,
|
||||
driver);
|
||||
if (PRL_FAILED(ret))
|
||||
logPrlError(ret);
|
||||
|
||||
job = PrlSrv_Logoff(driver->server);
|
||||
waitJob(job);
|
||||
|
||||
PrlHandle_Free(driver->server);
|
||||
driver->server = PRL_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
static int
|
||||
@ -2335,30 +2358,6 @@ prlsdkEventsHandler(PRL_HANDLE prlEvent, PRL_VOID_PTR opaque)
|
||||
return PRL_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
int prlsdkSubscribeToPCSEvents(vzDriverPtr driver)
|
||||
{
|
||||
PRL_RESULT pret = PRL_ERR_UNINITIALIZED;
|
||||
|
||||
pret = PrlSrv_RegEventHandler(driver->server,
|
||||
prlsdkEventsHandler,
|
||||
driver);
|
||||
prlsdkCheckRetGoto(pret, error);
|
||||
return 0;
|
||||
|
||||
error:
|
||||
return -1;
|
||||
}
|
||||
|
||||
void prlsdkUnsubscribeFromPCSEvents(vzDriverPtr driver)
|
||||
{
|
||||
PRL_RESULT ret = PRL_ERR_UNINITIALIZED;
|
||||
ret = PrlSrv_UnregEventHandler(driver->server,
|
||||
prlsdkEventsHandler,
|
||||
driver);
|
||||
if (PRL_FAILED(ret))
|
||||
logPrlError(ret);
|
||||
}
|
||||
|
||||
int prlsdkStart(virDomainObjPtr dom)
|
||||
{
|
||||
PRL_HANDLE job = PRL_INVALID_HANDLE;
|
||||
|
@ -35,8 +35,6 @@ prlsdkAddDomainByUUID(vzDriverPtr driver, const unsigned char *uuid);
|
||||
virDomainObjPtr
|
||||
prlsdkAddDomainByName(vzDriverPtr driver, const char *name);
|
||||
int prlsdkUpdateDomain(vzDriverPtr driver, virDomainObjPtr dom);
|
||||
int prlsdkSubscribeToPCSEvents(vzDriverPtr driver);
|
||||
void prlsdkUnsubscribeFromPCSEvents(vzDriverPtr driver);
|
||||
|
||||
int prlsdkStart(virDomainObjPtr dom);
|
||||
int prlsdkKill(virDomainObjPtr dom);
|
||||
|
Loading…
x
Reference in New Issue
Block a user