On 05/16/2012 08:35 AM, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange(a)redhat.com>
When the guest changes its memory balloon applications may want
to know what the new value is, without having to periodically
poll on XML / domain info. Introduce a "balloon change" event
to let apps see this
+++ b/daemon/remote.c
@@ -582,6 +582,32 @@ static int remoteRelayDomainEventPMSuspend(virConnectPtr conn
ATTRIBUTE_UNUSED,
return 0;
}
+static int remoteRelayDomainEventBalloonChange(virConnectPtr conn ATTRIBUTE_UNUSED,
Formatting nit: should the function name start on a new line, leaving
'static int' on a line of its own?
+ virDomainPtr dom,
+ unsigned long long actual,
+ void *opaque)
+{
+ virNetServerClientPtr client = opaque;
+ remote_domain_event_balloon_change_msg data;
+
+ if (!client)
+ return -1;
+
+ VIR_DEBUG("Relaying domain ballon change event %s %d %lld", dom->name,
dom->id, actual);
s/ballon/balloon/
+++ b/examples/domain-events/events-c/event-test.c
@@ -222,6 +222,25 @@ static int myDomainEventRTCChangeCallback(virConnectPtr conn
ATTRIBUTE_UNUSED,
return 0;
}
+static int myDomainEventBalloonChangeCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
+ virDomainPtr dom,
+ unsigned long long actual,
+ void *opaque ATTRIBUTE_UNUSED)
+{
+ char *str = NULL;
+ /* HACK: use asprintf since we have gnulib's wrapper for %lld on Win32
+ * but don't have a printf() replacement with %lld */
Yep, I can see why you did this. And since our example code can't use
virAsprintf (which is internal to libvirt, but our examples are supposed
to be standalone), we definitely need to keep this comment.
I'm a bit worried, though, that we are making this example harder than
necessary to use on BSD (that is, avoiding our virAsprintf wrapper but
then relying on our gnulib wrapper seems risky). Maybe we should do:
#ifdef WIN32
use printf("%I64d")
#else
use printf("%lld")
#endif
so that the example code is self-standing without asprintf.
I don't know which approach is worse, though, and at least your comment
should be sufficient to give someone a hint of how to work around things
on a system that lacks asprintf when trying to use the example code in a
standalone manner.
+++ b/include/libvirt/libvirt.h.in
@@ -3780,6 +3780,22 @@ typedef void
(*virConnectDomainEventPMSuspendCallback)(virConnectPtr conn,
int reason,
void *opaque);
+
+/**
+ * virConnectDomainEventBalloonChangeCallback:
+ * @conn: connection object
+ * @dom: domain on which the event occurred
+ * @actual: the new balloon level measured in kilobytes
s/kilobytes/kibibytes (blocks of 1024 bytes)/
At any rate, I agree with keeping this in blocks of 1024, to match our
XML for memory balloon sizing. If we had a time machine, I would have
designed that value in bytes instead; oh well.
+++ b/src/conf/domain_event.c
@@ -121,6 +121,9 @@ struct _virDomainEvent {
char *devAlias;
int reason;
} trayChange;
+ struct {
+ unsigned long long actual;
add a comment, documenting that this is in units of 1024 (otherwise, we
may end up with a future patch goofing and using bytes or megabytes
instead of kilobytes, and messing things up)
--
Eric Blake eblake(a)redhat.com +1-919-301-3266
Libvirt virtualization library
http://libvirt.org