[libvirt] [PATCHv3 03/10] threshold: new event object for tracking write threshold

Eric Blake eblake at redhat.com
Mon Jun 22 23:06:39 UTC 2015


Common code for tracking a write threshold event from creation
to delivery through a callback.

* src/conf/domain_event.c (_virDomainEventWriteThreshold): New
struct.
(virDomainEventsOnceInit, virDomainEventWriteThresholdDispose)
(virDomainEventWriteThresholdNew)
(virDomainEventWriteThresholdNewFromObj)
(virDomainEventWriteThresholdNewFromDom)
(virDomainEventDispatchDefaultFunc): Wire it up.
* src/conf/domain_event.h: Expose new functions.
* src/libvirt-private.syms (domain_event.h): Export them.

Signed-off-by: Eric Blake <eblake at redhat.com>
---
 src/conf/domain_event.c  | 99 +++++++++++++++++++++++++++++++++++++++++++++++-
 src/conf/domain_event.h  | 16 +++++++-
 src/libvirt_private.syms |  2 +
 3 files changed, 115 insertions(+), 2 deletions(-)

diff --git a/src/conf/domain_event.c b/src/conf/domain_event.c
index c43799f..400cfa0 100644
--- a/src/conf/domain_event.c
+++ b/src/conf/domain_event.c
@@ -56,6 +56,7 @@ static virClassPtr virDomainQemuMonitorEventClass;
 static virClassPtr virDomainEventTunableClass;
 static virClassPtr virDomainEventAgentLifecycleClass;
 static virClassPtr virDomainEventDeviceAddedClass;
+static virClassPtr virDomainEventWriteThresholdClass;


 static void virDomainEventDispose(void *obj);
@@ -74,6 +75,7 @@ static void virDomainQemuMonitorEventDispose(void *obj);
 static void virDomainEventTunableDispose(void *obj);
 static void virDomainEventAgentLifecycleDispose(void *obj);
 static void virDomainEventDeviceAddedDispose(void *obj);
+static void virDomainEventWriteThresholdDispose(void *obj);

 static void
 virDomainEventDispatchDefaultFunc(virConnectPtr conn,
@@ -236,6 +238,17 @@ struct _virDomainEventAgentLifecycle {
 typedef struct _virDomainEventAgentLifecycle virDomainEventAgentLifecycle;
 typedef virDomainEventAgentLifecycle *virDomainEventAgentLifecyclePtr;

+struct _virDomainEventWriteThreshold {
+    virDomainEvent parent;
+
+    char *disk;
+    char *path;
+    unsigned long long threshold;
+    unsigned long long length;
+};
+typedef struct _virDomainEventWriteThreshold virDomainEventWriteThreshold;
+typedef virDomainEventWriteThreshold *virDomainEventWriteThresholdPtr;
+

 static int
 virDomainEventsOnceInit(void)
@@ -336,6 +349,12 @@ virDomainEventsOnceInit(void)
                       sizeof(virDomainEventAgentLifecycle),
                       virDomainEventAgentLifecycleDispose)))
         return -1;
+    if (!(virDomainEventWriteThresholdClass =
+          virClassNew(virDomainEventClass,
+                      "virDomainEventWriteThreshold",
+                      sizeof(virDomainEventWriteThreshold),
+                      virDomainEventWriteThresholdDispose)))
+        return -1;
     return 0;
 }

@@ -496,6 +515,16 @@ virDomainEventAgentLifecycleDispose(void *obj)
     VIR_DEBUG("obj=%p", event);
 };

+static void
+virDomainEventWriteThresholdDispose(void *obj)
+{
+    virDomainEventWriteThresholdPtr event = obj;
+    VIR_DEBUG("obj=%p", event);
+
+    VIR_FREE(event->disk);
+    VIR_FREE(event->path);
+};
+

 static void *
 virDomainEventNew(virClassPtr klass,
@@ -1390,6 +1419,62 @@ virDomainEventTunableNewFromDom(virDomainPtr dom,
                                     nparams);
 }

+static virObjectEventPtr
+virDomainEventWriteThresholdNew(int id,
+                                const char *name,
+                                unsigned char *uuid,
+                                const char *disk,
+                                const char *path,
+                                unsigned long long threshold,
+                                unsigned long long length)
+{
+    virDomainEventWriteThresholdPtr ev;
+
+    if (virDomainEventsInitialize() < 0)
+        return NULL;
+
+    if (!(ev = virDomainEventNew(virDomainEventWriteThresholdClass,
+                                 VIR_DOMAIN_EVENT_ID_WRITE_THRESHOLD,
+                                 id, name, uuid)))
+        return NULL;
+
+    if (VIR_STRDUP(ev->disk, disk) < 0)
+        goto error;
+    if (VIR_STRDUP(ev->path, path) < 0)
+        goto error;
+    ev->threshold = threshold;
+    ev->length = length;
+
+    return (virObjectEventPtr)ev;
+
+ error:
+    virObjectUnref(ev);
+    return NULL;
+}
+
+virObjectEventPtr
+virDomainEventWriteThresholdNewFromObj(virDomainObjPtr obj,
+                                       const char *disk,
+                                       const char *path,
+                                       unsigned long long threshold,
+                                       unsigned long long length)
+{
+    return virDomainEventWriteThresholdNew(obj->def->id, obj->def->name,
+                                           obj->def->uuid, disk, path,
+                                           threshold, length);
+}
+
+virObjectEventPtr
+virDomainEventWriteThresholdNewFromDom(virDomainPtr dom,
+                                       const char *disk,
+                                       const char *path,
+                                       unsigned long long threshold,
+                                       unsigned long long length)
+{
+    return virDomainEventWriteThresholdNew(dom->id, dom->name, dom->uuid,
+                                           disk, path, threshold, length);
+}
+

 static void
 virDomainEventDispatchDefaultFunc(virConnectPtr conn,
@@ -1615,7 +1700,19 @@ virDomainEventDispatchDefaultFunc(virConnectPtr conn,
         }

     case VIR_DOMAIN_EVENT_ID_WRITE_THRESHOLD:
-        /* TODO: Implement RPC support for this */
+        {
+            virDomainEventWriteThresholdPtr ev;
+
+            ev = (virDomainEventWriteThresholdPtr)event;
+            ((virConnectDomainEventWriteThresholdCallback)cb)(conn, dom,
+                                                              ev->disk,
+                                                              ev->path,
+                                                              ev->threshold,
+                                                              ev->length,
+                                                              cbopaque);
+            goto cleanup;
+        }
+
     case VIR_DOMAIN_EVENT_ID_LAST:
         break;
     }
diff --git a/src/conf/domain_event.h b/src/conf/domain_event.h
index afbed89..6e31e3e 100644
--- a/src/conf/domain_event.h
+++ b/src/conf/domain_event.h
@@ -1,7 +1,7 @@
 /*
  * domain_event.h: domain event queue processing helpers
  *
- * Copyright (C) 2012-2014 Red Hat, Inc.
+ * Copyright (C) 2012-2015 Red Hat, Inc.
  * Copyright (C) 2008 VirtualIron
  * Copyright (C) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany.
  *
@@ -209,6 +209,20 @@ virDomainEventAgentLifecycleNewFromDom(virDomainPtr dom,
                                        int state,
                                        int reason);

+virObjectEventPtr
+virDomainEventWriteThresholdNewFromObj(virDomainObjPtr obj,
+                                       const char *disk,
+                                       const char *path,
+                                       unsigned long long threshold,
+                                       unsigned long long length);
+virObjectEventPtr
+virDomainEventWriteThresholdNewFromDom(virDomainPtr dom,
+                                       const char *disk,
+                                       const char *path,
+                                       unsigned long long threshold,
+                                       unsigned long long length);
+
+
 int
 virDomainEventStateRegister(virConnectPtr conn,
                             virObjectEventStatePtr state,
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 1566d11..bd16860 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -541,6 +541,8 @@ virDomainEventTunableNewFromDom;
 virDomainEventTunableNewFromObj;
 virDomainEventWatchdogNewFromDom;
 virDomainEventWatchdogNewFromObj;
+virDomainEventWriteThresholdNewFromDom;
+virDomainEventWriteThresholdNewFromObj;
 virDomainQemuMonitorEventNew;
 virDomainQemuMonitorEventStateRegisterID;

-- 
2.4.3




More information about the libvir-list mailing list