[PATCH] Disable buffering for raw_null_ostream()
Duncan P. N. Exon Smith
dexonsmith at apple.com
Wed Jul 1 15:44:38 PDT 2015
> On 2015-Jul-01, at 15:32, Mehdi Amini <mehdi.amini at apple.com> wrote:
>
>>
>> On Jul 1, 2015, at 2:30 PM, Duncan P. N. Exon Smith <dexonsmith at apple.com> wrote:
>>
>>>
>>> On 2015-Jul-01, at 13:35, Mehdi Amini <mehdi.amini at apple.com> wrote:
>>>
>>>>
>>>> On Jul 1, 2015, at 12:25 PM, Duncan P. N. Exon Smith <dexonsmith at apple.com> wrote:
>>>>
>>>>>
>>>>> On 2015-Jul-01, at 12:12, Mehdi Amini <mehdi.amini at apple.com> wrote:
>>>>>
>>>>>>
>>>>>> On Jul 1, 2015, at 12:05 PM, Duncan P. N. Exon Smith <dexonsmith at apple.com> wrote:
>>>>>>
>>>>>>
>>>>>>> On 2015-Jun-30, at 22:40, Mehdi AMINI <mehdi.amini at apple.com> wrote:
>>>>>>>
>>>>>>> Hi rafael,
>>>>>>>
>>>>>>> There is no need to buffer the nulls() output.
>>>>>>> Moreover it kept a shared buffer, and made using nulls() not possible
>>>>>>> in a multi-threaded environment.
>>>>>>>
>>>>>>> http://reviews.llvm.org/D10861
>>>>>>>
>>>>>>> Files:
>>>>>>> include/llvm/Support/raw_ostream.h
>>>>>>>
>>>>>>> Index: include/llvm/Support/raw_ostream.h
>>>>>>> ===================================================================
>>>>>>> --- include/llvm/Support/raw_ostream.h
>>>>>>> +++ include/llvm/Support/raw_ostream.h
>>>>>>> @@ -530,7 +530,7 @@
>>>>>>> uint64_t current_pos() const override;
>>>>>>>
>>>>>>> public:
>>>>>>> - explicit raw_null_ostream() {}
>>>>>>> + explicit raw_null_ostream() : raw_pwrite_stream(true) {}
>>>>>>
>>>>>> Can you document the `true` here?
>>>>>>
>>>>>> : raw_pwrite_stream(/* Unbuffered */ true) {}
>>>>>
>>>>> What about changing the bool to an enum class instead?
>>>>> I don’t really like boolean argument for this reason.
>>>>
>>>> Might be overkill; we use `bool`s as args all over.
>>>
>>> Does not mean it is a good thing :)
>>> Any down side to use enum instead?
>>
>> There's no good way to add an implicit conversion to an enum class,
>> and it requires more boiler-plate. Sometimes enum classes are worth
>> the trouble, sometimes only enums are, and sometimes really you just
>> want a `bool`.
>>
>> Given that the only reasonable options for these functions are
>> `InternalBuffer` and `Unbuffered`, a `bool` is arguably more clear
>> in this case.
>>
>>>
>>>> `bool`s are
>>>> awkward as arguments, but IMO documenting them is usually sufficient.
>>>
>>> I don’t like potential for confusion, for example when reading:
>>>
>>> raw_pwrite_stream(/* Unbuffered */ false)
>>>
>>> Does it mean that “unbuffered” is false and then the stream is buffered?
>>> Or does the false mean that buffered is disabled and the “unbuffered” comment makes explicit that the programmer except the mode to be set to unbuffer?
>>
>> Common practice in LLVM is to exactly duplicate the parameter name,
>> as if it's a named paremeter (read `Unbuffered: false`). If you see
>> anywhere that does it differently, please fix it.
>>
>> Of course, the `Unbuffered` parameter is spelled wrong -- our coding
>> standards would recommend `IsUnbuffered` -- and if it were named
>> correctly I suspect you'd find it a little more obvious. Or just
>> say `/* Unbuffered = */ false`, that's common too.
>
> Still error prone and not tool friendly.
> `StreamMode::Unbuffered ` is at least as much readable as the inline comment, with the advantage that clients can't omit the comment (or more wicked: reverse the comment), and it is more tool-friendly (autocompletion for instance).
>
>
>>
>>>
>>> Admittedly the confusion is emphasized by the fact that the boolean is associated to a “negated” argument, if you see the stream has “having or not a buffer” there is a double negation to enable the buffer.
>>>
>>> (Revision updated BTW).
>>
>> Why isn't it attached to the same email? Anyway, I found it.
>>
>>>>
>>>> As long as it doesn't conflict strangely with `BufferKind` I don't
>>>> see a problem with it though (as long as it's a separate commit from
>>>> the functional change).
>>
>> It looks like you've done both in the same patch. Please separate into
>> the two patches -- one to change the API, and another to change
>> semantics.
>
> I have two local commits, but since the raw_null_ostream is a “one-liner” I thought it was not worth opening another revision on Phabricator.
> (Phabricator shows that there are two local separate commits but unfortunately does not allow to split the diff for only one of them)
If Phabricator makes it difficult to send a review, then I'd recommend
not using Phabricator for that review...
> I created a new revision for the refactoring commit: http://reviews.llvm.org/D10885 ; it should address your comment below.
Sure, I'll look for that thread.
More information about the llvm-commits
mailing list