[libvirt] [PATCH 4/8] domain_event: Add common domain event queue/flush helpers

Cole Robinson crobinso at redhat.com
Mon Jan 10 17:38:46 UTC 2011


The same code for queueing, flushing, and deregistering events exists
in multiple drivers, which will soon use these common functions.

Signed-off-by: Cole Robinson <crobinso at redhat.com>
---
 src/conf/domain_event.c |   74 ++++++++++++++++++++++++++++++++++++++++++++++-
 src/conf/domain_event.h |   17 +++++++++++
 2 files changed, 90 insertions(+), 1 deletions(-)

diff --git a/src/conf/domain_event.c b/src/conf/domain_event.c
index 4f0e4da..84f4709 100644
--- a/src/conf/domain_event.c
+++ b/src/conf/domain_event.c
@@ -579,7 +579,8 @@ virDomainEventStateNew(virEventTimeoutCallback timeout_cb,
                                            timeout_cb,
                                            timeout_opaque,
                                            timeout_free)) < 0) {
-        goto error;
+        DEBUG0("virEventAddTimeout failed: No addTimeoutImpl defined. "
+               "continuing without events.");
     }
 
     return state;
@@ -1048,3 +1049,74 @@ void virDomainEventQueueDispatch(virDomainEventQueuePtr queue,
     VIR_FREE(queue->events);
     queue->count = 0;
 }
+
+void
+virDomainEventStateQueue(virDomainEventStatePtr state,
+                         virDomainEventPtr event)
+{
+    if (state->timer < 0) {
+        virDomainEventFree(event);
+        return;
+    }
+
+    if (virDomainEventQueuePush(state->queue, event) < 0) {
+        DEBUG0("Error adding event to queue");
+        virDomainEventFree(event);
+    }
+
+    if (state->queue->count == 1)
+        virEventUpdateTimeout(state->timer, 0);
+}
+
+void
+virDomainEventStateFlush(virDomainEventStatePtr state,
+                         virDomainEventDispatchFunc dispatchFunc,
+                         void *opaque)
+{
+    virDomainEventQueue tempQueue;
+
+    state->isDispatching = 1;
+
+    /* Copy the queue, so we're reentrant safe when dispatchFunc drops the
+     * driver lock */
+    tempQueue.count = state->queue->count;
+    tempQueue.events = state->queue->events;
+    state->queue->count = 0;
+    state->queue->events = NULL;
+
+    virEventUpdateTimeout(state->timer, -1);
+    virDomainEventQueueDispatch(&tempQueue,
+                                state->callbacks,
+                                dispatchFunc,
+                                opaque);
+
+    /* Purge any deleted callbacks */
+    virDomainEventCallbackListPurgeMarked(state->callbacks);
+
+    state->isDispatching = 0;
+}
+
+int
+virDomainEventStateDeregister(virConnectPtr conn,
+                              virDomainEventStatePtr state,
+                              virConnectDomainEventCallback callback)
+{
+    if (state->isDispatching)
+        return virDomainEventCallbackListMarkDelete(conn,
+                                                    state->callbacks, callback);
+    else
+        return virDomainEventCallbackListRemove(conn, state->callbacks, callback);
+}
+
+int
+virDomainEventStateDeregisterAny(virConnectPtr conn,
+                                 virDomainEventStatePtr state,
+                                 int callbackID)
+{
+    if (state->isDispatching)
+        return virDomainEventCallbackListMarkDeleteID(conn,
+                                                      state->callbacks, callbackID);
+    else
+        return virDomainEventCallbackListRemoveID(conn,
+                                                  state->callbacks, callbackID);
+}
diff --git a/src/conf/domain_event.h b/src/conf/domain_event.h
index 98a2870..9893cf2 100644
--- a/src/conf/domain_event.h
+++ b/src/conf/domain_event.h
@@ -203,4 +203,21 @@ void virDomainEventQueueDispatch(virDomainEventQueuePtr queue,
                                  virDomainEventDispatchFunc dispatch,
                                  void *opaque);
 
+
+void
+virDomainEventStateQueue(virDomainEventStatePtr state,
+                         virDomainEventPtr event);
+void
+virDomainEventStateFlush(virDomainEventStatePtr state,
+                         virDomainEventDispatchFunc dispatchFunc,
+                         void *opaque);
+int
+virDomainEventStateDeregister(virConnectPtr conn,
+                              virDomainEventStatePtr state,
+                              virConnectDomainEventCallback callback);
+int
+virDomainEventStateDeregisterAny(virConnectPtr conn,
+                                 virDomainEventStatePtr state,
+                                 int callbackID);
+
 #endif
-- 
1.7.3.3




More information about the libvir-list mailing list