On 07/19/2012 09:04 AM, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange(a)redhat.com>
Define a new virConnectSetCloseCallback() public API which allows
registering a callback to be invoked when the connection to a
hypervisor is closed. The callback is provided with the reason for
the close, which may be 'error', 'eof' or 'keepalive'.
Signed-off-by: Daniel P. Berrange <berrange(a)redhat.com>
---
include/libvirt/libvirt.h.in | 40 +++++++++++++++++++++++--------
src/datatypes.c | 4 ++++
src/datatypes.h | 5 ++++
src/libvirt.c | 53 ++++++++++++++++++++++++++++++++++++++++++
src/libvirt_public.syms | 6 +++++
5 files changed, 98 insertions(+), 10 deletions(-)
+typedef enum {
+ VIR_CONNECT_CLOSE_REASON_ERROR = 1, /* Misc I/O error */
Any reason you skipped 0? It will make wrapping this in a VIR_ENUM harder.
+int virConnectSetCloseCallback(virConnectPtr conn,
+ virConnectCloseFunc cb,
+ void *opaque,
+ virFreeCallback freecb);
Do we want a 'flags' argument?
+++ b/src/datatypes.c
@@ -115,6 +115,10 @@ virReleaseConnect(virConnectPtr conn) {
virMutexLock(&conn->lock);
+ if (conn->closeOpaque &&
NACK to this half of the condition. A client should be allowed to pass
NULL as their opaque data.
+int virConnectSetCloseCallback(virConnectPtr conn,
+ virConnectCloseFunc cb,
+ void *opaque,
+ virFreeCallback freecb)
+{
+ VIR_DEBUG("conn=%p", conn);
+
+ virResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(VIR_ERR_INVALID_CONN, __FUNCTION__);
+ virDispatchError(NULL);
+ return -1;
+ }
+
+ virMutexLock(&conn->lock);
+
+ if (conn->closeOpaque &&
+ conn->closeFreeCallback)
+ conn->closeFreeCallback(conn->closeOpaque);
Again, no need to check closeOpaque, NULL is valid there.
+
+ conn->closeCallback = cb;
+ conn->closeOpaque = opaque;
+ conn->closeFreeCallback = freecb;
So the user can call this as many times as they want to override or
uninstall an existing registered callback? I guess that works.
ACK, once you allow a NULL opaque pointer, and answer why a flags is not
useful (or else add a flags).
--
Eric Blake eblake(a)redhat.com +1-919-301-3266
Libvirt virtualization library
http://libvirt.org