From 660418cff4a07cbc184886a7a7537273ff9cd3c0 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Fri, 21 Nov 2008 10:22:58 +0000 Subject: [PATCH] Misc fixes to event registration failure cases --- ChangeLog | 7 +++++++ src/remote_internal.c | 15 +++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0fa64ddb85..84b302bd9f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Fri Nov 21 10:20:14 BST 2008 Daniel P. Berrange + + * src/remote_internal.c: Return VIR_NO_SUPPORT if requested + to register event callbacks when no eventloop is present. + Deal with failure to register handles/timers correctly. + (David Lively) + Fri Nov 21 10:14:14 BST 2008 Daniel P. Berrange Fix crash due to failure to unregister event callbacks on diff --git a/src/remote_internal.c b/src/remote_internal.c index 21f716d3db..508325afc8 100644 --- a/src/remote_internal.c +++ b/src/remote_internal.c @@ -773,6 +773,7 @@ doRemoteOpen (virConnectPtr conn, conn, NULL)) < 0) { DEBUG0("virEventAddTimeout failed: No addTimeoutImpl defined. " "continuing without events."); + virEventRemoveHandle(priv->watch); } } /* Successful. */ @@ -1211,10 +1212,12 @@ doRemoteClose (virConnectPtr conn, struct private_data *priv) (xdrproc_t) xdr_void, (char *) NULL) == -1) return -1; - /* Remove handle for remote events */ - virEventRemoveHandle(priv->sock); - /* Remove timout */ - virEventRemoveTimeout(priv->eventFlushTimer); + if (priv->eventFlushTimer >= 0) { + /* Remove timeout */ + virEventRemoveTimeout(priv->eventFlushTimer); + /* Remove handle for remote events */ + virEventRemoveHandle(priv->watch); + } /* Close socket. */ if (priv->uses_tls && priv->session) { @@ -4483,6 +4486,10 @@ static int remoteDomainEventRegister (virConnectPtr conn, { struct private_data *priv = conn->privateData; + if (priv->eventFlushTimer < 0) { + error (conn, VIR_ERR_NO_SUPPORT, _("no event support")); + return -1; + } if (virDomainEventCallbackListAdd(conn, priv->callbackList, callback, opaque, freecb) < 0) { error (conn, VIR_ERR_RPC, _("adding cb to list"));