On 21.08.2014 22:36, Dmitry Guryanov wrote:
Add files parallels_sdk.c and parallels_sdk.h for code
which works with SDK, so libvirt's code will not mix with
dealing with parallels SDK.
To use Parallels SDK you must first call PrlApi_InitEx function,
and then you will be able to connect to a server with
PrlSrv_LoginLocalEx function. When you've done you must call
PrlApi_Deinit. So let's call PrlApi_InitEx on first .connectOpen,
count number of connections and deinitialize, when this counter
becomes zero.
Signed-off-by: Dmitry Guryanov <dguryanov(a)parallels.com>
---
po/POTFILES.in | 1 +
src/Makefile.am | 4 +++-
src/parallels/parallels_driver.c | 46 +++++++++++++++++++++++++++++++++++++++-
src/parallels/parallels_utils.h | 3 +++
4 files changed, 52 insertions(+), 2 deletions(-)
This fails 'make syntax-check' for me.
diff --git a/po/POTFILES.in b/po/POTFILES.in
index f17b35f..4c1302d 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -96,6 +96,7 @@ src/openvz/openvz_driver.c
src/openvz/openvz_util.c
src/parallels/parallels_driver.c
src/parallels/parallels_network.c
+src/parallels/parallels_sdk.c
src/parallels/parallels_utils.c
src/parallels/parallels_utils.h
src/parallels/parallels_storage.c
diff --git a/src/Makefile.am b/src/Makefile.am
index dad7c7f..d4c6465 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -787,7 +787,9 @@ PARALLELS_DRIVER_SOURCES = \
parallels/parallels_utils.c \
parallels/parallels_utils.h \
parallels/parallels_storage.c \
- parallels/parallels_network.c
+ parallels/parallels_network.c \
+ parallels/parallels_sdk.h \
+ parallels/parallels_sdk.c
BHYVE_DRIVER_SOURCES = \
bhyve/bhyve_capabilities.c \
diff --git a/src/parallels/parallels_driver.c b/src/parallels/parallels_driver.c
index bb9538f..7dc9963 100644
--- a/src/parallels/parallels_driver.c
+++ b/src/parallels/parallels_driver.c
@@ -55,6 +55,7 @@
#include "parallels_driver.h"
#include "parallels_utils.h"
+#include "parallels_sdk.h"
#define VIR_FROM_THIS VIR_FROM_PARALLELS
@@ -73,6 +74,9 @@ VIR_LOG_INIT("parallels.parallels_driver");
#define IS_CT(def) (STREQ_NULLABLE(def->os.type, "exe"))
+unsigned int numConns = 0;
+virMutex numConnsLock;
1: ^^^
+
static int parallelsConnectClose(virConnectPtr conn);
static const char * parallelsGetDiskBusName(int bus) {
@@ -929,9 +933,25 @@ parallelsOpenDefault(virConnectPtr conn)
if (virMutexInit(&privconn->lock) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("cannot initialize mutex"));
- goto error;
+ goto err_free;
}
+ virMutexLock(&numConnsLock);
+ numConns++;
+
+ if (numConns == 1) {
+ if (prlsdkInit()) {
+ VIR_DEBUG("%s", _("Can't initialize Parallels
SDK"));
+ virMutexUnlock(&numConnsLock);
+ goto err_free;
+ }
+ }
+
+ virMutexUnlock(&numConnsLock);
+
+ if (prlsdkConnect(privconn) < 0)
+ goto err_free;
+
if (!(privconn->caps = parallelsBuildCapabilities()))
goto error;
@@ -953,6 +973,9 @@ parallelsOpenDefault(virConnectPtr conn)
virObjectUnref(privconn->domains);
virObjectUnref(privconn->caps);
virStoragePoolObjListFree(&privconn->pools);
+ prlsdkDisconnect(privconn);
+ prlsdkDeinit();
+ err_free:
VIR_FREE(privconn);
return VIR_DRV_OPEN_ERROR;
}
@@ -999,8 +1022,17 @@ parallelsConnectClose(virConnectPtr conn)
virObjectUnref(privconn->caps);
virObjectUnref(privconn->xmlopt);
virObjectUnref(privconn->domains);
+ prlsdkDisconnect(privconn);
conn->privateData = NULL;
+ virMutexLock(&numConnsLock);
+ numConns--;
+
+ if (numConns == 0)
+ prlsdkDeinit();
+
+ virMutexUnlock(&numConnsLock);
+
parallelsDriverUnlock(privconn);
virMutexDestroy(&privconn->lock);
@@ -2453,6 +2485,12 @@ static virDriver parallelsDriver = {
.connectIsAlive = parallelsConnectIsAlive, /* 1.2.5 */
};
+static virStateDriver parallelsStateDriver = {
+ .name = "parallels",
+ .stateInitialize = parallelsStateInitialize,
+ .stateCleanup = parallelsStateCleanup,
+};
+
This is not called (read registered) anywhere so the
state{Initialize,Cleanup} members are not gonna be called at all.
Moreover, if you intent to turn this into state driver, then the [1] are
good candidates to become members of some privateData struct of the
state driver.
/**
* parallelsRegister:
*
@@ -2471,6 +2509,12 @@ parallelsRegister(void)
VIR_FREE(prlctl_path);
+ if (virMutexInit(&numConnsLock) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("cannot initialize mutex"));
+ return 0;
+ }
+
if (virRegisterDriver(¶llelsDriver) < 0)
return -1;
if (parallelsStorageRegister())
diff --git a/src/parallels/parallels_utils.h b/src/parallels/parallels_utils.h
index 599e2c5..095c104 100644
--- a/src/parallels/parallels_utils.h
+++ b/src/parallels/parallels_utils.h
@@ -23,6 +23,8 @@
#ifndef PARALLELS_UTILS_H
# define PARALLELS_UTILS_H
+# include <Parallels.h>
+
# include "driver.h"
# include "conf/domain_conf.h"
# include "conf/storage_conf.h"
@@ -40,6 +42,7 @@
struct _parallelsConn {
virMutex lock;
virDomainObjListPtr domains;
+ PRL_HANDLE server;
virStoragePoolObjList pools;
virNetworkObjList networks;
virCapsPtr caps;
Michal