mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-10-05 22:05:47 +00:00
close callback: move it to driver
Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
This commit is contained in:
parent
bb5827950e
commit
88f09b75eb
@ -118,22 +118,10 @@ VIR_ONCE_GLOBAL_INIT(virDataTypes)
|
|||||||
virConnectPtr
|
virConnectPtr
|
||||||
virGetConnect(void)
|
virGetConnect(void)
|
||||||
{
|
{
|
||||||
virConnectPtr ret;
|
|
||||||
|
|
||||||
if (virDataTypesInitialize() < 0)
|
if (virDataTypesInitialize() < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (!(ret = virObjectLockableNew(virConnectClass)))
|
return virObjectLockableNew(virConnectClass);
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (!(ret->closeCallback = virObjectLockableNew(virConnectCloseCallbackDataClass)))
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
error:
|
|
||||||
virObjectUnref(ret);
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -154,14 +142,6 @@ virConnectDispose(void *obj)
|
|||||||
virResetError(&conn->err);
|
virResetError(&conn->err);
|
||||||
|
|
||||||
virURIFree(conn->uri);
|
virURIFree(conn->uri);
|
||||||
|
|
||||||
if (conn->closeCallback) {
|
|
||||||
virObjectLock(conn->closeCallback);
|
|
||||||
conn->closeCallback->callback = NULL;
|
|
||||||
virObjectUnlock(conn->closeCallback);
|
|
||||||
|
|
||||||
virObjectUnref(conn->closeCallback);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -189,6 +169,15 @@ virConnectCloseCallbackDataDispose(void *obj)
|
|||||||
virConnectCloseCallbackDataReset(obj);
|
virConnectCloseCallbackDataReset(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virConnectCloseCallbackDataPtr
|
||||||
|
virNewConnectCloseCallbackData(void)
|
||||||
|
{
|
||||||
|
if (virDataTypesInitialize() < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return virObjectLockableNew(virConnectCloseCallbackDataClass);
|
||||||
|
}
|
||||||
|
|
||||||
void virConnectCloseCallbackDataRegister(virConnectCloseCallbackDataPtr close,
|
void virConnectCloseCallbackDataRegister(virConnectCloseCallbackDataPtr close,
|
||||||
virConnectPtr conn,
|
virConnectPtr conn,
|
||||||
virConnectCloseFunc cb,
|
virConnectCloseFunc cb,
|
||||||
|
@ -421,9 +421,6 @@ struct _virConnect {
|
|||||||
virError err; /* the last error */
|
virError err; /* the last error */
|
||||||
virErrorFunc handler; /* associated handler */
|
virErrorFunc handler; /* associated handler */
|
||||||
void *userData; /* the user data */
|
void *userData; /* the user data */
|
||||||
|
|
||||||
/* Per-connection close callback */
|
|
||||||
virConnectCloseCallbackDataPtr closeCallback;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -640,6 +637,7 @@ virAdmConnectPtr virAdmConnectNew(void);
|
|||||||
virAdmServerPtr virAdmGetServer(virAdmConnectPtr conn,
|
virAdmServerPtr virAdmGetServer(virAdmConnectPtr conn,
|
||||||
const char *name);
|
const char *name);
|
||||||
|
|
||||||
|
virConnectCloseCallbackDataPtr virNewConnectCloseCallbackData(void);
|
||||||
void virConnectCloseCallbackDataRegister(virConnectCloseCallbackDataPtr close,
|
void virConnectCloseCallbackDataRegister(virConnectCloseCallbackDataPtr close,
|
||||||
virConnectPtr conn,
|
virConnectPtr conn,
|
||||||
virConnectCloseFunc cb,
|
virConnectCloseFunc cb,
|
||||||
|
@ -1212,6 +1212,16 @@ typedef int
|
|||||||
const char *password,
|
const char *password,
|
||||||
unsigned int flags);
|
unsigned int flags);
|
||||||
|
|
||||||
|
typedef int
|
||||||
|
(*virDrvConnectRegisterCloseCallback)(virConnectPtr conn,
|
||||||
|
virConnectCloseFunc cb,
|
||||||
|
void *opaque,
|
||||||
|
virFreeCallback freecb);
|
||||||
|
|
||||||
|
typedef int
|
||||||
|
(*virDrvConnectUnregisterCloseCallback)(virConnectPtr conn,
|
||||||
|
virConnectCloseFunc cb);
|
||||||
|
|
||||||
typedef struct _virHypervisorDriver virHypervisorDriver;
|
typedef struct _virHypervisorDriver virHypervisorDriver;
|
||||||
typedef virHypervisorDriver *virHypervisorDriverPtr;
|
typedef virHypervisorDriver *virHypervisorDriverPtr;
|
||||||
|
|
||||||
@ -1443,6 +1453,8 @@ struct _virHypervisorDriver {
|
|||||||
virDrvDomainGetFSInfo domainGetFSInfo;
|
virDrvDomainGetFSInfo domainGetFSInfo;
|
||||||
virDrvDomainInterfaceAddresses domainInterfaceAddresses;
|
virDrvDomainInterfaceAddresses domainInterfaceAddresses;
|
||||||
virDrvDomainSetUserPassword domainSetUserPassword;
|
virDrvDomainSetUserPassword domainSetUserPassword;
|
||||||
|
virDrvConnectRegisterCloseCallback connectRegisterCloseCallback;
|
||||||
|
virDrvConnectUnregisterCloseCallback connectUnregisterCloseCallback;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -1217,14 +1217,9 @@ virConnectRegisterCloseCallback(virConnectPtr conn,
|
|||||||
virCheckConnectReturn(conn, -1);
|
virCheckConnectReturn(conn, -1);
|
||||||
virCheckNonNullArgGoto(cb, error);
|
virCheckNonNullArgGoto(cb, error);
|
||||||
|
|
||||||
if (virConnectCloseCallbackDataGetCallback(conn->closeCallback) != NULL) {
|
if (conn->driver->connectRegisterCloseCallback &&
|
||||||
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
|
conn->driver->connectRegisterCloseCallback(conn, cb, opaque, freecb) < 0)
|
||||||
_("A close callback is already registered"));
|
|
||||||
goto error;
|
goto error;
|
||||||
}
|
|
||||||
|
|
||||||
virConnectCloseCallbackDataRegister(conn->closeCallback, conn, cb,
|
|
||||||
opaque, freecb);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -1257,13 +1252,9 @@ virConnectUnregisterCloseCallback(virConnectPtr conn,
|
|||||||
virCheckConnectReturn(conn, -1);
|
virCheckConnectReturn(conn, -1);
|
||||||
virCheckNonNullArgGoto(cb, error);
|
virCheckNonNullArgGoto(cb, error);
|
||||||
|
|
||||||
if (virConnectCloseCallbackDataGetCallback(conn->closeCallback) != cb) {
|
if (conn->driver->connectUnregisterCloseCallback &&
|
||||||
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
|
conn->driver->connectUnregisterCloseCallback(conn, cb) < 0)
|
||||||
_("A different callback was requested"));
|
|
||||||
goto error;
|
goto error;
|
||||||
}
|
|
||||||
|
|
||||||
virConnectCloseCallbackDataUnregister(conn->closeCallback, cb);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -96,6 +96,7 @@ struct private_data {
|
|||||||
bool serverEventFilter; /* Does server support modern event filtering */
|
bool serverEventFilter; /* Does server support modern event filtering */
|
||||||
|
|
||||||
virObjectEventStatePtr eventState;
|
virObjectEventStatePtr eventState;
|
||||||
|
virConnectCloseCallbackDataPtr closeCallback;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@ -963,11 +964,13 @@ doRemoteOpen(virConnectPtr conn,
|
|||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
virObjectRef(conn->closeCallback);
|
if (!(priv->closeCallback = virNewConnectCloseCallbackData()))
|
||||||
|
goto failed;
|
||||||
|
// ref on behalf of netclient
|
||||||
|
virObjectRef(priv->closeCallback);
|
||||||
virNetClientSetCloseCallback(priv->client,
|
virNetClientSetCloseCallback(priv->client,
|
||||||
remoteClientCloseFunc,
|
remoteClientCloseFunc,
|
||||||
conn->closeCallback, virObjectFreeCallback);
|
priv->closeCallback, virObjectFreeCallback);
|
||||||
|
|
||||||
if (!(priv->remoteProgram = virNetClientProgramNew(REMOTE_PROGRAM,
|
if (!(priv->remoteProgram = virNetClientProgramNew(REMOTE_PROGRAM,
|
||||||
REMOTE_PROTOCOL_VERSION,
|
REMOTE_PROTOCOL_VERSION,
|
||||||
@ -1097,6 +1100,8 @@ doRemoteOpen(virConnectPtr conn,
|
|||||||
virNetClientClose(priv->client);
|
virNetClientClose(priv->client);
|
||||||
virObjectUnref(priv->client);
|
virObjectUnref(priv->client);
|
||||||
priv->client = NULL;
|
priv->client = NULL;
|
||||||
|
virObjectUnref(priv->closeCallback);
|
||||||
|
priv->closeCallback = NULL;
|
||||||
#ifdef WITH_GNUTLS
|
#ifdef WITH_GNUTLS
|
||||||
virObjectUnref(priv->tls);
|
virObjectUnref(priv->tls);
|
||||||
priv->tls = NULL;
|
priv->tls = NULL;
|
||||||
@ -1229,11 +1234,13 @@ doRemoteClose(virConnectPtr conn, struct private_data *priv)
|
|||||||
|
|
||||||
virNetClientSetCloseCallback(priv->client,
|
virNetClientSetCloseCallback(priv->client,
|
||||||
NULL,
|
NULL,
|
||||||
conn->closeCallback, virObjectFreeCallback);
|
priv->closeCallback, virObjectFreeCallback);
|
||||||
|
|
||||||
virNetClientClose(priv->client);
|
virNetClientClose(priv->client);
|
||||||
virObjectUnref(priv->client);
|
virObjectUnref(priv->client);
|
||||||
priv->client = NULL;
|
priv->client = NULL;
|
||||||
|
virObjectUnref(priv->closeCallback);
|
||||||
|
priv->closeCallback = NULL;
|
||||||
virObjectUnref(priv->remoteProgram);
|
virObjectUnref(priv->remoteProgram);
|
||||||
virObjectUnref(priv->lxcProgram);
|
virObjectUnref(priv->lxcProgram);
|
||||||
virObjectUnref(priv->qemuProgram);
|
virObjectUnref(priv->qemuProgram);
|
||||||
@ -7887,6 +7894,56 @@ remoteDomainInterfaceAddresses(virDomainPtr dom,
|
|||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
remoteConnectRegisterCloseCallback(virConnectPtr conn,
|
||||||
|
virConnectCloseFunc cb,
|
||||||
|
void *opaque,
|
||||||
|
virFreeCallback freecb)
|
||||||
|
{
|
||||||
|
struct private_data *priv = conn->privateData;
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
remoteDriverLock(priv);
|
||||||
|
|
||||||
|
if (virConnectCloseCallbackDataGetCallback(priv->closeCallback) != NULL) {
|
||||||
|
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
|
||||||
|
_("A close callback is already registered"));
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
virConnectCloseCallbackDataRegister(priv->closeCallback, conn, cb,
|
||||||
|
opaque, freecb);
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
remoteDriverUnlock(priv);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
remoteConnectUnregisterCloseCallback(virConnectPtr conn,
|
||||||
|
virConnectCloseFunc cb)
|
||||||
|
{
|
||||||
|
struct private_data *priv = conn->privateData;
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
remoteDriverLock(priv);
|
||||||
|
|
||||||
|
if (virConnectCloseCallbackDataGetCallback(priv->closeCallback) != cb) {
|
||||||
|
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
|
||||||
|
_("A different callback was requested"));
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
virConnectCloseCallbackDataUnregister(priv->closeCallback, cb);
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
remoteDriverUnlock(priv);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
remoteDomainRename(virDomainPtr dom, const char *new_name, unsigned int flags)
|
remoteDomainRename(virDomainPtr dom, const char *new_name, unsigned int flags)
|
||||||
@ -8279,6 +8336,8 @@ static virHypervisorDriver hypervisor_driver = {
|
|||||||
.domainInterfaceAddresses = remoteDomainInterfaceAddresses, /* 1.2.14 */
|
.domainInterfaceAddresses = remoteDomainInterfaceAddresses, /* 1.2.14 */
|
||||||
.domainSetUserPassword = remoteDomainSetUserPassword, /* 1.2.16 */
|
.domainSetUserPassword = remoteDomainSetUserPassword, /* 1.2.16 */
|
||||||
.domainRename = remoteDomainRename, /* 1.2.19 */
|
.domainRename = remoteDomainRename, /* 1.2.19 */
|
||||||
|
.connectRegisterCloseCallback = remoteConnectRegisterCloseCallback, /* 1.3.2 */
|
||||||
|
.connectUnregisterCloseCallback = remoteConnectUnregisterCloseCallback, /* 1.3.2 */
|
||||||
};
|
};
|
||||||
|
|
||||||
static virNetworkDriver network_driver = {
|
static virNetworkDriver network_driver = {
|
||||||
|
Loading…
Reference in New Issue
Block a user