[libcxx-commits] [libcxx] [libc++][NFC] Refactor __request_unbuffered_mode (PR #168950)
Louis Dionne via libcxx-commits
libcxx-commits at lists.llvm.org
Thu Nov 20 13:28:15 PST 2025
https://github.com/ldionne created https://github.com/llvm/llvm-project/pull/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).
>From 4e6dcce97d31e91291e27c9b94e67ed5edaff96f Mon Sep 17 00:00:00 2001
From: Louis Dionne <ldionne.2 at gmail.com>
Date: Thu, 20 Nov 2025 16:23:15 -0500
Subject: [PATCH] [libc++][NFC] Refactor __request_unbuffered_mode
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).
---
libcxx/include/fstream | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/libcxx/include/fstream b/libcxx/include/fstream
index 90e35740c17cf..2f0e8688e7d83 100644
--- a/libcxx/include/fstream
+++ b/libcxx/include/fstream
@@ -419,14 +419,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;
}
}
@@ -934,7 +932,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_)
More information about the libcxx-commits
mailing list