This allows event implementations to match on something other
than an object's uuid, like nodedev or interface objects which
don't have a uuid.
---
src/conf/domain_event.c | 11 +++++++++--
src/conf/network_event.c | 4 +++-
src/conf/object_event.c | 23 +++++++++++------------
src/conf/object_event_private.h | 6 ++++--
src/conf/storage_event.c | 4 +++-
5 files changed, 30 insertions(+), 18 deletions(-)
diff --git a/src/conf/domain_event.c b/src/conf/domain_event.c
index 7ad6d2c..63ae9e1 100644
--- a/src/conf/domain_event.c
+++ b/src/conf/domain_event.c
@@ -581,6 +581,7 @@ virDomainEventNew(virClassPtr klass,
const unsigned char *uuid)
{
virDomainEventPtr event;
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
if (virDomainEventsInitialize() < 0)
return NULL;
@@ -592,10 +593,14 @@ virDomainEventNew(virClassPtr klass,
return NULL;
}
+ /* We use uuid for matching key. We ignore 'name' because
+ * Xen sometimes renames guests during migration, thus
+ * 'uuid' is the only truly reliable key we can use. */
+ virUUIDFormat(uuid, uuidstr);
if (!(event = virObjectEventNew(klass,
virDomainEventDispatchDefaultFunc,
eventID,
- id, name, uuid)))
+ id, name, uuid, uuidstr)))
return NULL;
return (virObjectEventPtr)event;
@@ -1873,13 +1878,15 @@ virDomainQemuMonitorEventNew(int id,
const char *details)
{
virDomainQemuMonitorEventPtr ev;
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
if (virDomainEventsInitialize() < 0)
return NULL;
+ virUUIDFormat(uuid, uuidstr);
if (!(ev = virObjectEventNew(virDomainQemuMonitorEventClass,
virDomainQemuMonitorEventDispatchFunc,
- 0, id, name, uuid)))
+ 0, id, name, uuid, uuidstr)))
return NULL;
/* event is mandatory, details are optional */
diff --git a/src/conf/network_event.c b/src/conf/network_event.c
index 21f6db1..e0d1a3d 100644
--- a/src/conf/network_event.c
+++ b/src/conf/network_event.c
@@ -226,14 +226,16 @@ virNetworkEventLifecycleNew(const char *name,
int detail)
{
virNetworkEventLifecyclePtr event;
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
if (virNetworkEventsInitialize() < 0)
return NULL;
+ virUUIDFormat(uuid, uuidstr);
if (!(event = virObjectEventNew(virNetworkEventLifecycleClass,
virNetworkEventDispatchDefaultFunc,
VIR_NETWORK_EVENT_ID_LIFECYCLE,
- 0, name, uuid)))
+ 0, name, uuid, uuidstr)))
return NULL;
event->type = type;
diff --git a/src/conf/object_event.c b/src/conf/object_event.c
index 8fd182d..5734230 100644
--- a/src/conf/object_event.c
+++ b/src/conf/object_event.c
@@ -123,6 +123,7 @@ virObjectEventDispose(void *obj)
VIR_DEBUG("obj=%p", event);
VIR_FREE(event->meta.name);
+ VIR_FREE(event->meta.key);
}
/**
@@ -619,6 +620,7 @@ virObjectEventStateNew(void)
* @id: id of the object the event describes, or 0
* @name: name of the object the event describes
* @uuid: uuid of the object the event describes
+ * @key: key for per-object filtering
*
* Create a new event, with the information common to all events.
*/
@@ -628,7 +630,8 @@ virObjectEventNew(virClassPtr klass,
int eventID,
int id,
const char *name,
- const unsigned char *uuid)
+ const unsigned char *uuid,
+ const char *key)
{
virObjectEventPtr event;
@@ -653,6 +656,11 @@ virObjectEventNew(virClassPtr klass,
VIR_FREE(event);
return NULL;
}
+ if (VIR_STRDUP(event->meta.key, key) < 0) {
+ VIR_FREE(event->meta.name);
+ VIR_FREE(event);
+ return NULL;
+ }
event->meta.id = id;
memcpy(event->meta.uuid, uuid, VIR_UUID_BUFLEN);
@@ -701,17 +709,8 @@ virObjectEventDispatchMatchCallback(virObjectEventPtr event,
if (cb->filter && !(cb->filter)(cb->conn, event,
cb->filter_opaque))
return false;
- if (cb->uuid_filter) {
- /* Deliberately ignoring 'id' for matching, since that
- * will cause problems when a domain switches between
- * running & shutoff states & ignoring 'name' since
- * Xen sometimes renames guests during migration, thus
- * leaving 'uuid' as the only truly reliable ID we can use. */
- char uuidstr[VIR_UUID_STRING_BUFLEN];
- virUUIDFormat(event->meta.uuid, uuidstr);
-
- return STREQ(uuidstr, cb->uuid);
- }
+ if (cb->uuid_filter)
+ return STREQ(event->meta.key, cb->uuid);
return true;
}
diff --git a/src/conf/object_event_private.h b/src/conf/object_event_private.h
index cae74ef..95b2120 100644
--- a/src/conf/object_event_private.h
+++ b/src/conf/object_event_private.h
@@ -31,6 +31,7 @@ struct _virObjectMeta {
int id;
char *name;
unsigned char uuid[VIR_UUID_BUFLEN];
+ char *key;
};
typedef struct _virObjectMeta virObjectMeta;
typedef virObjectMeta *virObjectMetaPtr;
@@ -102,8 +103,9 @@ virObjectEventNew(virClassPtr klass,
int eventID,
int id,
const char *name,
- const unsigned char *uuid)
+ const unsigned char *uuid,
+ const char *key)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(5)
- ATTRIBUTE_NONNULL(6);
+ ATTRIBUTE_NONNULL(6) ATTRIBUTE_NONNULL(7);
#endif
diff --git a/src/conf/storage_event.c b/src/conf/storage_event.c
index de4f1ea..cb97c90 100644
--- a/src/conf/storage_event.c
+++ b/src/conf/storage_event.c
@@ -228,14 +228,16 @@ virStoragePoolEventLifecycleNew(const char *name,
int detail)
{
virStoragePoolEventLifecyclePtr event;
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
if (virStoragePoolEventsInitialize() < 0)
return NULL;
+ virUUIDFormat(uuid, uuidstr);
if (!(event = virObjectEventNew(virStoragePoolEventLifecycleClass,
virStoragePoolEventDispatchDefaultFunc,
VIR_STORAGE_POOL_EVENT_ID_LIFECYCLE,
- 0, name, uuid)))
+ 0, name, uuid, uuidstr)))
return NULL;
event->type = type;
--
2.7.4