summaryrefslogtreecommitdiffstats
path: root/contrib/libs/cxxsupp/libcxx/include/fstream
diff options
context:
space:
mode:
authormikhnenko <[email protected]>2025-02-01 14:09:02 +0300
committermikhnenko <[email protected]>2025-02-01 14:33:00 +0300
commit5ef4578b282eef07d27f8d0cb56d2c1aac00042c (patch)
tree1fbf9195e0b8c4e47bd7f84aba089ba3c13474f3 /contrib/libs/cxxsupp/libcxx/include/fstream
parent6be27609101cab343f3fedd9204990737b6ecddd (diff)
Update libcxx to 2 Apr 2024 239236b8c2154aa49e98bc7ed774a7d2712edf50
``` [libc++] Remove pair dependency (#85621) [libc++] Simplify the implementation of <stddef.h> (#86843) Update the "Current Status" section of the website to be current. (#84507) [libc++] Optimize the two range overload of mismatch (#86853) [libc++] Refactor __tuple_like and __pair_like (#85206) [libc++][test] Improves src include paths. (#86864) [libc++] Document guidelines for applying [[nodiscard]] (#84000) [libc++] Optimize the std::mismatch tail (#83440) [libc++] Remove <queue> and <stack> includes from <format> (#85520) [libc++] Switch FreeBSD to C++26 (#86658) [libc++] Fix one case in saturate_cast.pass.cpp for 64-bit on z/OS (#86724) [libc++][test] Remove tests that testing std::variant<T&> (#84222) [libc++] <experimental/simd> Reduce types for template parameter U in tests (#83781) [libc++] Switch FreeBSD CI job to Clang 17 (#86320) [libc++][CI] Updates the documentation. (#85264) [libc++][format] Adds ABI tags to inline constexpr variables. (#86293) [libc++][test] Fix race condition in condition_variable_any tests (#84788) [libc++] Vectorize mismatch (#73255) [libc++] Don't push and pop extensions diagnostics when using clang modules (#85917) [libc++][ranges] use `static operator()` for C++23 ranges (#86052) [libc++] Implement LWG3528 (`make_from_tuple` can perform (the equivalent of) a C-style cast) (#85263) [libc++] Remove macros for keeping std::allocator members and void specialization after C++20 (#85806) [libc++] Deprecates std::errc constants. (#80542) [libcxx] [cmake] Fix cmake_path(ABSOLUTE_PATH) for empty CMAKE_INSTALL_PREFIX [libc++][CI] Reenables the module tests. (#85799) [libc++][ranges] remove `__workaround_52970` (#85683) [libc++][ranges] LWG3715: `view_interface::empty` is overconstrained (#85004) [libcxx] [modules] Fix relative paths with absolute LIBCXX_INSTALL_MODULES_DIR (#85756) [libc++][format] Fixes nested concept evaluation. (#85548) [libc++][CMake] Removes LIBCXX_ENABLE_CLANG_TIDY. (#85262) [libc++] Remove __unconstrained_reverse_iterator (#85582) [libc++] Simplify the implementation of remove_reference (#85207) [libcxx][test] Create feature host-can-create-symlinks (#82204) [libc++] Use __is_scoped_enum for the implementation of is_scoped_enum if it's available (#85580) [libc++] Add missing hide-from-ABI annotations on virtual functions (#85439) [libc++] Optimize ranges::fill{,_n} for vector<bool>::iterator (#84642) [libc++] Add <locale> include in <chrono> (#85521) [libc++] Remove <locale> includes from <format> (#85478) [libc++] P2602R2 Poison Pills are Too Toxic (#74534) [libc++] Fixes run-buildbot-container. (#84644) [libc++] Add [[nodiscard]] to static numeric limit functions (#83748) Rework Modules CMake to be (more) idiomatic. (#84936) [libc++] Enables TZDB tests. (#82108) [libc++] Remove a few includes from <__functional/hash.h> (#83254) [libc++] Implements filebuf unbuffered. (#76629) [libc++][CI] Updates the version number of the latest release. [libc++] Remove <tuple> include from <__format/concepts.h> (#80214) [runtimes] Prefer -fvisibility-global-new-delete=force-hidden (#84917) [libc++] Fix tests on musl (#85085) [libc++] Remove _LIBCPP_ENABLE_NARROWING_CONVERSIONS_IN_VARIANT (#83928) [libcxx] Fix incorrect type in the has-1024-bit-atomics feature test (#84904) [libc++] Improves UB handling in ios_base destructor. (#76525) [libc++][CI] Installs tzdata package in Docker. (#84643) [libc++][TZDB] Fixes parsing interleaved rules. (#84808) [libc++][hardening] Check bounds on arithmetic in __bounded_iter (#78876) [libc++][hardening] Add iterator validity checks on unordered containers (#80230) [libc++][hardening] Reclassify string_view(ptr, len)'s size assertion (#79297) [libc++] Re-enable the clang_modules_include test for Objective-C++ (#66801) [libc++] Remove XFAIL for SIMD in optimized build (#84767) [libcxx] Update 128-bit-atomics feature test (#83841) [libc++] Only forward-declare ABI-functions in exception_ptr.h if they are meant to be used (#84707) [libc++][test] Don't include `test_format_context.h` in `parse.pass.cpp` (#83734) [libc++] Add missing include in test (#84579) [libc++] Remove <tuple> from <variant> (#83183) [RFC][libc++] Reworks clang-tidy selection. (#81362) [libc++] Remove <array> include from <span> (#83742) [libc++][format] Updates LWG3462 status. (#80550) [libc++][format] Update LWG3701 status. (#80545) [libc++][test] Fix MSVC warning C4127 in `array.cons/initialization.pass.cpp` (#79793) [libc++] Simplify the std::pair constructor overload set (#81448) [libc++] Allow the use of extensions in the implementation (#79532) [libc++] Don't build against libcxxrt by default on FreeBSD (#84484) Actually disable the module generation tests. [libc++] Disable module_std and module_std_compat tests [libc++] Enable availability based on the compiler instead of __has_extension (#84065) [libc++] Fixes time formatter test output for Linux on PowerPC (#75526) [libc++] Remove unused includes from __type_traits/is_convertible.h (#83747) ``` commit_hash:171258d93ab92f516dfb1789300677a164e63219
Diffstat (limited to 'contrib/libs/cxxsupp/libcxx/include/fstream')
-rw-r--r--contrib/libs/cxxsupp/libcxx/include/fstream60
1 files changed, 59 insertions, 1 deletions
diff --git a/contrib/libs/cxxsupp/libcxx/include/fstream b/contrib/libs/cxxsupp/libcxx/include/fstream
index 776641b347e..7a084d114b1 100644
--- a/contrib/libs/cxxsupp/libcxx/include/fstream
+++ b/contrib/libs/cxxsupp/libcxx/include/fstream
@@ -308,6 +308,43 @@ private:
state_type __st_;
state_type __st_last_;
ios_base::openmode __om_;
+ // There have been no file operations yet, which allows setting unbuffered
+ // I/O mode.
+ static const ios_base::openmode __no_io_operations = ios_base::trunc;
+ // Unbuffered I/O mode has been requested.
+ static const ios_base::openmode __use_unbuffered_io = ios_base::ate;
+ // Used to track the currently used mode and track whether the output should
+ // be unbuffered.
+ // [filebuf.virtuals]/12
+ // If setbuf(0, 0) is called on a stream before any I/O has occurred on
+ // that stream, the stream becomes unbuffered. Otherwise the results are
+ // implementation-defined.
+ // This allows calling setbuf(0, 0)
+ // - before opening a file,
+ // - after opening a file, before
+ // - a read
+ // - a write
+ // - a seek.
+ // Note that opening a file with ios_base::ate does a seek operation.
+ // Normally underflow, overflow, and sync change this flag to ios_base::in,
+ // ios_base_out, or 0.
+ //
+ // The ios_base::trunc and ios_base::ate flags are not used in __cm_. They
+ // are used to track the state of the unbuffered request. For readability
+ // they have the aliases __no_io_operations and __use_unbuffered_io
+ // respectively.
+ //
+ // The __no_io_operations and __use_unbuffered_io flags are used in the
+ // following way:
+ // - __no_io_operations is set upon construction to indicate the unbuffered
+ // state can be set.
+ // - When requesting unbuffered output:
+ // - If the file is open it sets the mode.
+ // - Else places a request by adding the __use_unbuffered_io flag.
+ // - When a file is opened it checks whether both __no_io_operations and
+ // __use_unbuffered_io are set. If so switches to unbuffered mode.
+ // - All file I/O operations change the mode effectively clearing the
+ // __no_io_operations and __use_unbuffered_io flags.
ios_base::openmode __cm_;
bool __owns_eb_;
bool __owns_ib_;
@@ -327,7 +364,13 @@ private:
return nullptr;
__om_ = __mode;
+ if (__cm_ == (__no_io_operations | __use_unbuffered_io)) {
+ std::setbuf(__file_, nullptr);
+ __cm_ = 0;
+ }
+
if (__mode & ios_base::ate) {
+ __cm_ = 0;
if (fseek(__file_, 0, SEEK_END)) {
fclose(__file_);
__file_ = nullptr;
@@ -337,6 +380,20 @@ private:
return this;
}
+
+ // 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;
+ }
+ }
+ }
};
template <class _CharT, class _Traits>
@@ -352,7 +409,7 @@ basic_filebuf<_CharT, _Traits>::basic_filebuf()
__st_(),
__st_last_(),
__om_(0),
- __cm_(0),
+ __cm_(__no_io_operations),
__owns_eb_(false),
__owns_ib_(false),
__always_noconv_(false) {
@@ -810,6 +867,7 @@ 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);
if (__owns_eb_)
delete[] __extbuf_;
if (__owns_ib_)