[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