[libcxx-commits] [libcxx] [libc++][NFC] Refactor __request_unbuffered_mode (PR #168950)

via libcxx-commits libcxx-commits at lists.llvm.org
Thu Nov 20 13:28:44 PST 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-libcxx

Author: Louis Dionne (ldionne)

<details>
<summary>Changes</summary>

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).

---
Full diff: https://github.com/llvm/llvm-project/pull/168950.diff


1 Files Affected:

- (modified) libcxx/include/fstream (+9-9) 


``````````diff
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_)

``````````

</details>


https://github.com/llvm/llvm-project/pull/168950


More information about the libcxx-commits mailing list