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.
Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy(a)virtuozzo.com>
---
NOTE!!! this patch is applied on top of migration series
src/vz/vz_driver.c | 9 ++------
src/vz/vz_sdk.c | 65 +++++++++++++++++++++++++++---------------------------
src/vz/vz_sdk.h | 2 --
3 files changed, 34 insertions(+), 42 deletions(-)
diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index 8264ac0..1e56837 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -160,11 +160,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);
@@ -318,8 +314,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;
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index a96fc96..5b425d7 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -39,6 +39,8 @@
static int
prlsdkUUIDParse(const char *uuidstr, unsigned char *uuid);
+static PRL_RESULT
+prlsdkEventsHandler(PRL_HANDLE prlEvent, PRL_VOID_PTR opaque);
VIR_LOG_INIT("parallels.sdk");
@@ -284,41 +286,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
@@ -1951,30 +1974,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);
-}
-
PRL_RESULT prlsdkStart(PRL_HANDLE sdkdom)
{
PRL_HANDLE job = PRL_INVALID_HANDLE;
diff --git a/src/vz/vz_sdk.h b/src/vz/vz_sdk.h
index 3d27d12..757e174 100644
--- a/src/vz/vz_sdk.h
+++ b/src/vz/vz_sdk.h
@@ -34,8 +34,6 @@ int prlsdkUpdateDomain(vzDriverPtr driver, virDomainObjPtr dom);
int
prlsdkLoadDomain(vzDriverPtr driver,
virDomainObjPtr dom);
-int prlsdkSubscribeToPCSEvents(vzDriverPtr driver);
-void prlsdkUnsubscribeFromPCSEvents(vzDriverPtr driver);
PRL_RESULT prlsdkStart(PRL_HANDLE sdkdom);
PRL_RESULT prlsdkKill(PRL_HANDLE sdkdom);
PRL_RESULT prlsdkStop(PRL_HANDLE sdkdom);
--
1.8.3.1
Show replies by date