1// Compatibility symbols for previous versions, C++0x bits -*- C++ -*- 2 3// Copyright (C) 2013-2022 Free Software Foundation, Inc. 4// 5// This file is part of the GNU ISO C++ Library. This library is free 6// software; you can redistribute it and/or modify it under the 7// terms of the GNU General Public License as published by the 8// Free Software Foundation; either version 3, or (at your option) 9// any later version. 10 11// This library is distributed in the hope that it will be useful, 12// but WITHOUT ANY WARRANTY; without even the implied warranty of 13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14// GNU General Public License for more details. 15 16// Under Section 7 of GPL version 3, you are granted additional 17// permissions described in the GCC Runtime Library Exception, version 18// 3.1, as published by the Free Software Foundation. 19 20// You should have received a copy of the GNU General Public License and 21// a copy of the GCC Runtime Library Exception along with this program; 22// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23// <http://www.gnu.org/licenses/>. 24 25#include <bits/c++config.h> 26 27#if __cplusplus < 201103L 28# error "compatibility-condvar-c++0x.cc must be compiled with -std=gnu++11" 29#endif 30 31#if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1) 32 33#define condition_variable_any condition_variable_anyXX 34#include <condition_variable> 35#undef condition_variable_any 36 37// XXX GLIBCXX_ABI Deprecated 38// gcc-4.9.0 39// std::condition_variable_any replaced with std::_V2::condition_variable_any 40namespace std _GLIBCXX_VISIBILITY(default) 41{ 42_GLIBCXX_BEGIN_NAMESPACE_VERSION 43 class condition_variable_any 44 { 45 condition_variable _M_cond; 46 mutex _M_mutex; 47 48 public: 49 condition_variable_any() noexcept; 50 ~condition_variable_any() noexcept; 51 }; 52 condition_variable_any::condition_variable_any() noexcept = default; 53 condition_variable_any::~condition_variable_any() noexcept = default; 54_GLIBCXX_END_NAMESPACE_VERSION 55} // namespace std 56 57#if ! _GLIBCXX_INLINE_VERSION 58// XXX GLIBCXX_ABI Deprecated 59// gcc-12.1 60// std::condition_variable::wait changed to noexcept(false) 61#if defined(_GLIBCXX_SYMVER_GNU) && defined(_GLIBCXX_SHARED) \ 62 && defined(_GLIBCXX_HAVE_AS_SYMVER_DIRECTIVE) \ 63 && defined(_GLIBCXX_HAVE_SYMVER_SYMBOL_RENAMING_RUNTIME_SUPPORT) 64namespace __gnu_cxx _GLIBCXX_VISIBILITY(default) 65{ 66namespace 67{ 68 // Pointer-to-member for private std::condition_variable::_M_cond member. 69 std::__condvar std::condition_variable::* __base_member; 70 71 template<std::__condvar std::condition_variable::*X> 72 struct cracker 73 { static std::__condvar std::condition_variable::* value; }; 74 75 // Initializer for this static member also initializes __base_member. 76 template<std::__condvar std::condition_variable::*X> 77 std::__condvar std::condition_variable::* 78 cracker<X>::value = __base_member = X; 79 80 // Explicit instantiation is allowed to access the private member. 81 template class cracker<&std::condition_variable::_M_cond>; 82} 83 84struct __nothrow_wait_cv : std::condition_variable 85{ 86 void wait(std::unique_lock<std::mutex>&) noexcept; 87}; 88 89__attribute__((used)) 90void 91__nothrow_wait_cv::wait(std::unique_lock<std::mutex>& lock) noexcept 92{ 93 // In theory this could be simply this->std::condition_variable::wait(lock) 94 // but with uclibc that binds to the @GLIBCXX_3.4.11 symbol, see PR 105730. 95 (this->*__base_member).wait(*lock.mutex()); 96} 97} // namespace __gnu_cxx 98 99// Export a noexcept wrapper around std::condition_variable::wait 100// with the original @GLIBCXX_3.4.11 symbol version. 101asm( 102 ".symver _ZN9__gnu_cxx17__nothrow_wait_cv4waitERSt11unique_lockISt5mutexE," 103 "_ZNSt18condition_variable4waitERSt11unique_lockISt5mutexE@GLIBCXX_3.4.11" 104); 105#endif 106#endif 107 108#endif // _GLIBCXX_HAS_GTHREADS && _GLIBCXX_USE_C99_STDINT_TR1 109