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(a)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