[libvirt] [PATCH 1/4] virsh: Refactor event printing
Jiri Denemark
jdenemar at redhat.com
Thu Jan 7 21:24:47 UTC 2016
On Mon, Dec 21, 2015 at 14:46:33 +0100, Andrea Bolognani wrote:
> n Mon, 2015-12-21 at 11:04 +0100, Jiri Denemark wrote:
> > To reduce code duplication.
> >
> > Signed-off-by: Jiri Denemark <jdenemar at redhat.com>
> > ---
> > tools/virsh-domain.c | 293 ++++++++++++++++++++++++---------------------------
> > 1 file changed, 136 insertions(+), 157 deletions(-)
>
> Really nice cleanup, looks good overall.
>
> A couple of comments below.
>
> > static void
> > -virshEventPrint(virConnectPtr conn ATTRIBUTE_UNUSED, virDomainPtr dom,
> > - const char *event, long long seconds, unsigned int micros,
> > - const char *details, void *opaque)
> > +virshEventQemuPrint(virConnectPtr conn ATTRIBUTE_UNUSED,
> > + virDomainPtr dom,
> > + const char *event,
> > + long long seconds,
> > + unsigned int micros,
> > + const char *details,
> > + void *opaque)
> > {
> > virshQemuEventData *data = opaque;
> > virJSONValuePtr pretty = NULL;
>
> A comment describing the functions would be nice. Their use is
> pretty obvious, so not a deal breaker.
Done. Is it a deal? :-)
> > static void
> > +virshEventPrint(virshDomEventData *data,
> > + virBufferPtr buf)
> > +{
> > + char *msg;
> > +
> > + if (!(msg = virBufferContentAndReset(buf)))
> > + return;
> > +
> > + if (!data->loop && *data->count)
> > + goto cleanup;
> > +
> > + vshPrint(data->ctl, "%s", msg);
> > +
> > + (*data->count)++;
> > + if (!data->loop)
> > + vshEventDone(data->ctl);
> > +
> > + cleanup:
> > + VIR_FREE(msg);
> > +}
>
> This works just fine, however I dislike the fact that the virBuffer
> is allocated by the caller but released here.
>
> I'd rather use virBufferCurrentContent() here and leave the caller
> responsible for releasing the buffer. Doing so would make the callers
> slightly more verbose, but result in cleaner code overall IMHO.
I think we just need a comment explicitly saying that this function will
free the buffer. And I added it to the description requested by your
not-a-deal-breaker comment.
Is this good enough?
+/**
+ * virshEventPrint:
+ *
+ * @data: opaque data passed to all event callbacks
+ * @buf: string buffer describing the event
+ *
+ * Print the event description found in @buf and update virshDomEventData.
+ *
+ * This function resets @buf and frees all memory consumed by its content.
+ */
> > @@ -12237,26 +12249,26 @@ virshEventGraphicsPrint(virConnectPtr conn ATTRIBUTE_UNUSED,
> > const virDomainEventGraphicsSubject *subject,
> > void *opaque)
> > {
> > - virshDomEventData *data = opaque;
> > + virBuffer buf = VIR_BUFFER_INITIALIZER;
> > size_t i;
> >
> > - if (!data->loop && *data->count)
> > - return;
> > - vshPrint(data->ctl, _("event 'graphics' for domain %s: "
> > - "%s local[%s %s %s] remote[%s %s %s] %s"),
> > - virDomainGetName(dom), virshGraphicsPhaseToString(phase),
> > - virshGraphicsAddressToString(local->family),
> > - local->node, local->service,
> > - virshGraphicsAddressToString(remote->family),
> > - remote->node, remote->service,
> > - authScheme);
> > - for (i = 0; i < subject->nidentity; i++)
> > - vshPrint(data->ctl, " %s=%s", subject->identities[i].type,
> > - subject->identities[i].name);
> > - vshPrint(data->ctl, "\n");
> > - (*data->count)++;
> > - if (!data->loop)
> > - vshEventDone(data->ctl);
> > + virBufferAsprintf(&buf, _("event 'graphics' for domain %s: "
> > + "%s local[%s %s %s] remote[%s %s %s] %s\n"),
> > + virDomainGetName(dom),
> > + virshGraphicsPhaseToString(phase),
> > + virshGraphicsAddressToString(local->family),
> > + local->node,
> > + local->service,
> > + virshGraphicsAddressToString(remote->family),
> > + remote->node,
> > + remote->service,
> > + authScheme);
> > + for (i = 0; i < subject->nidentity; i++) {
> > + virBufferAsprintf(&buf, "\t%s=%s\n",
> > + subject->identities[i].type,
> > + subject->identities[i].name);
> > + }
> > + virshEventPrint(opaque, &buf);
> > }
>
> You're changing the format a bit here - I like the new one better, and
> it's the same used in virshEventTunablePrint() below. I'm just concerned
> about users parsing this in some way and being confused by the change.
Right, I changed the format to be consistent with another event which
also reported name=value stuff. I don't think we need to be worried
about the output in this particular case.
Jirka
More information about the libvir-list
mailing list