diff --git a/src/admin/admin_remote.c b/src/admin/admin_remote.c index 10a3b18b00..f37ff5e8b8 100644 --- a/src/admin/admin_remote.c +++ b/src/admin/admin_remote.c @@ -144,11 +144,7 @@ remoteAdminClientCloseFunc(virNetClientPtr client ATTRIBUTE_UNUSED, VIR_DEBUG("Triggering connection close callback %p reason=%d, opaque=%p", cbdata->callback, reason, cbdata->opaque); cbdata->callback(cbdata->conn, reason, cbdata->opaque); - - if (cbdata->freeCallback) - cbdata->freeCallback(cbdata->opaque); - cbdata->callback = NULL; - cbdata->freeCallback = NULL; + virAdmConnectCloseCallbackDataReset(cbdata); } virObjectUnlock(cbdata); } diff --git a/src/datatypes.c b/src/datatypes.c index 24e4f776a0..c8a46b0f31 100644 --- a/src/datatypes.c +++ b/src/datatypes.c @@ -928,10 +928,7 @@ virAdmConnectCloseCallbackDataDispose(void *obj) virAdmConnectCloseCallbackDataPtr cb_data = obj; virObjectLock(cb_data); - - if (cb_data->freeCallback) - cb_data->freeCallback(cb_data->opaque); - + virAdmConnectCloseCallbackDataReset(cb_data); virObjectUnlock(cb_data); } diff --git a/src/libvirt-admin.c b/src/libvirt-admin.c index 1b5fd443d6..8877e499ec 100644 --- a/src/libvirt-admin.c +++ b/src/libvirt-admin.c @@ -513,29 +513,13 @@ int virAdmConnectUnregisterCloseCallback(virAdmConnectPtr conn, virResetLastError(); virCheckAdmConnectReturn(conn, -1); - - virObjectLock(conn->closeCallback); - virCheckNonNullArgGoto(cb, error); - if (conn->closeCallback->callback != cb) { - virReportError(VIR_ERR_OPERATION_INVALID, "%s", - _("A different callback was requested")); + if (virAdmConnectCloseCallbackDataUnregister(conn->closeCallback, cb) < 0) goto error; - } - - conn->closeCallback->callback = NULL; - if (conn->closeCallback->freeCallback) - conn->closeCallback->freeCallback(conn->closeCallback->opaque); - conn->closeCallback->freeCallback = NULL; - - virObjectUnlock(conn->closeCallback); - virObjectUnref(conn); return 0; - error: - virObjectUnlock(conn->closeCallback); virDispatchError(NULL); return -1; }