[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