12.04.2016 14:11, Nikolay Shirokovskiy пишет:
On 07.04.2016 23:09, Maxim Nestratov wrote:This patch introduces a new 'vzDriver' lockable object and provides helper functions to allocate/destroy it and we pass it to prlsdkXxx functions instead of virConnectPtr. Now we store domain related objects such as domain list, capabitilies etc. within a single vz_driver vzDriver structure, which is shared by all driver connections. It is allocated during daemon initialization or in a lazy manner when a new connection to 'vz' driver is established. When a connection to vz daemon drops, vzDestroyConnection is called, which in turn relays disconnect event to all connection to 'vz' driver. Signed-off-by: Maxim Nestratov <mnestratov@xxxxxxxxxxxxx> --- src/vz/vz_driver.c | 339 +++++++++++++++++++++++++++++++++++------------------ src/vz/vz_sdk.c | 211 ++++++++++++++++----------------- src/vz/vz_sdk.h | 30 ++--- src/vz/vz_utils.c | 27 +++-- src/vz/vz_utils.h | 29 ++++- 5 files changed, 380 insertions(+), 256 deletions(-) diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index f2bbf1e..e9fe89f 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -63,18 +63,25 @@ VIR_LOG_INIT("parallels.parallels_driver"); #define PRLCTL "prlctl"static int vzConnectClose(virConnectPtr conn);+static virClassPtr vzDriverConnClass;why 'conn' suffix? i suggest just vzDriverClass
fixed
void-vzDriverLock(vzConnPtr driver) +vzDriverLock(vzConnPtr privconn) { - virMutexLock(&driver->lock); + virObjectLock(privconn->driver); }void-vzDriverUnlock(vzConnPtr driver) +vzDriverUnlock(vzConnPtr privconn) { - virMutexUnlock(&driver->lock); + virObjectUnlock(privconn->driver); }empty line here will be good
agree
+static virMutex vz_driver_lock; +static vzDriverPtr vz_driver; +static vzConnPtr vz_conn_list;i would move this list into driver, i even think if we could write version of close callback object that can take multiple callbacks, thus we can get rid of vz_conn_list and vzConn altogether.
not sure about moving as for a new version of close callback - certainly not in this patch series
+ +static vzDriverPtr +vzDriverObjNew(void);static intvzCapsAddGuestDomain(virCapsPtr caps, @@ -158,6 +165,69 @@ vzBuildCapabilities(void) goto cleanup; }+static void vzDriverDispose(void * obj)+{ + vzDriverPtr conn = obj;looks like 'driver' will be better here
agree
+ + if (conn->server) { + prlsdkUnsubscribeFromPCSEvents(conn); + prlsdkDisconnect(conn); + } + + virObjectUnref(conn->domains); + virObjectUnref(conn->caps); + virObjectUnref(conn->xmlopt); + virObjectEventStateFree(conn->domainEventState); +} + +static int vzDriverOnceInit(void) +{ + if (!(vzDriverConnClass = virClassNew(virClassForObjectLockable(), + "vzDriver", + sizeof(vzDriver), + vzDriverDispose)))indentation
ahh, sure
+ return -1; + + return 0; +} +VIR_ONCE_GLOBAL_INIT(vzDriver) + +vzDriverPtr +vzGetDriverConnection(void) +{ + virMutexLock(&vz_driver_lock); + if (!vz_driver) + vz_driver = vzDriverObjNew(); + virObjectRef(vz_driver); + virMutexUnlock(&vz_driver_lock); + return vz_driver; +}i would put more empty lines here,
not sure, but if you insist...
and since this func is pretty simple i suggest open code it in that new function
didn't get you, sorry
+ +void +vzDestroyDriverConnection(void) +{ + + vzDriverPtr driver; + vzConnPtr privconn_list; + + virMutexLock(&vz_driver_lock); + driver = vz_driver; + vz_driver = NULL; + + privconn_list = vz_conn_list; + vz_conn_list = NULL; + + virMutexUnlock(&vz_driver_lock); + + while (privconn_list) { + vzConnPtr privconn = privconn_list; + privconn_list = privconn->next; + virConnectCloseCallbackDataCall(privconn->closeCallback, + VIR_CONNECT_CLOSE_REASON_EOF); + } + virObjectUnref(driver); +} + static char * vzConnectGetCapabilities(virConnectPtr conn) { @@ -165,7 +235,7 @@ vzConnectGetCapabilities(virConnectPtr conn) char *xml;vzDriverLock(privconn);- xml = virCapabilitiesFormatXML(privconn->caps); + xml = virCapabilitiesFormatXML(privconn->driver->caps); vzDriverUnlock(privconn); return xml; } @@ -214,70 +284,34 @@ virDomainDefParserConfig vzDomainDefParserConfig = { .domainPostParseCallback = vzDomainDefPostParse, };--static int -vzOpenDefault(virConnectPtr conn) +static vzDriverPtr +vzDriverObjNew(void) { - vzConnPtr privconn; - - if (VIR_ALLOC(privconn) < 0) - return VIR_DRV_OPEN_ERROR; - if (virMutexInit(&privconn->lock) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("cannot initialize mutex")); - goto err_free; - } + vzDriverPtr conn;i think 'driver' will be more comprehensible
sure, just forgot to change it since last version
- if (prlsdkInit()) {- VIR_DEBUG("%s", _("Can't initialize Parallels SDK")); - goto err_free; - } - - if (prlsdkConnect(privconn) < 0) - goto err_free; - - if (vzInitVersion(privconn) < 0) - goto error; - - if (!(privconn->caps = vzBuildCapabilities())) - goto error; - - vzDomainDefParserConfig.priv = &privconn->vzCaps; - if (!(privconn->xmlopt = virDomainXMLOptionNew(&vzDomainDefParserConfig, - NULL, NULL))) - goto error; - - if (!(privconn->domains = virDomainObjListNew())) - goto error; - - if (!(privconn->domainEventState = virObjectEventStateNew())) - goto error; - - if (prlsdkSubscribeToPCSEvents(privconn)) - goto error; - - if (!(privconn->closeCallback = virNewConnectCloseCallbackData())) - goto error; - - conn->privateData = privconn; + if (vzDriverInitialize() < 0) + return NULL;- if (prlsdkLoadDomains(privconn))- goto error; + if (!(conn = virObjectLockableNew(vzDriverConnClass))) + return NULL;- return VIR_DRV_OPEN_SUCCESS;+ vzDomainDefParserConfig.priv = &conn->vzCaps; + + if (!(conn->caps = vzBuildCapabilities()) || + !(conn->xmlopt = virDomainXMLOptionNew(&vzDomainDefParserConfig, + NULL, NULL)) || + !(conn->domains = virDomainObjListNew()) || + !(conn->domainEventState = virObjectEventStateNew()) || + (vzInitVersion(conn) < 0) || + (prlsdkConnect(conn) < 0) || + (prlsdkSubscribeToPCSEvents(conn) < 0) + ) { + virObjectUnref(conn); + return NULL; + }- error:- virObjectUnref(privconn->closeCallback); - privconn->closeCallback = NULL; - virObjectUnref(privconn->domains); - virObjectUnref(privconn->caps); - virObjectEventStateFree(privconn->domainEventState); - prlsdkDisconnect(privconn); - prlsdkDeinit(); - err_free: - conn->privateData = NULL; - VIR_FREE(privconn); - return VIR_DRV_OPEN_ERROR; + prlsdkLoadDomains(conn);failure should be checked
or just ignored since I intentionally did this but forgot to put it in ignore_value()
+ return conn; }static virDrvOpenStatus@@ -285,7 +319,8 @@ vzConnectOpen(virConnectPtr conn, virConnectAuthPtr auth ATTRIBUTE_UNUSED, unsigned int flags) { - int ret; + vzDriverPtr driver = NULL; + vzConnPtr privconn = NULL;virCheckFlags(VIR_CONNECT_RO, VIR_DRV_OPEN_ERROR); @@ -317,36 +352,60 @@ vzConnectOpen(virConnectPtr conn,return VIR_DRV_OPEN_ERROR; }- if ((ret = vzOpenDefault(conn)) != VIR_DRV_OPEN_SUCCESS)- return ret; + if (!(driver = vzGetDriverConnection())) + return VIR_DRV_OPEN_ERROR; + + if (VIR_ALLOC(privconn) < 0) { + + virObjectUnref(driver); + return VIR_DRV_OPEN_ERROR; + }you can just goto error here
ok, seems to be shorter...
+ + conn->privateData = privconn; + privconn->driver = driver; + + if (!(privconn->closeCallback = virNewConnectCloseCallbackData())) + goto error; + + virMutexLock(&vz_driver_lock); + privconn->next = vz_conn_list; + vz_conn_list = privconn; + virMutexUnlock(&vz_driver_lock);return VIR_DRV_OPEN_SUCCESS;+ + error: + + conn->privateData = NULL; + virObjectUnref(driver); + VIR_FREE(privconn); + return VIR_DRV_OPEN_ERROR; }static intvzConnectClose(virConnectPtr conn) { + vzConnPtr curr, prev = NULL; vzConnPtr privconn = conn->privateData;if (!privconn)return 0;- vzDriverLock(privconn);- prlsdkUnsubscribeFromPCSEvents(privconn); - virObjectUnref(privconn->caps); - virObjectUnref(privconn->xmlopt); - virObjectUnref(privconn->domains); - virObjectUnref(privconn->closeCallback); - privconn->closeCallback = NULL; - virObjectEventStateFree(privconn->domainEventState); - prlsdkDisconnect(privconn); - conn->privateData = NULL; - prlsdkDeinit(); - - vzDriverUnlock(privconn); - virMutexDestroy(&privconn->lock); + virMutexLock(&vz_driver_lock); + for (curr = vz_conn_list; curr; prev = curr, curr = curr->next) + if (curr == privconn) { + if (prev) + prev->next = curr->next; + else + vz_conn_list = curr->next; + break; + }i'd suggest use braces here for 'for' too, BTW you can reduce nesting
ok, makes sense
+ virMutexUnlock(&vz_driver_lock);+ virObjectUnref(privconn->closeCallback);+ virObjectUnref(privconn->driver); VIR_FREE(privconn); + conn->privateData = NULL; return 0; }@@ -354,7 +413,7 @@ static intvzConnectGetVersion(virConnectPtr conn, unsigned long *hvVer) { vzConnPtr privconn = conn->privateData; - *hvVer = privconn->vzVersion; + *hvVer = privconn->driver->vzVersion; return 0; }@@ -372,7 +431,7 @@ vzConnectListDomains(virConnectPtr conn, int *ids, int maxids)int n;vzDriverLock(privconn);- n = virDomainObjListGetActiveIDs(privconn->domains, ids, maxids, + n = virDomainObjListGetActiveIDs(privconn->driver->domains, ids, maxids, NULL, NULL); vzDriverUnlock(privconn);@@ -386,7 +445,7 @@ vzConnectNumOfDomains(virConnectPtr conn)int count;vzDriverLock(privconn);- count = virDomainObjListNumOfDomains(privconn->domains, true, + count = virDomainObjListNumOfDomains(privconn->driver->domains, true, NULL, NULL); vzDriverUnlock(privconn);@@ -394,14 +453,16 @@ vzConnectNumOfDomains(virConnectPtr conn)}static int-vzConnectListDefinedDomains(virConnectPtr conn, char **const names, int maxnames) +vzConnectListDefinedDomains(virConnectPtr conn, + char **const names, + int maxnames)unrelated
ok
{ vzConnPtr privconn = conn->privateData; int n;vzDriverLock(privconn);memset(names, 0, sizeof(*names) * maxnames); - n = virDomainObjListGetInactiveNames(privconn->domains, names, + n = virDomainObjListGetInactiveNames(privconn->driver->domains, names, maxnames, NULL, NULL); vzDriverUnlock(privconn);@@ -415,7 +476,7 @@ vzConnectNumOfDefinedDomains(virConnectPtr conn)int count;vzDriverLock(privconn);- count = virDomainObjListNumOfDomains(privconn->domains, false, + count = virDomainObjListNumOfDomains(privconn->driver->domains, false, NULL, NULL); vzDriverUnlock(privconn);@@ -432,7 +493,7 @@ vzConnectListAllDomains(virConnectPtr conn, virCheckFlags(VIR_CONNECT_LIST_DOMAINS_FILTERS_ALL, -1);vzDriverLock(privconn); - ret = virDomainObjListExport(privconn->domains, conn, domains, + ret = virDomainObjListExport(privconn->driver->domains, conn, domains, NULL, flags); vzDriverUnlock(privconn);@@ -447,7 +508,7 @@ vzDomainLookupByID(virConnectPtr conn, int id)virDomainObjPtr dom;vzDriverLock(privconn);- dom = virDomainObjListFindByID(privconn->domains, id); + dom = virDomainObjListFindByID(privconn->driver->domains, id); vzDriverUnlock(privconn);if (dom == NULL) {@@ -473,7 +534,8 @@ vzDomainLookupByUUID(virConnectPtr conn, const unsigned char *uuid) virDomainObjPtr dom;vzDriverLock(privconn);- dom = virDomainObjListFindByUUID(privconn->domains, uuid); + + dom = virDomainObjListFindByUUID(privconn->driver->domains, uuid); vzDriverUnlock(privconn);if (dom == NULL) {@@ -502,7 +564,7 @@ vzDomainLookupByName(virConnectPtr conn, const char *name) virDomainObjPtr dom;vzDriverLock(privconn);- dom = virDomainObjListFindByName(privconn->domains, name); + dom = virDomainObjListFindByName(privconn->driver->domains, name); vzDriverUnlock(privconn);if (dom == NULL) {@@ -626,7 +688,7 @@ vzDomainGetXMLDesc(virDomainPtr domain, unsigned int flags) def = (flags & VIR_DOMAIN_XML_INACTIVE) && privdom->newDef ? privdom->newDef : privdom->def;- ret = virDomainDefFormat(def, privconn->caps, flags);+ ret = virDomainDefFormat(def, privconn->driver->caps, flags);cleanup:if (privdom) @@ -661,28 +723,29 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags) virDomainObjPtr olddom = NULL; virDomainObjPtr newdom = NULL; unsigned int parse_flags = VIR_DOMAIN_DEF_PARSE_INACTIVE; + vzDriverPtr driver = privconn->driver;virCheckFlags(VIR_DOMAIN_DEFINE_VALIDATE, NULL); if (flags & VIR_DOMAIN_DEFINE_VALIDATE)parse_flags |= VIR_DOMAIN_DEF_PARSE_VALIDATE;- vzDriverLock(privconn);- if ((def = virDomainDefParseString(xml, privconn->caps, privconn->xmlopt, + virObjectLock(driver); + if ((def = virDomainDefParseString(xml, driver->caps, driver->xmlopt, parse_flags)) == NULL) goto cleanup;- olddom = virDomainObjListFindByUUID(privconn->domains, def->uuid);+ olddom = virDomainObjListFindByUUID(driver->domains, def->uuid); if (olddom == NULL) { virResetLastError(); - newdom = vzNewDomain(privconn, def->name, def->uuid); + newdom = vzNewDomain(driver, def->name, def->uuid); if (!newdom) goto cleanup; if (def->os.type == VIR_DOMAIN_OSTYPE_HVM) { - if (prlsdkCreateVm(conn, def)) + if (prlsdkCreateVm(driver, def)) goto cleanup; } else if (def->os.type == VIR_DOMAIN_OSTYPE_EXE) { - if (prlsdkCreateCt(conn, def)) + if (prlsdkCreateCt(driver, def)) goto cleanup; } else { virReportError(VIR_ERR_INVALID_ARG, @@ -691,7 +754,7 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags) goto cleanup; }- if (prlsdkLoadDomain(privconn, newdom))+ if (prlsdkLoadDomain(driver, newdom)) goto cleanup; } else { int state, reason; @@ -717,10 +780,10 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags) goto cleanup; } } else { - if (prlsdkApplyConfig(conn, olddom, def)) + if (prlsdkApplyConfig(driver, olddom, def)) goto cleanup;- if (prlsdkUpdateDomain(privconn, olddom))+ if (prlsdkUpdateDomain(driver, olddom)) goto cleanup; } } @@ -734,12 +797,12 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags) virObjectUnlock(olddom); if (newdom) { if (!retdom) - virDomainObjListRemove(privconn->domains, newdom); + virDomainObjListRemove(driver->domains, newdom); else virObjectUnlock(newdom); } virDomainDefFree(def); - vzDriverUnlock(privconn); + virObjectUnlock(driver); return retdom; }@@ -855,7 +918,7 @@ vzConnectDomainEventRegisterAny(virConnectPtr conn,int ret = -1; vzConnPtr privconn = conn->privateData; if (virDomainEventStateRegisterID(conn, - privconn->domainEventState, + privconn->driver->domainEventState, domain, eventID, callback, opaque, freecb, &ret) < 0) ret = -1; @@ -870,7 +933,7 @@ vzConnectDomainEventDeregisterAny(virConnectPtr conn, int ret = -1;if (virObjectEventStateDeregisterID(conn,- privconn->domainEventState, + privconn->driver->domainEventState, callbackID) < 0) goto cleanup;@@ -949,7 +1012,7 @@ vzDomainUndefineFlags(virDomainPtr domain,if (!(dom = vzDomObjFromDomain(domain))) return -1;- ret = prlsdkUnregisterDomain(privconn, dom, flags);+ ret = prlsdkUnregisterDomain(privconn->driver, dom, flags); if (ret) virObjectUnlock(dom);@@ -999,12 +1062,12 @@ vzDomainManagedSave(virDomainPtr domain, unsigned int flags)state = virDomainObjGetState(dom, &reason);if (state == VIR_DOMAIN_RUNNING && (flags & VIR_DOMAIN_SAVE_PAUSED)) {- ret = prlsdkDomainChangeStateLocked(privconn, dom, prlsdkPause); + ret = prlsdkDomainChangeStateLocked(privconn->driver, dom, prlsdkPause); if (ret) goto cleanup; }- ret = prlsdkDomainChangeStateLocked(privconn, dom, prlsdkSuspend);+ ret = prlsdkDomainChangeStateLocked(privconn->driver, dom, prlsdkSuspend);cleanup:virObjectUnlock(dom); @@ -1070,14 +1133,14 @@ static int vzDomainAttachDeviceFlags(virDomainPtr dom, const char *xml, "VIR_DOMAIN_AFFECT_LIVE flag")); }- dev = virDomainDeviceDefParse(xml, privdom->def, privconn->caps,- privconn->xmlopt, VIR_DOMAIN_XML_INACTIVE); + dev = virDomainDeviceDefParse(xml, privdom->def, privconn->driver->caps, + privconn->driver->xmlopt, VIR_DOMAIN_XML_INACTIVE); if (dev == NULL) goto cleanup;switch (dev->type) {case VIR_DOMAIN_DEVICE_DISK: - ret = prlsdkAttachVolume(privconn, privdom, dev->data.disk); + ret = prlsdkAttachVolume(privconn->driver, privdom, dev->data.disk); if (ret) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("disk attach failed")); @@ -1085,7 +1148,7 @@ static int vzDomainAttachDeviceFlags(virDomainPtr dom, const char *xml, } break; case VIR_DOMAIN_DEVICE_NET: - ret = prlsdkAttachNet(privconn, privdom, dev->data.net); + ret = prlsdkAttachNet(privconn->driver, privdom, dev->data.net); if (ret) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("network attach failed")); @@ -1147,8 +1210,8 @@ static int vzDomainDetachDeviceFlags(virDomainPtr dom, const char *xml, "VIR_DOMAIN_AFFECT_LIVE flag")); }- dev = virDomainDeviceDefParse(xml, privdom->def, privconn->caps,- privconn->xmlopt, VIR_DOMAIN_XML_INACTIVE); + dev = virDomainDeviceDefParse(xml, privdom->def, privconn->driver->caps, + privconn->driver->xmlopt, VIR_DOMAIN_XML_INACTIVE); if (dev == NULL) goto cleanup;looks like it's worth introducing driver var here@@ -1162,7 +1225,7 @@ static int vzDomainDetachDeviceFlags(virDomainPtr dom, const char *xml,} break; case VIR_DOMAIN_DEVICE_NET: - ret = prlsdkDetachNet(privconn, privdom, dev->data.net); + ret = prlsdkDetachNet(privconn->driver, privdom, dev->data.net); if (ret) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("network detach failed")); @@ -1451,7 +1514,6 @@ vzConnectRegisterCloseCallback(virConnectPtr conn, int ret = -1;vzDriverLock(privconn);-unrelated
ok
if (virConnectCloseCallbackDataGetCallback(privconn->closeCallback) != NULL) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("A close callback is already registered")); @@ -1561,6 +1623,48 @@ static virConnectDriver vzConnectDriver = { .hypervisorDriver = &vzHypervisorDriver, };+static int+vzStateCleanup(void) +{ + prlsdkDeinit();i think this should go after unreferencing driver which in turn destroy driver object and call some sdk cleanup logic
indeed
+ virObjectUnref(vz_driver); + vz_driver = NULL; + virMutexDestroy(&vz_driver_lock); + return 0; +} + +static int +vzStateInitialize(bool privileged ATTRIBUTE_UNUSED, + virStateInhibitCallback callback ATTRIBUTE_UNUSED, + void *opaque ATTRIBUTE_UNUSED) +{ + if (!privileged) { + VIR_INFO("Not running privileged, disabling driver"); + return 0; + }why is this success?
just not to prevent daemon from starting
+ + if (prlsdkInit() < 0) { + VIR_DEBUG("%s", _("Can't initialize Parallels SDK"));look like you need to report error here
I just followed the rule other state drivers stick to
+ return -1; + } + + if (virMutexInit(&vz_driver_lock) < 0)and here
the same
+ goto error; + + vz_driver = vzDriverObjNew();looks like it is not a problem if we get NULL as we are lazy, i think this should be commented
ok
+ return 0; + + error: + vzStateCleanup(); + return -1; +} + +static virStateDriver vzStateDriver = { + .name = "vz", + .stateInitialize = vzStateInitialize, + .stateCleanup = vzStateCleanup, +}; + /* Parallels domain type backward compatibility*/ static virHypervisorDriver parallelsHypervisorDriver; static virConnectDriver parallelsConnectDriver; @@ -1594,5 +1698,8 @@ vzRegister(void) if (virRegisterConnectDriver(&vzConnectDriver, false) < 0) return -1;+ if (virRegisterStateDriver(&vzStateDriver) < 0)+ return -1; + return 0; } diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index c006517..9e369ce 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -234,22 +234,22 @@ prlsdkDeinit(void) };int-prlsdkConnect(vzConnPtr privconn) +prlsdkConnect(vzDriverPtr driver) { PRL_RESULT ret; PRL_HANDLE job = PRL_INVALID_HANDLE;- ret = PrlSrv_Create(&privconn->server);+ ret = PrlSrv_Create(&driver->server); if (PRL_FAILED(ret)) { logPrlError(ret); return -1; }- job = PrlSrv_LoginLocalEx(privconn->server, NULL, 0,+ job = PrlSrv_LoginLocalEx(driver->server, NULL, 0, PSL_HIGH_SECURITY, PACF_NON_INTERACTIVE_MODE);if (waitJob(job)) {- PrlHandle_Free(privconn->server); + PrlHandle_Free(driver->server); return -1; }@@ -257,18 +257,18 @@ prlsdkConnect(vzConnPtr privconn)}void-prlsdkDisconnect(vzConnPtr privconn) +prlsdkDisconnect(vzDriverPtr driver) { PRL_HANDLE job;- job = PrlSrv_Logoff(privconn->server);+ job = PrlSrv_Logoff(driver->server); waitJob(job);- PrlHandle_Free(privconn->server);+ PrlHandle_Free(driver->server); }static int-prlsdkSdkDomainLookup(vzConnPtr privconn, +prlsdkSdkDomainLookup(vzDriverPtr driver, const char *id, unsigned int flags, PRL_HANDLE *sdkdom) @@ -278,7 +278,7 @@ prlsdkSdkDomainLookup(vzConnPtr privconn, PRL_RESULT pret = PRL_ERR_UNINITIALIZED; int ret = -1;- job = PrlSrv_GetVmConfig(privconn->server, id, flags);+ job = PrlSrv_GetVmConfig(driver->server, id, flags); if (PRL_FAILED(getJobResult(job, &result))) goto cleanup;@@ -303,14 +303,14 @@ prlsdkUUIDFormat(const unsigned char *uuid, char *uuidstr)}static PRL_HANDLE-prlsdkSdkDomainLookupByUUID(vzConnPtr privconn, const unsigned char *uuid) +prlsdkSdkDomainLookupByUUID(vzDriverPtr driver, const unsigned char *uuid) { char uuidstr[VIR_UUID_STRING_BUFLEN + 2]; PRL_HANDLE sdkdom = PRL_INVALID_HANDLE;prlsdkUUIDFormat(uuid, uuidstr); - if (prlsdkSdkDomainLookup(privconn, uuidstr,+ if (prlsdkSdkDomainLookup(driver, uuidstr, PGVC_SEARCH_BY_UUID, &sdkdom) < 0) { virUUIDFormat(uuid, uuidstr); virReportError(VIR_ERR_NO_DOMAIN, @@ -466,7 +466,7 @@ prlsdkAddDomainVideoInfo(PRL_HANDLE sdkdom, virDomainDefPtr def) }static int-prlsdkGetDiskInfo(vzConnPtr privconn, +prlsdkGetDiskInfo(vzDriverPtr driver, PRL_HANDLE prldisk, virDomainDiskDefPtr disk, bool isCdrom, @@ -489,9 +489,9 @@ prlsdkGetDiskInfo(vzConnPtr privconn, virDomainDiskSetFormat(disk, VIR_STORAGE_FILE_RAW); } else { if (isCt) - virDomainDiskSetFormat(disk, privconn->vzCaps.ctDiskFormat); + virDomainDiskSetFormat(disk, driver->vzCaps.ctDiskFormat); else - virDomainDiskSetFormat(disk, privconn->vzCaps.vmDiskFormat); + virDomainDiskSetFormat(disk, driver->vzCaps.vmDiskFormat); } } else { virDomainDiskSetType(disk, VIR_STORAGE_TYPE_BLOCK); @@ -620,7 +620,7 @@ prlsdkGetFSInfo(PRL_HANDLE prldisk, }static int-prlsdkAddDomainHardDisksInfo(vzConnPtr privconn, PRL_HANDLE sdkdom, virDomainDefPtr def) +prlsdkAddDomainHardDisksInfo(vzDriverPtr driver, PRL_HANDLE sdkdom, virDomainDefPtr def) { PRL_RESULT pret; PRL_UINT32 hddCount; @@ -660,7 +660,7 @@ prlsdkAddDomainHardDisksInfo(vzConnPtr privconn, PRL_HANDLE sdkdom, virDomainDef if (!(disk = virDomainDiskDefNew(NULL))) goto error;- if (prlsdkGetDiskInfo(privconn, hdd, disk, false, IS_CT(def)) < 0)+ if (prlsdkGetDiskInfo(driver, hdd, disk, false, IS_CT(def)) < 0) goto error;if (virDomainDiskInsert(def, disk) < 0)@@ -682,7 +682,7 @@ prlsdkAddDomainHardDisksInfo(vzConnPtr privconn, PRL_HANDLE sdkdom, virDomainDef }static int-prlsdkAddDomainOpticalDisksInfo(vzConnPtr privconn, PRL_HANDLE sdkdom, virDomainDefPtr def) +prlsdkAddDomainOpticalDisksInfo(vzDriverPtr driver, PRL_HANDLE sdkdom, virDomainDefPtr def) { PRL_RESULT pret; PRL_UINT32 cdromsCount; @@ -700,7 +700,7 @@ prlsdkAddDomainOpticalDisksInfo(vzConnPtr privconn, PRL_HANDLE sdkdom, virDomain if (!(disk = virDomainDiskDefNew(NULL))) goto error;- if (prlsdkGetDiskInfo(privconn, cdrom, disk, true, IS_CT(def)) < 0)+ if (prlsdkGetDiskInfo(driver, cdrom, disk, true, IS_CT(def)) < 0) goto error;PrlHandle_Free(cdrom);@@ -963,16 +963,16 @@ prlsdkAddSerialInfo(PRL_HANDLE sdkdom,static int-prlsdkAddDomainHardware(vzConnPtr privconn, PRL_HANDLE sdkdom, virDomainDefPtr def) +prlsdkAddDomainHardware(vzDriverPtr driver, PRL_HANDLE sdkdom, virDomainDefPtr def) { if (!IS_CT(def)) if (prlsdkAddDomainVideoInfo(sdkdom, def) < 0) goto error;- if (prlsdkAddDomainHardDisksInfo(privconn, sdkdom, def) < 0)+ if (prlsdkAddDomainHardDisksInfo(driver, sdkdom, def) < 0) goto error;- if (prlsdkAddDomainOpticalDisksInfo(privconn, sdkdom, def) < 0)+ if (prlsdkAddDomainOpticalDisksInfo(driver, sdkdom, def) < 0) goto error;if (prlsdkAddDomainNetInfo(sdkdom, def) < 0)@@ -1250,7 +1250,7 @@ prlsdkConvertCpuMode(PRL_HANDLE sdkdom, virDomainDefPtr def) }static virDomainObjPtr-prlsdkNewDomainByHandle(vzConnPtr privconn, PRL_HANDLE sdkdom) +prlsdkNewDomainByHandle(vzDriverPtr driver, PRL_HANDLE sdkdom) { virDomainObjPtr dom = NULL; unsigned char uuid[VIR_UUID_BUFLEN]; @@ -1259,16 +1259,18 @@ prlsdkNewDomainByHandle(vzConnPtr privconn, PRL_HANDLE sdkdom) if (prlsdkGetDomainIds(sdkdom, &name, uuid) < 0) goto cleanup;- if (!(dom = vzNewDomain(privconn, name, uuid)))+ virObjectLock(driver);if you need to introduce lock here i think you need extra patch with explanations
ok
+ if (!(dom = vzNewDomain(driver, name, uuid))) goto cleanup;- if (prlsdkLoadDomain(privconn, dom) < 0) {- virDomainObjListRemove(privconn->domains, dom); + if (prlsdkLoadDomain(driver, dom) < 0) { + virDomainObjListRemove(driver->domains, dom); dom = NULL; goto cleanup; }cleanup:+ virObjectUnlock(driver); VIR_FREE(name); return dom; } @@ -1509,7 +1511,7 @@ prlsdkConvertBootOrder(PRL_HANDLE sdkdom, virDomainDefPtr def) }int-prlsdkLoadDomain(vzConnPtr privconn, virDomainObjPtr dom) +prlsdkLoadDomain(vzDriverPtr driver, virDomainObjPtr dom) { virDomainDefPtr def = NULL; vzDomObjPtr pdom = NULL; @@ -1523,11 +1525,10 @@ prlsdkLoadDomain(vzConnPtr privconn, virDomainObjPtr dom) PRL_VM_AUTOSTART_OPTION autostart; PRL_HANDLE sdkdom = PRL_INVALID_HANDLE;- virCheckNonNullArgGoto(privconn, error);virCheckNonNullArgGoto(dom, error);pdom = dom->privateData;- sdkdom = prlsdkSdkDomainLookupByUUID(privconn, dom->def->uuid); + sdkdom = prlsdkSdkDomainLookupByUUID(driver, dom->def->uuid); if (sdkdom == PRL_INVALID_HANDLE) return -1;@@ -1560,7 +1561,7 @@ prlsdkLoadDomain(vzConnPtr privconn, virDomainObjPtr dom)if (prlsdkConvertDomainType(sdkdom, def) < 0) goto error;- if (prlsdkAddDomainHardware(privconn, sdkdom, def) < 0)+ if (prlsdkAddDomainHardware(driver, sdkdom, def) < 0) goto error;/* depends on prlsdkAddDomainHardware */@@ -1652,7 +1653,7 @@ prlsdkLoadDomain(vzConnPtr privconn, virDomainObjPtr dom) }int-prlsdkLoadDomains(vzConnPtr privconn) +prlsdkLoadDomains(vzDriverPtr driver) { PRL_HANDLE job = PRL_INVALID_HANDLE; PRL_HANDLE result; @@ -1662,7 +1663,7 @@ prlsdkLoadDomains(vzConnPtr privconn) size_t i = 0; virDomainObjPtr dom;- job = PrlSrv_GetVmListEx(privconn->server, PVTF_VM | PVTF_CT);+ job = PrlSrv_GetVmListEx(driver->server, PVTF_VM | PVTF_CT);if (PRL_FAILED(getJobResult(job, &result)))return -1; @@ -1674,8 +1675,8 @@ prlsdkLoadDomains(vzConnPtr privconn) pret = PrlResult_GetParamByIndex(result, i, &sdkdom); prlsdkCheckRetGoto(pret, error);- if (!(dom = prlsdkNewDomainByHandle(privconn, sdkdom)))- goto error; + if (!(dom = prlsdkNewDomainByHandle(driver, sdkdom))) + continue;virObjectUnlock(dom);PrlHandle_Free(sdkdom); @@ -1692,7 +1693,7 @@ prlsdkLoadDomains(vzConnPtr privconn) }int-prlsdkUpdateDomain(vzConnPtr privconn, virDomainObjPtr dom) +prlsdkUpdateDomain(vzDriverPtr driver, virDomainObjPtr dom) { PRL_HANDLE job; vzDomObjPtr pdom = dom->privateData; @@ -1701,10 +1702,10 @@ prlsdkUpdateDomain(vzConnPtr privconn, virDomainObjPtr dom) if (waitJob(job)) return -1;- return prlsdkLoadDomain(privconn, dom);+ return prlsdkLoadDomain(driver, dom); }-static int prlsdkSendEvent(vzConnPtr privconn,+static int prlsdkSendEvent(vzDriverPtr driver, virDomainObjPtr dom, virDomainEventType lvEventType, int lvEventTypeDetails) @@ -1717,7 +1718,7 @@ static int prlsdkSendEvent(vzConnPtr privconn, if (!event) return -1;- virObjectEventStateQueue(privconn->domainEventState, event);+ virObjectEventStateQueue(driver->domainEventState, event); return 0; }@@ -1755,7 +1756,7 @@ prlsdkNewStateToEvent(VIRTUAL_MACHINE_STATE domainState,}static void-prlsdkHandleVmStateEvent(vzConnPtr privconn, +prlsdkHandleVmStateEvent(vzDriverPtr driver, PRL_HANDLE prlEvent, unsigned char *uuid) { @@ -1767,7 +1768,7 @@ prlsdkHandleVmStateEvent(vzConnPtr privconn, virDomainEventType lvEventType = 0; int lvEventTypeDetails = 0;- dom = virDomainObjListFindByUUID(privconn->domains, uuid);+ dom = virDomainObjListFindByUUID(driver->domains, uuid); if (dom == NULL) return;@@ -1785,7 +1786,7 @@ prlsdkHandleVmStateEvent(vzConnPtr privconn,&lvEventType, &lvEventTypeDetails);- prlsdkSendEvent(privconn, dom, lvEventType, lvEventTypeDetails);+ prlsdkSendEvent(driver, dom, lvEventType, lvEventTypeDetails);cleanup:virObjectUnlock(dom); @@ -1793,19 +1794,19 @@ prlsdkHandleVmStateEvent(vzConnPtr privconn, }static void-prlsdkHandleVmConfigEvent(vzConnPtr privconn, +prlsdkHandleVmConfigEvent(vzDriverPtr driver, unsigned char *uuid) { virDomainObjPtr dom = NULL;- dom = virDomainObjListFindByUUID(privconn->domains, uuid);+ dom = virDomainObjListFindByUUID(driver->domains, uuid); if (dom == NULL) return;- if (prlsdkUpdateDomain(privconn, dom) < 0)+ if (prlsdkUpdateDomain(driver, dom) < 0) goto cleanup;- prlsdkSendEvent(privconn, dom, VIR_DOMAIN_EVENT_DEFINED,+ prlsdkSendEvent(driver, dom, VIR_DOMAIN_EVENT_DEFINED, VIR_DOMAIN_EVENT_DEFINED_UPDATED);cleanup:@@ -1814,23 +1815,23 @@ prlsdkHandleVmConfigEvent(vzConnPtr privconn, }static void-prlsdkHandleVmAddedEvent(vzConnPtr privconn, +prlsdkHandleVmAddedEvent(vzDriverPtr driver, unsigned char *uuid) { virDomainObjPtr dom = NULL; PRL_HANDLE sdkdom = PRL_INVALID_HANDLE;- dom = virDomainObjListFindByUUID(privconn->domains, uuid);+ dom = virDomainObjListFindByUUID(driver->domains, uuid); if (!dom) { - sdkdom = prlsdkSdkDomainLookupByUUID(privconn, uuid); + sdkdom = prlsdkSdkDomainLookupByUUID(driver, uuid); if (sdkdom == PRL_INVALID_HANDLE) goto cleanup;- if (!(dom = prlsdkNewDomainByHandle(privconn, sdkdom)))+ if (!(dom = prlsdkNewDomainByHandle(driver, sdkdom))) goto cleanup; }- prlsdkSendEvent(privconn, dom, VIR_DOMAIN_EVENT_DEFINED,+ prlsdkSendEvent(driver, dom, VIR_DOMAIN_EVENT_DEFINED, VIR_DOMAIN_EVENT_DEFINED_ADDED);cleanup:@@ -1841,28 +1842,28 @@ prlsdkHandleVmAddedEvent(vzConnPtr privconn, }static void-prlsdkHandleVmRemovedEvent(vzConnPtr privconn, +prlsdkHandleVmRemovedEvent(vzDriverPtr driver, unsigned char *uuid) { virDomainObjPtr dom = NULL;- dom = virDomainObjListFindByUUID(privconn->domains, uuid);+ dom = virDomainObjListFindByUUID(driver->domains, uuid); /* domain was removed from the list from the libvirt * API function in current connection */ if (dom == NULL) return;- prlsdkSendEvent(privconn, dom, VIR_DOMAIN_EVENT_UNDEFINED,+ prlsdkSendEvent(driver, dom, VIR_DOMAIN_EVENT_UNDEFINED, VIR_DOMAIN_EVENT_UNDEFINED_REMOVED);- virDomainObjListRemove(privconn->domains, dom);+ virDomainObjListRemove(driver->domains, dom); return; }#define PARALLELS_STATISTICS_DROP_COUNT 3 static PRL_RESULT-prlsdkHandlePerfEvent(vzConnPtr privconn, +prlsdkHandlePerfEvent(vzDriverPtr driver, PRL_HANDLE event, unsigned char *uuid) { @@ -1870,7 +1871,7 @@ prlsdkHandlePerfEvent(vzConnPtr privconn, vzDomObjPtr privdom = NULL; PRL_HANDLE job = PRL_INVALID_HANDLE;- dom = virDomainObjListFindByUUID(privconn->domains, uuid);+ dom = virDomainObjListFindByUUID(driver->domains, uuid); if (dom == NULL) goto cleanup; privdom = dom->privateData; @@ -1907,7 +1908,7 @@ prlsdkHandlePerfEvent(vzConnPtr privconn, static PRL_RESULT prlsdkEventsHandler(PRL_HANDLE prlEvent, PRL_VOID_PTR opaque) { - vzConnPtr privconn = opaque; + vzDriverPtr driver = opaque; PRL_RESULT pret = PRL_ERR_FAILURE; PRL_HANDLE_TYPE handleType; char uuidstr[VIR_UUID_STRING_BUFLEN + 2]; @@ -1922,7 +1923,7 @@ prlsdkEventsHandler(PRL_HANDLE prlEvent, PRL_VOID_PTR opaque) if (handleType != PHT_EVENT) goto cleanup;- if (privconn == NULL)+ if (driver == NULL) goto cleanup;pret = PrlEvent_GetIssuerId(prlEvent, uuidstr, &bufsize);@@ -1938,27 +1939,26 @@ prlsdkEventsHandler(PRL_HANDLE prlEvent, PRL_VOID_PTR opaque)switch (prlEventType) {case PET_DSP_EVT_VM_STATE_CHANGED: - prlsdkHandleVmStateEvent(privconn, prlEvent, uuid); + prlsdkHandleVmStateEvent(driver, prlEvent, uuid); break; case PET_DSP_EVT_VM_CONFIG_CHANGED: - prlsdkHandleVmConfigEvent(privconn, uuid); + prlsdkHandleVmConfigEvent(driver, uuid); break; case PET_DSP_EVT_VM_CREATED: case PET_DSP_EVT_VM_ADDED: - prlsdkHandleVmAddedEvent(privconn, uuid); + prlsdkHandleVmAddedEvent(driver, uuid); break; case PET_DSP_EVT_VM_DELETED: case PET_DSP_EVT_VM_UNREGISTERED: - prlsdkHandleVmRemovedEvent(privconn, uuid); + prlsdkHandleVmRemovedEvent(driver, uuid); break; case PET_DSP_EVT_VM_PERFSTATS: - prlsdkHandlePerfEvent(privconn, prlEvent, uuid); + prlsdkHandlePerfEvent(driver, prlEvent, uuid); /* above function takes own of event */ prlEvent = PRL_INVALID_HANDLE; break; case PET_DSP_EVT_DISP_CONNECTION_CLOSED: - virConnectCloseCallbackDataCall(privconn->closeCallback, - VIR_CONNECT_CLOSE_REASON_EOF); + vzDestroyDriverConnection(); break; default: VIR_DEBUG("Skipping event of type %d", prlEventType); @@ -1969,13 +1969,13 @@ prlsdkEventsHandler(PRL_HANDLE prlEvent, PRL_VOID_PTR opaque) return PRL_ERR_SUCCESS; }-int prlsdkSubscribeToPCSEvents(vzConnPtr privconn)+int prlsdkSubscribeToPCSEvents(vzDriverPtr driver) { PRL_RESULT pret = PRL_ERR_UNINITIALIZED;- pret = PrlSrv_RegEventHandler(privconn->server,+ pret = PrlSrv_RegEventHandler(driver->server, prlsdkEventsHandler, - privconn); + driver); prlsdkCheckRetGoto(pret, error); return 0;@@ -1983,12 +1983,12 @@ int prlsdkSubscribeToPCSEvents(vzConnPtr privconn)return -1; }-void prlsdkUnsubscribeFromPCSEvents(vzConnPtr privconn)+void prlsdkUnsubscribeFromPCSEvents(vzDriverPtr driver) { PRL_RESULT ret = PRL_ERR_UNINITIALIZED; - ret = PrlSrv_UnregEventHandler(privconn->server, + ret = PrlSrv_UnregEventHandler(driver->server, prlsdkEventsHandler, - privconn); + driver); if (PRL_FAILED(ret)) logPrlError(ret); } @@ -2052,7 +2052,7 @@ PRL_RESULT prlsdkRestart(PRL_HANDLE sdkdom) }int-prlsdkDomainChangeStateLocked(vzConnPtr privconn, +prlsdkDomainChangeStateLocked(vzDriverPtr driver, virDomainObjPtr dom, prlsdkChangeStateFunc chstate) { @@ -2078,7 +2078,7 @@ prlsdkDomainChangeStateLocked(vzConnPtr privconn, return -1; }- return prlsdkUpdateDomain(privconn, dom);+ return prlsdkUpdateDomain(driver, dom); }int@@ -2092,7 +2092,7 @@ prlsdkDomainChangeState(virDomainPtr domain, if (!(dom = vzDomObjFromDomain(domain))) return -1;- ret = prlsdkDomainChangeStateLocked(privconn, dom, chstate);+ ret = prlsdkDomainChangeStateLocked(privconn->driver, dom, chstate); virObjectUnlock(dom); return ret; } @@ -2850,7 +2850,7 @@ static const char * prlsdkFormatMac(virMacAddrPtr mac, char *macstr) return macstr; }-static int prlsdkAddNet(vzConnPtr privconn,+static int prlsdkAddNet(vzDriverPtr driver, PRL_HANDLE sdkdom, virDomainNetDefPtr net, bool isCt) @@ -3055,7 +3055,7 @@ static int prlsdkAddNet(vzConnPtr privconn, pret = PrlVirtNet_SetNetworkType(vnet, PVN_BRIDGED_ETHERNET); prlsdkCheckRetGoto(pret, cleanup);- job = PrlSrv_AddVirtualNetwork(privconn->server,+ job = PrlSrv_AddVirtualNetwork(driver->server, vnet, PRL_USE_VNET_NAME_FOR_BRIDGE_NAME); if (PRL_FAILED(pret = waitJob(job))) @@ -3084,7 +3084,7 @@ static int prlsdkAddNet(vzConnPtr privconn, }static void-prlsdkCleanupBridgedNet(vzConnPtr privconn, virDomainNetDefPtr net) +prlsdkCleanupBridgedNet(vzDriverPtr driver, virDomainNetDefPtr net) { PRL_RESULT pret; PRL_HANDLE vnet = PRL_INVALID_HANDLE; @@ -3099,7 +3099,7 @@ prlsdkCleanupBridgedNet(vzConnPtr privconn, virDomainNetDefPtr net) pret = PrlVirtNet_SetNetworkId(vnet, net->data.network.name); prlsdkCheckRetGoto(pret, cleanup);- job = PrlSrv_DeleteVirtualNetwork(privconn->server, vnet, 0);+ job = PrlSrv_DeleteVirtualNetwork(driver->server, vnet, 0); if (PRL_FAILED(pret = waitJob(job))) goto cleanup;@@ -3107,7 +3107,7 @@ prlsdkCleanupBridgedNet(vzConnPtr privconn, virDomainNetDefPtr net)PrlHandle_Free(vnet); }-int prlsdkAttachNet(vzConnPtr privconn,+int prlsdkAttachNet(vzDriverPtr driver, virDomainObjPtr dom, virDomainNetDefPtr net) { @@ -3125,7 +3125,7 @@ int prlsdkAttachNet(vzConnPtr privconn, if (PRL_FAILED(waitJob(job))) return ret;- ret = prlsdkAddNet(privconn, privdom->sdkdom, net, IS_CT(dom->def));+ ret = prlsdkAddNet(driver, privdom->sdkdom, net, IS_CT(dom->def)); if (ret == 0) { job = PrlVm_CommitEx(privdom->sdkdom, PVCF_DETACH_HDD_BUNDLE); if (PRL_FAILED(waitJob(job))) @@ -3172,7 +3172,7 @@ prlsdkFindNetByMAC(PRL_HANDLE sdkdom, virMacAddrPtr mac) return adapter; }-int prlsdkDetachNet(vzConnPtr privconn,+int prlsdkDetachNet(vzDriverPtr driver, virDomainObjPtr dom, virDomainNetDefPtr net) { @@ -3196,7 +3196,7 @@ int prlsdkDetachNet(vzConnPtr privconn, if (sdknet == PRL_INVALID_HANDLE) goto cleanup;- prlsdkCleanupBridgedNet(privconn, net);+ prlsdkCleanupBridgedNet(driver, net);pret = PrlVmDev_Remove(sdknet);prlsdkCheckRetGoto(pret, cleanup); @@ -3231,7 +3231,7 @@ static int prlsdkDelDisk(PRL_HANDLE sdkdom, int idx) return ret; }-static int prlsdkAddDisk(vzConnPtr privconn,+static int prlsdkAddDisk(vzDriverPtr driver, PRL_HANDLE sdkdom, virDomainDiskDefPtr disk) { @@ -3342,7 +3342,7 @@ static int prlsdkAddDisk(vzConnPtr privconn, }if (disk->bus == VIR_DOMAIN_DISK_BUS_SCSI) {- if (vzGetDefaultSCSIModel(privconn, &scsiModel) < 0) + if (vzGetDefaultSCSIModel(driver, &scsiModel) < 0) goto cleanup; pret = PrlVmDev_SetSubType(sdkdisk, scsiModel); prlsdkCheckRetGoto(pret, cleanup); @@ -3380,7 +3380,7 @@ static int prlsdkAddDisk(vzConnPtr privconn, }int-prlsdkAttachVolume(vzConnPtr privconn, +prlsdkAttachVolume(vzDriverPtr driver, virDomainObjPtr dom, virDomainDiskDefPtr disk) { @@ -3392,7 +3392,7 @@ prlsdkAttachVolume(vzConnPtr privconn, if (PRL_FAILED(waitJob(job))) goto cleanup;- ret = prlsdkAddDisk(privconn, privdom->sdkdom, disk);+ ret = prlsdkAddDisk(driver, privdom->sdkdom, disk); if (ret == 0) { job = PrlVm_CommitEx(privdom->sdkdom, PVCF_DETACH_HDD_BUNDLE); if (PRL_FAILED(waitJob(job))) { @@ -3594,7 +3594,7 @@ prlsdkSetBootOrderVm(PRL_HANDLE sdkdom, virDomainDefPtr def) }static int-prlsdkDoApplyConfig(virConnectPtr conn, +prlsdkDoApplyConfig(vzDriverPtr driver, PRL_HANDLE sdkdom, virDomainDefPtr def, virDomainDefPtr olddef) @@ -3660,11 +3660,11 @@ prlsdkDoApplyConfig(virConnectPtr conn,if (olddef) {for (i = 0; i < olddef->nnets; i++) - prlsdkCleanupBridgedNet(conn->privateData, olddef->nets[i]); + prlsdkCleanupBridgedNet(driver, olddef->nets[i]); }for (i = 0; i < def->nnets; i++) {- if (prlsdkAddNet(conn->privateData, sdkdom, def->nets[i], IS_CT(def)) < 0) + if (prlsdkAddNet(driver, sdkdom, def->nets[i], IS_CT(def)) < 0) goto error; }@@ -3685,7 +3685,7 @@ prlsdkDoApplyConfig(virConnectPtr conn,}for (i = 0; i < def->ndisks; i++) {- if (prlsdkAddDisk(conn->privateData, sdkdom, def->disks[i]) < 0) + if (prlsdkAddDisk(driver, sdkdom, def->disks[i]) < 0) goto error; }@@ -3703,22 +3703,21 @@ prlsdkDoApplyConfig(virConnectPtr conn,VIR_FREE(mask);for (i = 0; i < def->nnets; i++)- prlsdkCleanupBridgedNet(conn->privateData, def->nets[i]); + prlsdkCleanupBridgedNet(driver, def->nets[i]);return -1;}int-prlsdkApplyConfig(virConnectPtr conn, +prlsdkApplyConfig(vzDriverPtr driver, virDomainObjPtr dom, virDomainDefPtr new) { - vzConnPtr privconn = conn->privateData; PRL_HANDLE sdkdom = PRL_INVALID_HANDLE; PRL_HANDLE job = PRL_INVALID_HANDLE; int ret;- sdkdom = prlsdkSdkDomainLookupByUUID(privconn, dom->def->uuid);+ sdkdom = prlsdkSdkDomainLookupByUUID(driver, dom->def->uuid); if (sdkdom == PRL_INVALID_HANDLE) return -1;@@ -3726,7 +3725,7 @@ prlsdkApplyConfig(virConnectPtr conn,if (PRL_FAILED(waitJob(job))) return -1;- ret = prlsdkDoApplyConfig(conn, sdkdom, new, dom->def);+ ret = prlsdkDoApplyConfig(driver, sdkdom, new, dom->def);if (ret == 0) {job = PrlVm_CommitEx(sdkdom, PVCF_DETACH_HDD_BUNDLE); @@ -3740,9 +3739,8 @@ prlsdkApplyConfig(virConnectPtr conn, }int-prlsdkCreateVm(virConnectPtr conn, virDomainDefPtr def) +prlsdkCreateVm(vzDriverPtr driver, virDomainDefPtr def) { - vzConnPtr privconn = conn->privateData; PRL_HANDLE sdkdom = PRL_INVALID_HANDLE; PRL_HANDLE job = PRL_INVALID_HANDLE; PRL_HANDLE result = PRL_INVALID_HANDLE; @@ -3750,10 +3748,10 @@ prlsdkCreateVm(virConnectPtr conn, virDomainDefPtr def) PRL_RESULT pret; int ret = -1;- pret = PrlSrv_CreateVm(privconn->server, &sdkdom);+ pret = PrlSrv_CreateVm(driver->server, &sdkdom); prlsdkCheckRetGoto(pret, cleanup);- job = PrlSrv_GetSrvConfig(privconn->server);+ job = PrlSrv_GetSrvConfig(driver->server); if (PRL_FAILED(getJobResult(job, &result))) goto cleanup;@@ -3766,7 +3764,7 @@ prlsdkCreateVm(virConnectPtr conn, virDomainDefPtr def)pret = PrlVmCfg_SetOfflineManagementEnabled(sdkdom, 0); prlsdkCheckRetGoto(pret, cleanup);- ret = prlsdkDoApplyConfig(conn, sdkdom, def, NULL);+ ret = prlsdkDoApplyConfig(driver, sdkdom, def, NULL); if (ret) goto cleanup;@@ -3780,9 +3778,8 @@ prlsdkCreateVm(virConnectPtr conn, virDomainDefPtr def)}int-prlsdkCreateCt(virConnectPtr conn, virDomainDefPtr def) +prlsdkCreateCt(vzDriverPtr driver, virDomainDefPtr def) { - vzConnPtr privconn = conn->privateData; PRL_HANDLE sdkdom = PRL_INVALID_HANDLE; PRL_GET_VM_CONFIG_PARAM_DATA confParam; PRL_HANDLE job = PRL_INVALID_HANDLE; @@ -3815,7 +3812,7 @@ prlsdkCreateCt(virConnectPtr conn, virDomainDefPtr def) confParam.sConfigSample = "vswap.1024MB"; confParam.nOsVersion = 0;- job = PrlSrv_GetDefaultVmConfig(privconn->server, &confParam, 0);+ job = PrlSrv_GetDefaultVmConfig(driver->server, &confParam, 0); if (PRL_FAILED(getJobResult(job, &result))) goto cleanup;@@ -3828,7 +3825,7 @@ prlsdkCreateCt(virConnectPtr conn, virDomainDefPtr def) } - ret = prlsdkDoApplyConfig(conn, sdkdom, def, NULL);+ ret = prlsdkDoApplyConfig(driver, sdkdom, def, NULL); if (ret) goto cleanup;@@ -3947,7 +3944,7 @@ prlsdkDomainHasSnapshots(PRL_HANDLE sdkdom, int* found)}int-prlsdkUnregisterDomain(vzConnPtr privconn, virDomainObjPtr dom, unsigned int flags) +prlsdkUnregisterDomain(vzDriverPtr driver, virDomainObjPtr dom, unsigned int flags) { vzDomObjPtr privdom = dom->privateData; PRL_HANDLE job; @@ -3984,13 +3981,13 @@ prlsdkUnregisterDomain(vzConnPtr privconn, virDomainObjPtr dom, unsigned int fla return -1;for (i = 0; i < dom->def->nnets; i++)- prlsdkCleanupBridgedNet(privconn, dom->def->nets[i]); + prlsdkCleanupBridgedNet(driver, dom->def->nets[i]);- if (prlsdkSendEvent(privconn, dom, VIR_DOMAIN_EVENT_UNDEFINED,+ if (prlsdkSendEvent(driver, dom, VIR_DOMAIN_EVENT_UNDEFINED, VIR_DOMAIN_EVENT_UNDEFINED_REMOVED) < 0) return -1;- virDomainObjListRemove(privconn->domains, dom);+ virDomainObjListRemove(driver->domains, dom); return 0; }diff --git a/src/vz/vz_sdk.h b/src/vz/vz_sdk.hindex 2f11d4f..f197832 100644 --- a/src/vz/vz_sdk.h +++ b/src/vz/vz_sdk.h @@ -26,16 +26,16 @@int prlsdkInit(void);void prlsdkDeinit(void); -int prlsdkConnect(vzConnPtr privconn); -void prlsdkDisconnect(vzConnPtr privconn); +int prlsdkConnect(vzDriverPtr driver); +void prlsdkDisconnect(vzDriverPtr driver); int -prlsdkLoadDomains(vzConnPtr privconn); -int prlsdkUpdateDomain(vzConnPtr privconn, virDomainObjPtr dom); +prlsdkLoadDomains(vzDriverPtr driver); +int prlsdkUpdateDomain(vzDriverPtr driver, virDomainObjPtr dom); int -prlsdkLoadDomain(vzConnPtr privconn, +prlsdkLoadDomain(vzDriverPtr driver, virDomainObjPtr dom); -int prlsdkSubscribeToPCSEvents(vzConnPtr privconn); -void prlsdkUnsubscribeFromPCSEvents(vzConnPtr privconn); +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); @@ -49,29 +49,29 @@ int prlsdkDomainChangeState(virDomainPtr domain, prlsdkChangeStateFunc chstate); int -prlsdkDomainChangeStateLocked(vzConnPtr privconn, +prlsdkDomainChangeStateLocked(vzDriverPtr driver, virDomainObjPtr dom, prlsdkChangeStateFunc chstate); int -prlsdkApplyConfig(virConnectPtr conn, +prlsdkApplyConfig(vzDriverPtr driver, virDomainObjPtr dom, virDomainDefPtr new); -int prlsdkCreateVm(virConnectPtr conn, virDomainDefPtr def); -int prlsdkCreateCt(virConnectPtr conn, virDomainDefPtr def); +int prlsdkCreateVm(vzDriverPtr driver, virDomainDefPtr def); +int prlsdkCreateCt(vzDriverPtr driver, virDomainDefPtr def); int -prlsdkUnregisterDomain(vzConnPtr privconn, virDomainObjPtr dom, unsigned int flags); +prlsdkUnregisterDomain(vzDriverPtr driver, virDomainObjPtr dom, unsigned int flags); int prlsdkDomainManagedSaveRemove(virDomainObjPtr dom); int -prlsdkAttachVolume(vzConnPtr privconn, virDomainObjPtr dom, virDomainDiskDefPtr disk); +prlsdkAttachVolume(vzDriverPtr driver, virDomainObjPtr dom, virDomainDiskDefPtr disk); int prlsdkDetachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk); int prlsdkGetBlockStats(virDomainObjPtr dom, virDomainDiskDefPtr disk, virDomainBlockStatsPtr stats); int -prlsdkAttachNet(vzConnPtr privconn, virDomainObjPtr dom, virDomainNetDefPtr net); +prlsdkAttachNet(vzDriverPtr driver, virDomainObjPtr dom, virDomainNetDefPtr net); int -prlsdkDetachNet(vzConnPtr privconn, virDomainObjPtr dom, virDomainNetDefPtr net); +prlsdkDetachNet(vzDriverPtr driver, virDomainObjPtr dom, virDomainNetDefPtr net); int prlsdkGetNetStats(virDomainObjPtr dom, const char *path, virDomainInterfaceStatsPtr stats); int diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c index 64e469c..6e28f20 100644 --- a/src/vz/vz_utils.c +++ b/src/vz/vz_utils.c @@ -73,8 +73,9 @@ vzDomObjFromDomain(virDomainPtr domain) virDomainObjPtr vm; vzConnPtr privconn = domain->conn->privateData; char uuidstr[VIR_UUID_STRING_BUFLEN]; + vzDriverPtr driver = privconn->driver;- vm = virDomainObjListFindByUUID(privconn->domains, domain->uuid);+ vm = virDomainObjListFindByUUID(driver->domains, domain->uuid); if (!vm) { virUUIDFormat(domain->uuid, uuidstr); virReportError(VIR_ERR_NO_DOMAIN, @@ -84,7 +85,6 @@ vzDomObjFromDomain(virDomainPtr domain) }return vm;- }/**@@ -103,8 +103,9 @@ vzDomObjFromDomainRef(virDomainPtr domain) virDomainObjPtr vm; vzConnPtr privconn = domain->conn->privateData; char uuidstr[VIR_UUID_STRING_BUFLEN]; + vzDriverPtr driver = privconn->driver;- vm = virDomainObjListFindByUUIDRef(privconn->domains, domain->uuid);+ vm = virDomainObjListFindByUUIDRef(driver->domains, domain->uuid); if (!vm) { virUUIDFormat(domain->uuid, uuidstr); virReportError(VIR_ERR_NO_DOMAIN, @@ -159,7 +160,7 @@ vzGetOutput(const char *binary, ...) }virDomainObjPtr-vzNewDomain(vzConnPtr privconn, char *name, const unsigned char *uuid) +vzNewDomain(vzDriverPtr driver, char *name, const unsigned char *uuid) { virDomainDefPtr def = NULL; virDomainObjPtr dom = NULL; @@ -180,8 +181,8 @@ vzNewDomain(vzConnPtr privconn, char *name, const unsigned char *uuid)def->virtType = VIR_DOMAIN_VIRT_VZ; - if (!(dom = virDomainObjListAdd(privconn->domains, def,- privconn->xmlopt, + if (!(dom = virDomainObjListAdd(driver->domains, def, + driver->xmlopt, 0, NULL))) goto error;@@ -199,7 +200,7 @@ vzNewDomain(vzConnPtr privconn, char *name, const unsigned char *uuid)}static void-vzInitCaps(unsigned long vzVersion, vzCapabilities *vzCaps) +vzInitCaps(unsigned long vzVersion, vzCapabilitiesPtr vzCaps) { if (vzVersion < VIRTUOZZO_VER_7) { vzCaps->ctDiskFormat = VIR_STORAGE_FILE_PLOOP; @@ -217,7 +218,7 @@ vzInitCaps(unsigned long vzVersion, vzCapabilities *vzCaps) }int-vzInitVersion(vzConnPtr privconn) +vzInitVersion(vzDriverPtr driver) { char *output, *sVer, *tmp; const char *searchStr = "prlsrvctl version "; @@ -250,12 +251,12 @@ vzInitVersion(vzConnPtr privconn) }tmp[0] = '\0';- if (virParseVersionString(sVer, &(privconn->vzVersion), true) < 0) { + if (virParseVersionString(sVer, &(driver->vzVersion), true) < 0) { vzParseError(); goto cleanup; }- vzInitCaps(privconn->vzVersion, &privconn->vzCaps);+ vzInitCaps(driver->vzVersion, &driver->vzCaps); ret = 0;cleanup:@@ -473,10 +474,10 @@ vzCheckUnsupportedControllers(virDomainDefPtr def, vzCapabilitiesPtr vzCaps) return 0; }-int vzGetDefaultSCSIModel(vzConnPtr privconn,+int vzGetDefaultSCSIModel(vzDriverPtr driver, PRL_CLUSTERED_DEVICE_SUBTYPE *scsiModel) { - switch (privconn->vzCaps.scsiControllerModel) { + switch (driver->vzCaps.scsiControllerModel) { case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_SCSI: *scsiModel = PCD_VIRTIO_SCSI; break; @@ -487,7 +488,7 @@ int vzGetDefaultSCSIModel(vzConnPtr privconn, virReportError(VIR_ERR_INTERNAL_ERROR, _("Unknown SCSI controller model %s"), virDomainControllerModelSCSITypeToString( - privconn->vzCaps.scsiControllerModel)); + driver->vzCaps.scsiControllerModel)); return -1; } return 0; diff --git a/src/vz/vz_utils.h b/src/vz/vz_utils.h index b415b0f..ce2fd92 100644 --- a/src/vz/vz_utils.h +++ b/src/vz/vz_utils.h @@ -60,8 +60,8 @@ struct _vzCapabilities { typedef struct _vzCapabilities vzCapabilities; typedef struct _vzCapabilities *vzCapabilitiesPtr;-struct _vzConn {- virMutex lock; +struct _vzDriver { + virObjectLockable parent;/* Immutable pointer, self-locking APIs */virDomainObjListPtr domains; @@ -76,9 +76,21 @@ struct _vzConn { vzCapabilities vzCaps; };you need to remove virConnectCloseCallbackDataPtr field from driver
ok
+typedef struct _vzDriver vzDriver;+typedef struct _vzDriver *vzDriverPtr; + +struct _vzConn { + struct _vzConn* next; + + vzDriverPtr driver; + /* Immutable pointer, self-locking APIs */ + virConnectCloseCallbackDataPtr closeCallback; +}; + typedef struct _vzConn vzConn; typedef struct _vzConn *vzConnPtr;+struct _vzCountersCache { PRL_HANDLE stats; virCond cond; @@ -105,12 +117,19 @@ char * vzGetOutput(const char *binary, ...) ATTRIBUTE_NONNULL(1) ATTRIBUTE_SENTINEL; void vzDriverLock(vzConnPtr driver); void vzDriverUnlock(vzConnPtr driver); + +vzDriverPtr +vzGetDriverConnection(void); + +void +vzDestroyDriverConnection(void); + virDomainObjPtr -vzNewDomain(vzConnPtr privconn, +vzNewDomain(vzDriverPtr driver, char *name, const unsigned char *uuid); int -vzInitVersion(vzConnPtr privconn); +vzInitVersion(vzDriverPtr driver); int vzCheckUnsupportedDisks(virDomainDefPtr def, vzCapabilitiesPtr vzCaps); @@ -118,7 +137,7 @@ int vzCheckUnsupportedControllers(virDomainDefPtr def, vzCapabilitiesPtr vzCaps); int -vzGetDefaultSCSIModel(vzConnPtr privconn, +vzGetDefaultSCSIModel(vzDriverPtr driver, PRL_CLUSTERED_DEVICE_SUBTYPE *scsiModel);# define PARALLELS_BLOCK_STATS_FOREACH(OP) \
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list