[libvirt] [PATCH v2 11/20] virlog: Introduce virLogParseOutputs

Erik Skultety eskultet at redhat.com
Thu Oct 6 10:41:04 UTC 2016


>> +
>> +    VIR_DEBUG("outputs=%s", src);
>> +
>> +    if (!(strings = virStringSplit(src, " ", 0)))
> 
> You could use the Count version and then...
> 
>> +        goto cleanup;
>> +
>> +    for (i = 0; strings[i]; i++) {
> 
> ...rather than strings[i], it's < count

Well, this way we spared one unnecessary variable, but whatever, I can
always add it there to make it more readable I guess.

> 
>> +        /* virStringSplit may return empty strings */
>> +        if (STREQ(strings[i], ""))
>> +            continue;
>> +
>> +        if (!(output = virLogParseOutput(strings[i])))
>> +            goto cleanup;
>> +
>> +        /* let's check if a duplicate output does not already exist in which
>> +         * case we replace it with its last occurrence
>> +         */
>> +        if ((at = virLogFindOutput(list, noutputs, output->dest,
>> +                                   output->name)) >= 0) {
>> +            virLogOutputFree(list[at]);
>> +            VIR_DELETE_ELEMENT(list, at, noutputs);
>> +        }
>> +
>> +        if (VIR_APPEND_ELEMENT(list, noutputs, output) < 0) {
>> +            virLogOutputFree(output);
> 
> In this case, the old one is also gone... So we've effectively removed
> it. Is that intentional?  or should the DELETE of 'at' occur after this
> successfully adds a new one?
> 
> IOW:
>    at = virLogFindOutput()
>    if (VIR_APPEND_ELEMENT() < 0)
> ...
>    }
>    if (at >= 0) {
>        virLogOutputFree(list[at]);
>        VIR_DELETE_ELEMENT();
>    }
> 

Ouch, perfect catch, thanks, we would definitely lose the original if
the append failed.

>> +            goto cleanup;
>> +        }
>> +
>> +        virLogOutputFree(output);
> 
> Is this right? I don't think it's necessary unless you change to using
> the _COPY append macro

I suppose you're right, since it issues memmove, I'll try some scenarios
to compare the behaviour though.

> 
> 
>> +    }
>> +
>> +    ret = noutputs;
>> +    *outputs = list;
> 
> If you then set "list = NULL"...
> 
>> + cleanup:
>> +    if (ret < 0)
> 
> ... the (ret < 0) is not necessary
> 
>> +        virLogOutputListFree(list, noutputs);
>> +    virStringFreeList(strings);
>> +    return ret;
>> +}
>> diff --git a/src/util/virlog.h b/src/util/virlog.h
>> index e7f6b85..ed60c00 100644
>> --- a/src/util/virlog.h
>> +++ b/src/util/virlog.h
>> @@ -247,5 +247,6 @@ virLogOutputPtr virLogNewOutputToSyslog(virLogPriority priority,
>>  virLogOutputPtr virLogNewOutputToJournald(int priority);
>>  virLogOutputPtr virLogParseOutput(const char *src);
>>  virLogFilterPtr virLogParseFilter(const char *src);
>> +int virLogParseOutputs(const char *src, virLogOutputPtr **outputs);
> 
> s/;/ATTRIBUTE_NONNULL(1);
> 
> Conditional ACK - guess I'm curious how the duplication and error path
> issue falls out...
>

Thanks a lot.
Erik

> John
>>  
>>  #endif
>>



-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20161006/e0fb6a00/attachment-0001.sig>


More information about the libvir-list mailing list