提交 0518aae3 编写于 作者: N Nikolay Shirokovskiy 提交者: Michal Privoznik

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.
上级 ff029e44
...@@ -163,11 +163,7 @@ static void vzDriverDispose(void * obj) ...@@ -163,11 +163,7 @@ static void vzDriverDispose(void * obj)
{ {
vzDriverPtr driver = obj; vzDriverPtr driver = obj;
if (driver->server) { prlsdkDisconnect(driver);
prlsdkUnsubscribeFromPCSEvents(driver);
prlsdkDisconnect(driver);
}
virObjectUnref(driver->domains); virObjectUnref(driver->domains);
virObjectUnref(driver->caps); virObjectUnref(driver->caps);
virObjectUnref(driver->xmlopt); virObjectUnref(driver->xmlopt);
...@@ -348,8 +344,7 @@ vzDriverObjNew(void) ...@@ -348,8 +344,7 @@ vzDriverObjNew(void)
!(driver->domains = virDomainObjListNew()) || !(driver->domains = virDomainObjListNew()) ||
!(driver->domainEventState = virObjectEventStateNew()) || !(driver->domainEventState = virObjectEventStateNew()) ||
(vzInitVersion(driver) < 0) || (vzInitVersion(driver) < 0) ||
(prlsdkConnect(driver) < 0) || (prlsdkConnect(driver) < 0)) {
(prlsdkSubscribeToPCSEvents(driver) < 0)) {
virObjectUnref(driver); virObjectUnref(driver);
return NULL; return NULL;
} }
......
...@@ -43,6 +43,8 @@ static int ...@@ -43,6 +43,8 @@ static int
prlsdkUUIDParse(const char *uuidstr, unsigned char *uuid); prlsdkUUIDParse(const char *uuidstr, unsigned char *uuid);
static void static void
prlsdkConvertError(PRL_RESULT pret); prlsdkConvertError(PRL_RESULT pret);
static PRL_RESULT
prlsdkEventsHandler(PRL_HANDLE prlEvent, PRL_VOID_PTR opaque);
VIR_LOG_INIT("parallels.sdk"); VIR_LOG_INIT("parallels.sdk");
...@@ -363,41 +365,62 @@ prlsdkConnect(vzDriverPtr driver) ...@@ -363,41 +365,62 @@ prlsdkConnect(vzDriverPtr driver)
job = PrlSrv_LoginLocalEx(driver->server, NULL, 0, job = PrlSrv_LoginLocalEx(driver->server, NULL, 0,
PSL_HIGH_SECURITY, PACF_NON_INTERACTIVE_MODE); PSL_HIGH_SECURITY, PACF_NON_INTERACTIVE_MODE);
if (PRL_FAILED(getJobResult(job, &result))) if (PRL_FAILED(getJobResult(job, &result)))
goto cleanup; goto destroy;
pret = PrlResult_GetParam(result, &response); pret = PrlResult_GetParam(result, &response);
prlsdkCheckRetGoto(pret, cleanup); prlsdkCheckRetGoto(pret, logoff);
pret = prlsdkGetStringParamBuf(PrlLoginResponse_GetSessionUuid, pret = prlsdkGetStringParamBuf(PrlLoginResponse_GetSessionUuid,
response, session_uuid, sizeof(session_uuid)); response, session_uuid, sizeof(session_uuid));
prlsdkCheckRetGoto(pret, cleanup); prlsdkCheckRetGoto(pret, logoff);
if (prlsdkUUIDParse(session_uuid, driver->session_uuid) < 0) if (prlsdkUUIDParse(session_uuid, driver->session_uuid) < 0)
goto cleanup; goto logoff;
pret = PrlSrv_RegEventHandler(driver->server,
prlsdkEventsHandler,
driver);
prlsdkCheckRetGoto(pret, logoff);
ret = 0; ret = 0;
cleanup: cleanup:
if (ret < 0) {
PrlHandle_Free(driver->server);
driver->server = PRL_INVALID_HANDLE;
}
PrlHandle_Free(result); PrlHandle_Free(result);
PrlHandle_Free(response); PrlHandle_Free(response);
return ret; return ret;
logoff:
job = PrlSrv_Logoff(driver->server);
waitJob(job);
destroy:
PrlHandle_Free(driver->server);
driver->server = PRL_INVALID_HANDLE;
goto cleanup;
} }
void void
prlsdkDisconnect(vzDriverPtr driver) prlsdkDisconnect(vzDriverPtr driver)
{ {
PRL_HANDLE job; 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); job = PrlSrv_Logoff(driver->server);
waitJob(job); waitJob(job);
PrlHandle_Free(driver->server); PrlHandle_Free(driver->server);
driver->server = PRL_INVALID_HANDLE;
} }
static int static int
...@@ -2335,30 +2358,6 @@ prlsdkEventsHandler(PRL_HANDLE prlEvent, PRL_VOID_PTR opaque) ...@@ -2335,30 +2358,6 @@ prlsdkEventsHandler(PRL_HANDLE prlEvent, PRL_VOID_PTR opaque)
return PRL_ERR_SUCCESS; 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) int prlsdkStart(virDomainObjPtr dom)
{ {
PRL_HANDLE job = PRL_INVALID_HANDLE; PRL_HANDLE job = PRL_INVALID_HANDLE;
......
...@@ -35,8 +35,6 @@ prlsdkAddDomainByUUID(vzDriverPtr driver, const unsigned char *uuid); ...@@ -35,8 +35,6 @@ prlsdkAddDomainByUUID(vzDriverPtr driver, const unsigned char *uuid);
virDomainObjPtr virDomainObjPtr
prlsdkAddDomainByName(vzDriverPtr driver, const char *name); prlsdkAddDomainByName(vzDriverPtr driver, const char *name);
int prlsdkUpdateDomain(vzDriverPtr driver, virDomainObjPtr dom); int prlsdkUpdateDomain(vzDriverPtr driver, virDomainObjPtr dom);
int prlsdkSubscribeToPCSEvents(vzDriverPtr driver);
void prlsdkUnsubscribeFromPCSEvents(vzDriverPtr driver);
int prlsdkStart(virDomainObjPtr dom); int prlsdkStart(virDomainObjPtr dom);
int prlsdkKill(virDomainObjPtr dom); int prlsdkKill(virDomainObjPtr dom);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册