summaryrefslogtreecommitdiff
path: root/src/libvirt-host.c
diff options
context:
space:
mode:
authorNikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>2016-02-17 15:14:54 +0300
committerDaniel P. Berrange <berrange@redhat.com>2016-03-01 14:16:56 +0000
commit24dbb69f214c8eae01241bee91ccd07027465628 (patch)
tree8945a5ccbcf63aea1db94fc2173ee707c962f80b /src/libvirt-host.c
parentff16bde100e19fbff17a964c08321f30f87afb22 (diff)
downloadlibvirt-24dbb69f214c8eae01241bee91ccd07027465628.tar.gz
factor out virConnectCloseCallbackDataPtr methods
Make register and unregister functions return void because we can check the state of callback object beforehand via virConnectCloseCallbackDataGetCallback. This can be done without race conditions if we use higher level locks for registering and unregistering. The fact they return void simplifies task of consistent registering/unregistering. Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
Diffstat (limited to 'src/libvirt-host.c')
-rw-r--r--src/libvirt-host.c29
1 files changed, 5 insertions, 24 deletions
diff --git a/src/libvirt-host.c b/src/libvirt-host.c
index 9c88426ec4..ced6a549a2 100644
--- a/src/libvirt-host.c
+++ b/src/libvirt-host.c
@@ -1216,35 +1216,25 @@ virConnectRegisterCloseCallback(virConnectPtr conn,
virResetLastError();
virCheckConnectReturn(conn, -1);
-
- virObjectRef(conn);
-
virObjectLock(conn);
- virObjectLock(conn->closeCallback);
virCheckNonNullArgGoto(cb, error);
- if (conn->closeCallback->callback) {
+ if (virConnectCloseCallbackDataGetCallback(conn->closeCallback) != NULL) {
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
_("A close callback is already registered"));
goto error;
}
- conn->closeCallback->conn = conn;
- conn->closeCallback->callback = cb;
- conn->closeCallback->opaque = opaque;
- conn->closeCallback->freeCallback = freecb;
+ virConnectCloseCallbackDataRegister(conn->closeCallback, conn, cb,
+ opaque, freecb);
- virObjectUnlock(conn->closeCallback);
virObjectUnlock(conn);
-
return 0;
error:
- virObjectUnlock(conn->closeCallback);
virObjectUnlock(conn);
virDispatchError(conn);
- virObjectUnref(conn);
return -1;
}
@@ -1271,31 +1261,22 @@ virConnectUnregisterCloseCallback(virConnectPtr conn,
virResetLastError();
virCheckConnectReturn(conn, -1);
-
virObjectLock(conn);
- virObjectLock(conn->closeCallback);
virCheckNonNullArgGoto(cb, error);
- if (conn->closeCallback->callback != cb) {
+ if (virConnectCloseCallbackDataGetCallback(conn->closeCallback) != cb) {
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
_("A different callback was requested"));
goto error;
}
- conn->closeCallback->callback = NULL;
- if (conn->closeCallback->freeCallback)
- conn->closeCallback->freeCallback(conn->closeCallback->opaque);
- conn->closeCallback->freeCallback = NULL;
+ virConnectCloseCallbackDataUnregister(conn->closeCallback, cb);
- virObjectUnlock(conn->closeCallback);
virObjectUnlock(conn);
- virObjectUnref(conn);
-
return 0;
error:
- virObjectUnlock(conn->closeCallback);
virObjectUnlock(conn);
virDispatchError(conn);
return -1;