[libc++][NFC] Refactor __request_unbuffered_mode (#168950)

It's a bit awkward to pass the char* and the size to the function, which
then only decides whether it should be a no-op with it. Instead, only
call the function when the pointer is null and n is 0, which matches
more closely what the standard says with respect to calling pubsetbuf(0, 0).
This commit is contained in:
Louis Dionne 2026-01-14 13:39:16 -05:00 committed by GitHub
parent ec983ad611
commit 1f5c445c4b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -400,14 +400,12 @@ private:
// If the file is already open, switch to unbuffered mode. Otherwise, record
// the request to use unbuffered mode so that we use that mode when we
// eventually open the file.
_LIBCPP_HIDE_FROM_ABI void __request_unbuffered_mode(char_type* __s, streamsize __n) {
if (__cm_ == __no_io_operations && __s == nullptr && __n == 0) {
if (__file_) {
std::setbuf(__file_, nullptr);
__cm_ = 0;
} else {
__cm_ = __no_io_operations | __use_unbuffered_io;
}
_LIBCPP_HIDE_FROM_ABI void __request_unbuffered_mode() {
if (__file_) {
std::setbuf(__file_, nullptr);
__cm_ = 0;
} else {
__cm_ = __no_io_operations | __use_unbuffered_io;
}
}
@ -920,7 +918,9 @@ template <class _CharT, class _Traits>
basic_streambuf<_CharT, _Traits>* basic_filebuf<_CharT, _Traits>::setbuf(char_type* __s, streamsize __n) {
this->setg(nullptr, nullptr, nullptr);
this->setp(nullptr, nullptr);
__request_unbuffered_mode(__s, __n);
// Calling setbuf(nullptr, 0) before any i/o operation switches the stream to unbuffered mode
if (__cm_ == __no_io_operations && __s == nullptr && __n == 0)
__request_unbuffered_mode();
if (__owns_eb_)
delete[] __extbuf_;
if (__owns_ib_)