| { | |||||
| "type": "tool", | |||||
| "name": "toolchain-gcc-arm-embedded", | |||||
| "version": "0.1.0", | |||||
| "spec": { | |||||
| "owner": "skepto", | |||||
| "id": 99999, | |||||
| "name": "toolchain-gcc-arm-embedded", | |||||
| "requirements": null, | |||||
| "url": null | |||||
| } | |||||
| } | 
| /* Provide support for both ANSI and non-ANSI environments. */ | |||||
| /* To get a strict ANSI C environment, define macro __STRICT_ANSI__. This will | |||||
| "comment out" the non-ANSI parts of the ANSI header files (non-ANSI header | |||||
| files aren't affected). */ | |||||
| #ifndef _ANSIDECL_H_ | |||||
| #define _ANSIDECL_H_ | |||||
| #include <newlib.h> | |||||
| #include <sys/config.h> | |||||
| /* ISO C++. */ | |||||
| #ifdef __cplusplus | |||||
| #if !(defined(_BEGIN_STD_C) && defined(_END_STD_C)) | |||||
| #ifdef _HAVE_STD_CXX | |||||
| #define _BEGIN_STD_C namespace std { extern "C" { | |||||
| #define _END_STD_C } } | |||||
| #else | |||||
| #define _BEGIN_STD_C extern "C" { | |||||
| #define _END_STD_C } | |||||
| #endif | |||||
| #if __GNUC_PREREQ (3, 3) | |||||
| #define _NOTHROW __attribute__ ((__nothrow__)) | |||||
| #else | |||||
| #define _NOTHROW throw() | |||||
| #endif | |||||
| #endif | |||||
| #else | |||||
| #define _BEGIN_STD_C | |||||
| #define _END_STD_C | |||||
| #define _NOTHROW | |||||
| #endif | |||||
| #ifndef _LONG_DOUBLE | |||||
| #define _LONG_DOUBLE long double | |||||
| #endif | |||||
| /* Support gcc's __attribute__ facility. */ | |||||
| #ifdef __GNUC__ | |||||
| #define _ATTRIBUTE(attrs) __attribute__ (attrs) | |||||
| #else | |||||
| #define _ATTRIBUTE(attrs) | |||||
| #endif | |||||
| /* The traditional meaning of 'extern inline' for GCC is not | |||||
| to emit the function body unless the address is explicitly | |||||
| taken. However this behaviour is changing to match the C99 | |||||
| standard, which uses 'extern inline' to indicate that the | |||||
| function body *must* be emitted. Likewise, a function declared | |||||
| without either 'extern' or 'static' defaults to extern linkage | |||||
| (C99 6.2.2p5), and the compiler may choose whether to use the | |||||
| inline version or call the extern linkage version (6.7.4p6). | |||||
| If we are using GCC, but do not have the new behaviour, we need | |||||
| to use extern inline; if we are using a new GCC with the | |||||
| C99-compatible behaviour, or a non-GCC compiler (which we will | |||||
| have to hope is C99, since there is no other way to achieve the | |||||
| effect of omitting the function if it isn't referenced) we use | |||||
| 'static inline', which c99 defines to mean more-or-less the same | |||||
| as the Gnu C 'extern inline'. */ | |||||
| #if defined(__GNUC__) && !defined(__GNUC_STDC_INLINE__) | |||||
| /* We're using GCC, but without the new C99-compatible behaviour. */ | |||||
| #define _ELIDABLE_INLINE extern __inline__ _ATTRIBUTE ((__always_inline__)) | |||||
| #else | |||||
| /* We're using GCC in C99 mode, or an unknown compiler which | |||||
| we just have to hope obeys the C99 semantics of inline. */ | |||||
| #define _ELIDABLE_INLINE static __inline__ | |||||
| #endif | |||||
| #if __GNUC_PREREQ (3, 1) | |||||
| #define _NOINLINE __attribute__ ((__noinline__)) | |||||
| #define _NOINLINE_STATIC _NOINLINE static | |||||
| #else | |||||
| /* On non-GNU compilers and GCC prior to version 3.1 the compiler can't be | |||||
| trusted not to inline if it is static. */ | |||||
| #define _NOINLINE | |||||
| #define _NOINLINE_STATIC | |||||
| #endif | |||||
| #endif /* _ANSIDECL_H_ */ | 
| /* _newlib_version.h. Generated from _newlib_version.hin by configure. */ | |||||
| /* Version macros for internal and downstream use. */ | |||||
| #ifndef _NEWLIB_VERSION_H__ | |||||
| #define _NEWLIB_VERSION_H__ 1 | |||||
| #define _NEWLIB_VERSION "3.3.0" | |||||
| #define __NEWLIB__ 3 | |||||
| #define __NEWLIB_MINOR__ 3 | |||||
| #define __NEWLIB_PATCHLEVEL__ 0 | |||||
| #endif /* !_NEWLIB_VERSION_H__ */ | |||||
| /* internal use only -- mapping of "system calls" for libraries that lose | |||||
| and only provide C names, so that we end up in violation of ANSI */ | |||||
| #ifndef __SYSLIST_H | |||||
| #define __SYSLIST_H | |||||
| #ifdef MISSING_SYSCALL_NAMES | |||||
| #define _close close | |||||
| #define _execve execve | |||||
| #define _fcntl fcntl | |||||
| #define _fork fork | |||||
| #define _fstat fstat | |||||
| #define _getpid getpid | |||||
| #define _gettimeofday gettimeofday | |||||
| #define _isatty isatty | |||||
| #define _kill kill | |||||
| #define _link link | |||||
| #define _lseek lseek | |||||
| #define _mkdir mkdir | |||||
| #define _open open | |||||
| #define _read read | |||||
| #define _sbrk sbrk | |||||
| #define _stat stat | |||||
| #define _times times | |||||
| #define _unlink unlink | |||||
| #define _wait wait | |||||
| #define _write write | |||||
| #endif /* MISSING_SYSCALL_NAMES */ | |||||
| #if defined MISSING_SYSCALL_NAMES || !defined HAVE_OPENDIR | |||||
| /* If the system call interface is missing opendir, readdir, and | |||||
| closedir, there is an implementation of these functions in | |||||
| libc/posix that is implemented using open, getdents, and close. | |||||
| Note, these functions are currently not in the libc/syscalls | |||||
| directory. */ | |||||
| #define _opendir opendir | |||||
| #define _readdir readdir | |||||
| #define _closedir closedir | |||||
| #endif /* MISSING_SYSCALL_NAMES || !HAVE_OPENDIR */ | |||||
| #endif /* !__SYSLIST_H_ */ | 
| /* libc/include/alloca.h - Allocate memory on stack */ | |||||
| /* Written 2000 by Werner Almesberger */ | |||||
| /* Rearranged for general inclusion by stdlib.h. | |||||
| 2001, Corinna Vinschen <vinschen@redhat.com> */ | |||||
| #ifndef _NEWLIB_ALLOCA_H | |||||
| #define _NEWLIB_ALLOCA_H | |||||
| #include "_ansi.h" | |||||
| #include <sys/reent.h> | |||||
| #undef alloca | |||||
| #ifdef __GNUC__ | |||||
| #define alloca(size) __builtin_alloca(size) | |||||
| #else | |||||
| void * alloca (size_t); | |||||
| #endif | |||||
| #endif | 
| /* $NetBSD: ar.h,v 1.4 1994/10/26 00:55:43 cgd Exp $ */ | |||||
| /*- | |||||
| * Copyright (c) 1991, 1993 | |||||
| * The Regents of the University of California. All rights reserved. | |||||
| * (c) UNIX System Laboratories, Inc. | |||||
| * All or some portions of this file are derived from material licensed | |||||
| * to the University of California by American Telephone and Telegraph | |||||
| * Co. or Unix System Laboratories, Inc. and are reproduced herein with | |||||
| * the permission of UNIX System Laboratories, Inc. | |||||
| * | |||||
| * This code is derived from software contributed to Berkeley by | |||||
| * Hugh Smith at The University of Guelph. | |||||
| * | |||||
| * Redistribution and use in source and binary forms, with or without | |||||
| * modification, are permitted provided that the following conditions | |||||
| * are met: | |||||
| * 1. Redistributions of source code must retain the above copyright | |||||
| * notice, this list of conditions and the following disclaimer. | |||||
| * 2. Redistributions in binary form must reproduce the above copyright | |||||
| * notice, this list of conditions and the following disclaimer in the | |||||
| * documentation and/or other materials provided with the distribution. | |||||
| * 3. All advertising materials mentioning features or use of this software | |||||
| * must display the following acknowledgement: | |||||
| * This product includes software developed by the University of | |||||
| * California, Berkeley and its contributors. | |||||
| * 4. Neither the name of the University nor the names of its contributors | |||||
| * may be used to endorse or promote products derived from this software | |||||
| * without specific prior written permission. | |||||
| * | |||||
| * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | |||||
| * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |||||
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |||||
| * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | |||||
| * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |||||
| * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |||||
| * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |||||
| * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |||||
| * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |||||
| * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
| * SUCH DAMAGE. | |||||
| * | |||||
| * @(#)ar.h 8.2 (Berkeley) 1/21/94 | |||||
| */ | |||||
| #ifndef _AR_H_ | |||||
| #define _AR_H_ | |||||
| /* Pre-4BSD archives had these magic numbers in them. */ | |||||
| #define OARMAG1 0177555 | |||||
| #define OARMAG2 0177545 | |||||
| #define ARMAG "!<arch>\n" /* ar "magic number" */ | |||||
| #define SARMAG 8 /* strlen(ARMAG); */ | |||||
| #define AR_EFMT1 "#1/" /* extended format #1 */ | |||||
| struct ar_hdr { | |||||
| char ar_name[16]; /* name */ | |||||
| char ar_date[12]; /* modification time */ | |||||
| char ar_uid[6]; /* user id */ | |||||
| char ar_gid[6]; /* group id */ | |||||
| char ar_mode[8]; /* octal file permissions */ | |||||
| char ar_size[10]; /* size in bytes */ | |||||
| #define ARFMAG "`\n" | |||||
| char ar_fmag[2]; /* consistency check */ | |||||
| }; | |||||
| #endif /* !_AR_H_ */ | 
| /* Copyright (C) 2002 by Red Hat, Incorporated. All rights reserved. | |||||
| * | |||||
| * Permission to use, copy, modify, and distribute this software | |||||
| * is freely granted, provided that this notice is preserved. | |||||
| */ | |||||
| #ifndef _ARGZ_H_ | |||||
| #define _ARGZ_H_ | |||||
| #include <errno.h> | |||||
| #include <sys/types.h> | |||||
| #include "_ansi.h" | |||||
| _BEGIN_STD_C | |||||
| /* The newlib implementation of these functions assumes that sizeof(char) == 1. */ | |||||
| error_t argz_create (char *const argv[], char **argz, size_t *argz_len); | |||||
| error_t argz_create_sep (const char *string, int sep, char **argz, size_t *argz_len); | |||||
| size_t argz_count (const char *argz, size_t argz_len); | |||||
| void argz_extract (char *argz, size_t argz_len, char **argv); | |||||
| void argz_stringify (char *argz, size_t argz_len, int sep); | |||||
| error_t argz_add (char **argz, size_t *argz_len, const char *str); | |||||
| error_t argz_add_sep (char **argz, size_t *argz_len, const char *str, int sep); | |||||
| error_t argz_append (char **argz, size_t *argz_len, const char *buf, size_t buf_len); | |||||
| error_t argz_delete (char **argz, size_t *argz_len, char *entry); | |||||
| error_t argz_insert (char **argz, size_t *argz_len, char *before, const char *entry); | |||||
| char * argz_next (char *argz, size_t argz_len, const char *entry); | |||||
| error_t argz_replace (char **argz, size_t *argz_len, const char *str, const char *with, unsigned *replace_count); | |||||
| _END_STD_C | |||||
| #endif /* _ARGZ_H_ */ | 
| /* | |||||
| assert.h | |||||
| */ | |||||
| #ifdef __cplusplus | |||||
| extern "C" { | |||||
| #endif | |||||
| #include "_ansi.h" | |||||
| #undef assert | |||||
| #ifdef NDEBUG /* required by ANSI standard */ | |||||
| # define assert(__e) ((void)0) | |||||
| #else | |||||
| # define assert(__e) ((__e) ? (void)0 : __assert_func (__FILE__, __LINE__, \ | |||||
| __ASSERT_FUNC, #__e)) | |||||
| # ifndef __ASSERT_FUNC | |||||
| /* Use g++'s demangled names in C++. */ | |||||
| # if defined __cplusplus && defined __GNUC__ | |||||
| # define __ASSERT_FUNC __PRETTY_FUNCTION__ | |||||
| /* C99 requires the use of __func__. */ | |||||
| # elif __STDC_VERSION__ >= 199901L | |||||
| # define __ASSERT_FUNC __func__ | |||||
| /* Older versions of gcc don't have __func__ but can use __FUNCTION__. */ | |||||
| # elif __GNUC__ >= 2 | |||||
| # define __ASSERT_FUNC __FUNCTION__ | |||||
| /* failed to detect __func__ support. */ | |||||
| # else | |||||
| # define __ASSERT_FUNC ((char *) 0) | |||||
| # endif | |||||
| # endif /* !__ASSERT_FUNC */ | |||||
| #endif /* !NDEBUG */ | |||||
| void __assert (const char *, int, const char *) | |||||
| _ATTRIBUTE ((__noreturn__)); | |||||
| void __assert_func (const char *, int, const char *, const char *) | |||||
| _ATTRIBUTE ((__noreturn__)); | |||||
| #if __STDC_VERSION__ >= 201112L && !defined __cplusplus | |||||
| # define static_assert _Static_assert | |||||
| #endif | |||||
| #ifdef __cplusplus | |||||
| } | |||||
| #endif | 
| // <algorithm> -*- C++ -*- | |||||
| // Copyright (C) 2001-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /* | |||||
| * | |||||
| * Copyright (c) 1994 | |||||
| * Hewlett-Packard Company | |||||
| * | |||||
| * Permission to use, copy, modify, distribute and sell this software | |||||
| * and its documentation for any purpose is hereby granted without fee, | |||||
| * provided that the above copyright notice appear in all copies and | |||||
| * that both that copyright notice and this permission notice appear | |||||
| * in supporting documentation. Hewlett-Packard Company makes no | |||||
| * representations about the suitability of this software for any | |||||
| * purpose. It is provided "as is" without express or implied warranty. | |||||
| * | |||||
| * | |||||
| * Copyright (c) 1996,1997 | |||||
| * Silicon Graphics Computer Systems, Inc. | |||||
| * | |||||
| * Permission to use, copy, modify, distribute and sell this software | |||||
| * and its documentation for any purpose is hereby granted without fee, | |||||
| * provided that the above copyright notice appear in all copies and | |||||
| * that both that copyright notice and this permission notice appear | |||||
| * in supporting documentation. Silicon Graphics makes no | |||||
| * representations about the suitability of this software for any | |||||
| * purpose. It is provided "as is" without express or implied warranty. | |||||
| */ | |||||
| /** @file include/algorithm | |||||
| * This is a Standard C++ Library header. | |||||
| */ | |||||
| #ifndef _GLIBCXX_ALGORITHM | |||||
| #define _GLIBCXX_ALGORITHM 1 | |||||
| #pragma GCC system_header | |||||
| #include <utility> // UK-300. | |||||
| #include <bits/stl_algobase.h> | |||||
| #include <bits/stl_algo.h> | |||||
| #if __cplusplus > 201703L | |||||
| # include <bits/ranges_algo.h> | |||||
| #endif | |||||
| #if __cplusplus > 201402L | |||||
| // Parallel STL algorithms | |||||
| # if _PSTL_EXECUTION_POLICIES_DEFINED | |||||
| // If <execution> has already been included, pull in implementations | |||||
| # include <pstl/glue_algorithm_impl.h> | |||||
| # else | |||||
| // Otherwise just pull in forward declarations | |||||
| # include <pstl/glue_algorithm_defs.h> | |||||
| # define _PSTL_ALGORITHM_FORWARD_DECLARED 1 | |||||
| # endif | |||||
| // Feature test macro for parallel algorithms | |||||
| # define __cpp_lib_parallel_algorithm 201603L | |||||
| #endif // C++17 | |||||
| #ifdef _GLIBCXX_PARALLEL | |||||
| # include <parallel/algorithm> | |||||
| #endif | |||||
| #endif /* _GLIBCXX_ALGORITHM */ | 
| // <any> -*- C++ -*- | |||||
| // Copyright (C) 2014-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file include/any | |||||
| * This is a Standard C++ Library header. | |||||
| */ | |||||
| #ifndef _GLIBCXX_ANY | |||||
| #define _GLIBCXX_ANY 1 | |||||
| #pragma GCC system_header | |||||
| #if __cplusplus >= 201703L | |||||
| #include <typeinfo> | |||||
| #include <new> | |||||
| #include <utility> | |||||
| #include <type_traits> | |||||
| namespace std _GLIBCXX_VISIBILITY(default) | |||||
| { | |||||
| _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||||
| /** | |||||
| * @addtogroup utilities | |||||
| * @{ | |||||
| */ | |||||
| /** | |||||
| * @brief Exception class thrown by a failed @c any_cast | |||||
| * @ingroup exceptions | |||||
| */ | |||||
| class bad_any_cast : public bad_cast | |||||
| { | |||||
| public: | |||||
| virtual const char* what() const noexcept { return "bad any_cast"; } | |||||
| }; | |||||
| [[gnu::noreturn]] inline void __throw_bad_any_cast() | |||||
| { | |||||
| #if __cpp_exceptions | |||||
| throw bad_any_cast{}; | |||||
| #else | |||||
| __builtin_abort(); | |||||
| #endif | |||||
| } | |||||
| #define __cpp_lib_any 201606L | |||||
| /** | |||||
| * @brief A type-safe container of any type. | |||||
| * | |||||
| * An @c any object's state is either empty or it stores a contained object | |||||
| * of CopyConstructible type. | |||||
| */ | |||||
| class any | |||||
| { | |||||
| // Holds either pointer to a heap object or the contained object itself. | |||||
| union _Storage | |||||
| { | |||||
| constexpr _Storage() : _M_ptr{nullptr} {} | |||||
| // Prevent trivial copies of this type, buffer might hold a non-POD. | |||||
| _Storage(const _Storage&) = delete; | |||||
| _Storage& operator=(const _Storage&) = delete; | |||||
| void* _M_ptr; | |||||
| aligned_storage<sizeof(_M_ptr), alignof(void*)>::type _M_buffer; | |||||
| }; | |||||
| template<typename _Tp, typename _Safe = is_nothrow_move_constructible<_Tp>, | |||||
| bool _Fits = (sizeof(_Tp) <= sizeof(_Storage)) | |||||
| && (alignof(_Tp) <= alignof(_Storage))> | |||||
| using _Internal = std::integral_constant<bool, _Safe::value && _Fits>; | |||||
| template<typename _Tp> | |||||
| struct _Manager_internal; // uses small-object optimization | |||||
| template<typename _Tp> | |||||
| struct _Manager_external; // creates contained object on the heap | |||||
| template<typename _Tp> | |||||
| using _Manager = conditional_t<_Internal<_Tp>::value, | |||||
| _Manager_internal<_Tp>, | |||||
| _Manager_external<_Tp>>; | |||||
| template<typename _Tp, typename _VTp = decay_t<_Tp>> | |||||
| using _Decay_if_not_any = enable_if_t<!is_same_v<_VTp, any>, _VTp>; | |||||
| /// Emplace with an object created from @p __args as the contained object. | |||||
| template <typename _Tp, typename... _Args, | |||||
| typename _Mgr = _Manager<_Tp>> | |||||
| void __do_emplace(_Args&&... __args) | |||||
| { | |||||
| reset(); | |||||
| _Mgr::_S_create(_M_storage, std::forward<_Args>(__args)...); | |||||
| _M_manager = &_Mgr::_S_manage; | |||||
| } | |||||
| /// Emplace with an object created from @p __il and @p __args as | |||||
| /// the contained object. | |||||
| template <typename _Tp, typename _Up, typename... _Args, | |||||
| typename _Mgr = _Manager<_Tp>> | |||||
| void __do_emplace(initializer_list<_Up> __il, _Args&&... __args) | |||||
| { | |||||
| reset(); | |||||
| _Mgr::_S_create(_M_storage, __il, std::forward<_Args>(__args)...); | |||||
| _M_manager = &_Mgr::_S_manage; | |||||
| } | |||||
| template <typename _Res, typename _Tp, typename... _Args> | |||||
| using __any_constructible | |||||
| = enable_if<__and_<is_copy_constructible<_Tp>, | |||||
| is_constructible<_Tp, _Args...>>::value, | |||||
| _Res>; | |||||
| template <typename _Tp, typename... _Args> | |||||
| using __any_constructible_t | |||||
| = typename __any_constructible<bool, _Tp, _Args...>::type; | |||||
| template<typename _VTp, typename... _Args> | |||||
| using __emplace_t | |||||
| = typename __any_constructible<_VTp&, _VTp, _Args...>::type; | |||||
| public: | |||||
| // construct/destruct | |||||
| /// Default constructor, creates an empty object. | |||||
| constexpr any() noexcept : _M_manager(nullptr) { } | |||||
| /// Copy constructor, copies the state of @p __other | |||||
| any(const any& __other) | |||||
| { | |||||
| if (!__other.has_value()) | |||||
| _M_manager = nullptr; | |||||
| else | |||||
| { | |||||
| _Arg __arg; | |||||
| __arg._M_any = this; | |||||
| __other._M_manager(_Op_clone, &__other, &__arg); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * @brief Move constructor, transfer the state from @p __other | |||||
| * | |||||
| * @post @c !__other.has_value() (this postcondition is a GNU extension) | |||||
| */ | |||||
| any(any&& __other) noexcept | |||||
| { | |||||
| if (!__other.has_value()) | |||||
| _M_manager = nullptr; | |||||
| else | |||||
| { | |||||
| _Arg __arg; | |||||
| __arg._M_any = this; | |||||
| __other._M_manager(_Op_xfer, &__other, &__arg); | |||||
| } | |||||
| } | |||||
| /// Construct with a copy of @p __value as the contained object. | |||||
| template <typename _Tp, typename _VTp = _Decay_if_not_any<_Tp>, | |||||
| typename _Mgr = _Manager<_VTp>, | |||||
| enable_if_t<is_copy_constructible<_VTp>::value | |||||
| && !__is_in_place_type<_VTp>::value, bool> = true> | |||||
| any(_Tp&& __value) | |||||
| : _M_manager(&_Mgr::_S_manage) | |||||
| { | |||||
| _Mgr::_S_create(_M_storage, std::forward<_Tp>(__value)); | |||||
| } | |||||
| /// Construct with an object created from @p __args as the contained object. | |||||
| template <typename _Tp, typename... _Args, typename _VTp = decay_t<_Tp>, | |||||
| typename _Mgr = _Manager<_VTp>, | |||||
| __any_constructible_t<_VTp, _Args&&...> = false> | |||||
| explicit | |||||
| any(in_place_type_t<_Tp>, _Args&&... __args) | |||||
| : _M_manager(&_Mgr::_S_manage) | |||||
| { | |||||
| _Mgr::_S_create(_M_storage, std::forward<_Args>(__args)...); | |||||
| } | |||||
| /// Construct with an object created from @p __il and @p __args as | |||||
| /// the contained object. | |||||
| template <typename _Tp, typename _Up, typename... _Args, | |||||
| typename _VTp = decay_t<_Tp>, typename _Mgr = _Manager<_VTp>, | |||||
| __any_constructible_t<_VTp, initializer_list<_Up>, | |||||
| _Args&&...> = false> | |||||
| explicit | |||||
| any(in_place_type_t<_Tp>, initializer_list<_Up> __il, _Args&&... __args) | |||||
| : _M_manager(&_Mgr::_S_manage) | |||||
| { | |||||
| _Mgr::_S_create(_M_storage, __il, std::forward<_Args>(__args)...); | |||||
| } | |||||
| /// Destructor, calls @c reset() | |||||
| ~any() { reset(); } | |||||
| // assignments | |||||
| /// Copy the state of another object. | |||||
| any& | |||||
| operator=(const any& __rhs) | |||||
| { | |||||
| *this = any(__rhs); | |||||
| return *this; | |||||
| } | |||||
| /** | |||||
| * @brief Move assignment operator | |||||
| * | |||||
| * @post @c !__rhs.has_value() (not guaranteed for other implementations) | |||||
| */ | |||||
| any& | |||||
| operator=(any&& __rhs) noexcept | |||||
| { | |||||
| if (!__rhs.has_value()) | |||||
| reset(); | |||||
| else if (this != &__rhs) | |||||
| { | |||||
| reset(); | |||||
| _Arg __arg; | |||||
| __arg._M_any = this; | |||||
| __rhs._M_manager(_Op_xfer, &__rhs, &__arg); | |||||
| } | |||||
| return *this; | |||||
| } | |||||
| /// Store a copy of @p __rhs as the contained object. | |||||
| template<typename _Tp> | |||||
| enable_if_t<is_copy_constructible<_Decay_if_not_any<_Tp>>::value, any&> | |||||
| operator=(_Tp&& __rhs) | |||||
| { | |||||
| *this = any(std::forward<_Tp>(__rhs)); | |||||
| return *this; | |||||
| } | |||||
| /// Emplace with an object created from @p __args as the contained object. | |||||
| template <typename _Tp, typename... _Args> | |||||
| __emplace_t<decay_t<_Tp>, _Args...> | |||||
| emplace(_Args&&... __args) | |||||
| { | |||||
| using _VTp = decay_t<_Tp>; | |||||
| __do_emplace<_VTp>(std::forward<_Args>(__args)...); | |||||
| any::_Arg __arg; | |||||
| this->_M_manager(any::_Op_access, this, &__arg); | |||||
| return *static_cast<_VTp*>(__arg._M_obj); | |||||
| } | |||||
| /// Emplace with an object created from @p __il and @p __args as | |||||
| /// the contained object. | |||||
| template <typename _Tp, typename _Up, typename... _Args> | |||||
| __emplace_t<decay_t<_Tp>, initializer_list<_Up>, _Args&&...> | |||||
| emplace(initializer_list<_Up> __il, _Args&&... __args) | |||||
| { | |||||
| using _VTp = decay_t<_Tp>; | |||||
| __do_emplace<_VTp, _Up>(__il, std::forward<_Args>(__args)...); | |||||
| any::_Arg __arg; | |||||
| this->_M_manager(any::_Op_access, this, &__arg); | |||||
| return *static_cast<_VTp*>(__arg._M_obj); | |||||
| } | |||||
| // modifiers | |||||
| /// If not empty, destroy the contained object. | |||||
| void reset() noexcept | |||||
| { | |||||
| if (has_value()) | |||||
| { | |||||
| _M_manager(_Op_destroy, this, nullptr); | |||||
| _M_manager = nullptr; | |||||
| } | |||||
| } | |||||
| /// Exchange state with another object. | |||||
| void swap(any& __rhs) noexcept | |||||
| { | |||||
| if (!has_value() && !__rhs.has_value()) | |||||
| return; | |||||
| if (has_value() && __rhs.has_value()) | |||||
| { | |||||
| if (this == &__rhs) | |||||
| return; | |||||
| any __tmp; | |||||
| _Arg __arg; | |||||
| __arg._M_any = &__tmp; | |||||
| __rhs._M_manager(_Op_xfer, &__rhs, &__arg); | |||||
| __arg._M_any = &__rhs; | |||||
| _M_manager(_Op_xfer, this, &__arg); | |||||
| __arg._M_any = this; | |||||
| __tmp._M_manager(_Op_xfer, &__tmp, &__arg); | |||||
| } | |||||
| else | |||||
| { | |||||
| any* __empty = !has_value() ? this : &__rhs; | |||||
| any* __full = !has_value() ? &__rhs : this; | |||||
| _Arg __arg; | |||||
| __arg._M_any = __empty; | |||||
| __full->_M_manager(_Op_xfer, __full, &__arg); | |||||
| } | |||||
| } | |||||
| // observers | |||||
| /// Reports whether there is a contained object or not. | |||||
| bool has_value() const noexcept { return _M_manager != nullptr; } | |||||
| #if __cpp_rtti | |||||
| /// The @c typeid of the contained object, or @c typeid(void) if empty. | |||||
| const type_info& type() const noexcept | |||||
| { | |||||
| if (!has_value()) | |||||
| return typeid(void); | |||||
| _Arg __arg; | |||||
| _M_manager(_Op_get_type_info, this, &__arg); | |||||
| return *__arg._M_typeinfo; | |||||
| } | |||||
| #endif | |||||
| template<typename _Tp> | |||||
| static constexpr bool __is_valid_cast() | |||||
| { return __or_<is_reference<_Tp>, is_copy_constructible<_Tp>>::value; } | |||||
| private: | |||||
| enum _Op { | |||||
| _Op_access, _Op_get_type_info, _Op_clone, _Op_destroy, _Op_xfer | |||||
| }; | |||||
| union _Arg | |||||
| { | |||||
| void* _M_obj; | |||||
| const std::type_info* _M_typeinfo; | |||||
| any* _M_any; | |||||
| }; | |||||
| void (*_M_manager)(_Op, const any*, _Arg*); | |||||
| _Storage _M_storage; | |||||
| template<typename _Tp> | |||||
| friend void* __any_caster(const any* __any); | |||||
| // Manage in-place contained object. | |||||
| template<typename _Tp> | |||||
| struct _Manager_internal | |||||
| { | |||||
| static void | |||||
| _S_manage(_Op __which, const any* __anyp, _Arg* __arg); | |||||
| template<typename _Up> | |||||
| static void | |||||
| _S_create(_Storage& __storage, _Up&& __value) | |||||
| { | |||||
| void* __addr = &__storage._M_buffer; | |||||
| ::new (__addr) _Tp(std::forward<_Up>(__value)); | |||||
| } | |||||
| template<typename... _Args> | |||||
| static void | |||||
| _S_create(_Storage& __storage, _Args&&... __args) | |||||
| { | |||||
| void* __addr = &__storage._M_buffer; | |||||
| ::new (__addr) _Tp(std::forward<_Args>(__args)...); | |||||
| } | |||||
| }; | |||||
| // Manage external contained object. | |||||
| template<typename _Tp> | |||||
| struct _Manager_external | |||||
| { | |||||
| static void | |||||
| _S_manage(_Op __which, const any* __anyp, _Arg* __arg); | |||||
| template<typename _Up> | |||||
| static void | |||||
| _S_create(_Storage& __storage, _Up&& __value) | |||||
| { | |||||
| __storage._M_ptr = new _Tp(std::forward<_Up>(__value)); | |||||
| } | |||||
| template<typename... _Args> | |||||
| static void | |||||
| _S_create(_Storage& __storage, _Args&&... __args) | |||||
| { | |||||
| __storage._M_ptr = new _Tp(std::forward<_Args>(__args)...); | |||||
| } | |||||
| }; | |||||
| }; | |||||
| /// Exchange the states of two @c any objects. | |||||
| inline void swap(any& __x, any& __y) noexcept { __x.swap(__y); } | |||||
| /// Create an any holding a @c _Tp constructed from @c __args. | |||||
| template <typename _Tp, typename... _Args> | |||||
| any make_any(_Args&&... __args) | |||||
| { | |||||
| return any(in_place_type<_Tp>, std::forward<_Args>(__args)...); | |||||
| } | |||||
| /// Create an any holding a @c _Tp constructed from @c __il and @c __args. | |||||
| template <typename _Tp, typename _Up, typename... _Args> | |||||
| any make_any(initializer_list<_Up> __il, _Args&&... __args) | |||||
| { | |||||
| return any(in_place_type<_Tp>, __il, std::forward<_Args>(__args)...); | |||||
| } | |||||
| /** | |||||
| * @brief Access the contained object. | |||||
| * | |||||
| * @tparam _ValueType A const-reference or CopyConstructible type. | |||||
| * @param __any The object to access. | |||||
| * @return The contained object. | |||||
| * @throw bad_any_cast If <code> | |||||
| * __any.type() != typeid(remove_reference_t<_ValueType>) | |||||
| * </code> | |||||
| */ | |||||
| template<typename _ValueType> | |||||
| inline _ValueType any_cast(const any& __any) | |||||
| { | |||||
| using _Up = __remove_cvref_t<_ValueType>; | |||||
| static_assert(any::__is_valid_cast<_ValueType>(), | |||||
| "Template argument must be a reference or CopyConstructible type"); | |||||
| static_assert(is_constructible_v<_ValueType, const _Up&>, | |||||
| "Template argument must be constructible from a const value."); | |||||
| auto __p = any_cast<_Up>(&__any); | |||||
| if (__p) | |||||
| return static_cast<_ValueType>(*__p); | |||||
| __throw_bad_any_cast(); | |||||
| } | |||||
| /** | |||||
| * @brief Access the contained object. | |||||
| * | |||||
| * @tparam _ValueType A reference or CopyConstructible type. | |||||
| * @param __any The object to access. | |||||
| * @return The contained object. | |||||
| * @throw bad_any_cast If <code> | |||||
| * __any.type() != typeid(remove_reference_t<_ValueType>) | |||||
| * </code> | |||||
| * | |||||
| * @{ | |||||
| */ | |||||
| template<typename _ValueType> | |||||
| inline _ValueType any_cast(any& __any) | |||||
| { | |||||
| using _Up = __remove_cvref_t<_ValueType>; | |||||
| static_assert(any::__is_valid_cast<_ValueType>(), | |||||
| "Template argument must be a reference or CopyConstructible type"); | |||||
| static_assert(is_constructible_v<_ValueType, _Up&>, | |||||
| "Template argument must be constructible from an lvalue."); | |||||
| auto __p = any_cast<_Up>(&__any); | |||||
| if (__p) | |||||
| return static_cast<_ValueType>(*__p); | |||||
| __throw_bad_any_cast(); | |||||
| } | |||||
| template<typename _ValueType> | |||||
| inline _ValueType any_cast(any&& __any) | |||||
| { | |||||
| using _Up = __remove_cvref_t<_ValueType>; | |||||
| static_assert(any::__is_valid_cast<_ValueType>(), | |||||
| "Template argument must be a reference or CopyConstructible type"); | |||||
| static_assert(is_constructible_v<_ValueType, _Up>, | |||||
| "Template argument must be constructible from an rvalue."); | |||||
| auto __p = any_cast<_Up>(&__any); | |||||
| if (__p) | |||||
| return static_cast<_ValueType>(std::move(*__p)); | |||||
| __throw_bad_any_cast(); | |||||
| } | |||||
| // @} | |||||
| /// @cond undocumented | |||||
| template<typename _Tp> | |||||
| void* __any_caster(const any* __any) | |||||
| { | |||||
| // any_cast<T> returns non-null if __any->type() == typeid(T) and | |||||
| // typeid(T) ignores cv-qualifiers so remove them: | |||||
| using _Up = remove_cv_t<_Tp>; | |||||
| // The contained value has a decayed type, so if decay_t<U> is not U, | |||||
| // then it's not possible to have a contained value of type U: | |||||
| if constexpr (!is_same_v<decay_t<_Up>, _Up>) | |||||
| return nullptr; | |||||
| // Only copy constructible types can be used for contained values: | |||||
| else if constexpr (!is_copy_constructible_v<_Up>) | |||||
| return nullptr; | |||||
| // First try comparing function addresses, which works without RTTI | |||||
| else if (__any->_M_manager == &any::_Manager<_Up>::_S_manage | |||||
| #if __cpp_rtti | |||||
| || __any->type() == typeid(_Tp) | |||||
| #endif | |||||
| ) | |||||
| { | |||||
| any::_Arg __arg; | |||||
| __any->_M_manager(any::_Op_access, __any, &__arg); | |||||
| return __arg._M_obj; | |||||
| } | |||||
| return nullptr; | |||||
| } | |||||
| /// @endcond | |||||
| /** | |||||
| * @brief Access the contained object. | |||||
| * | |||||
| * @tparam _ValueType The type of the contained object. | |||||
| * @param __any A pointer to the object to access. | |||||
| * @return The address of the contained object if <code> | |||||
| * __any != nullptr && __any.type() == typeid(_ValueType) | |||||
| * </code>, otherwise a null pointer. | |||||
| * | |||||
| * @{ | |||||
| */ | |||||
| template<typename _ValueType> | |||||
| inline const _ValueType* any_cast(const any* __any) noexcept | |||||
| { | |||||
| if constexpr (is_object_v<_ValueType>) | |||||
| if (__any) | |||||
| return static_cast<_ValueType*>(__any_caster<_ValueType>(__any)); | |||||
| return nullptr; | |||||
| } | |||||
| template<typename _ValueType> | |||||
| inline _ValueType* any_cast(any* __any) noexcept | |||||
| { | |||||
| if constexpr (is_object_v<_ValueType>) | |||||
| if (__any) | |||||
| return static_cast<_ValueType*>(__any_caster<_ValueType>(__any)); | |||||
| return nullptr; | |||||
| } | |||||
| // @} | |||||
| template<typename _Tp> | |||||
| void | |||||
| any::_Manager_internal<_Tp>:: | |||||
| _S_manage(_Op __which, const any* __any, _Arg* __arg) | |||||
| { | |||||
| // The contained object is in _M_storage._M_buffer | |||||
| auto __ptr = reinterpret_cast<const _Tp*>(&__any->_M_storage._M_buffer); | |||||
| switch (__which) | |||||
| { | |||||
| case _Op_access: | |||||
| __arg->_M_obj = const_cast<_Tp*>(__ptr); | |||||
| break; | |||||
| case _Op_get_type_info: | |||||
| #if __cpp_rtti | |||||
| __arg->_M_typeinfo = &typeid(_Tp); | |||||
| #endif | |||||
| break; | |||||
| case _Op_clone: | |||||
| ::new(&__arg->_M_any->_M_storage._M_buffer) _Tp(*__ptr); | |||||
| __arg->_M_any->_M_manager = __any->_M_manager; | |||||
| break; | |||||
| case _Op_destroy: | |||||
| __ptr->~_Tp(); | |||||
| break; | |||||
| case _Op_xfer: | |||||
| ::new(&__arg->_M_any->_M_storage._M_buffer) _Tp | |||||
| (std::move(*const_cast<_Tp*>(__ptr))); | |||||
| __ptr->~_Tp(); | |||||
| __arg->_M_any->_M_manager = __any->_M_manager; | |||||
| const_cast<any*>(__any)->_M_manager = nullptr; | |||||
| break; | |||||
| } | |||||
| } | |||||
| template<typename _Tp> | |||||
| void | |||||
| any::_Manager_external<_Tp>:: | |||||
| _S_manage(_Op __which, const any* __any, _Arg* __arg) | |||||
| { | |||||
| // The contained object is *_M_storage._M_ptr | |||||
| auto __ptr = static_cast<const _Tp*>(__any->_M_storage._M_ptr); | |||||
| switch (__which) | |||||
| { | |||||
| case _Op_access: | |||||
| __arg->_M_obj = const_cast<_Tp*>(__ptr); | |||||
| break; | |||||
| case _Op_get_type_info: | |||||
| #if __cpp_rtti | |||||
| __arg->_M_typeinfo = &typeid(_Tp); | |||||
| #endif | |||||
| break; | |||||
| case _Op_clone: | |||||
| __arg->_M_any->_M_storage._M_ptr = new _Tp(*__ptr); | |||||
| __arg->_M_any->_M_manager = __any->_M_manager; | |||||
| break; | |||||
| case _Op_destroy: | |||||
| delete __ptr; | |||||
| break; | |||||
| case _Op_xfer: | |||||
| __arg->_M_any->_M_storage._M_ptr = __any->_M_storage._M_ptr; | |||||
| __arg->_M_any->_M_manager = __any->_M_manager; | |||||
| const_cast<any*>(__any)->_M_manager = nullptr; | |||||
| break; | |||||
| } | |||||
| } | |||||
| /// @} | |||||
| namespace __detail::__variant | |||||
| { | |||||
| template<typename> struct _Never_valueless_alt; // see <variant> | |||||
| // Provide the strong exception-safety guarantee when emplacing an | |||||
| // any into a variant. | |||||
| template<> | |||||
| struct _Never_valueless_alt<std::any> | |||||
| : std::true_type | |||||
| { }; | |||||
| } // namespace __detail::__variant | |||||
| _GLIBCXX_END_NAMESPACE_VERSION | |||||
| } // namespace std | |||||
| #endif // C++17 | |||||
| #endif // _GLIBCXX_ANY | 
| // Low-level type for atomic operations -*- C++ -*- | |||||
| // Copyright (C) 2004-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file atomic_word.h | |||||
| * This file is a GNU extension to the Standard C++ Library. | |||||
| */ | |||||
| #ifndef _GLIBCXX_ATOMIC_WORD_H | |||||
| #define _GLIBCXX_ATOMIC_WORD_H 1 | |||||
| typedef int _Atomic_word; | |||||
| // This is a memory order acquire fence. | |||||
| #define _GLIBCXX_READ_MEM_BARRIER __atomic_thread_fence (__ATOMIC_ACQUIRE) | |||||
| // This is a memory order release fence. | |||||
| #define _GLIBCXX_WRITE_MEM_BARRIER __atomic_thread_fence (__ATOMIC_RELEASE) | |||||
| #endif | 
| // Wrapper of C-language FILE struct -*- C++ -*- | |||||
| // Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| // | |||||
| // ISO C++ 14882: 27.8 File-based streams | |||||
| // | |||||
| /** @file bits/basic_file.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{ios} | |||||
| */ | |||||
| #ifndef _GLIBCXX_BASIC_FILE_STDIO_H | |||||
| #define _GLIBCXX_BASIC_FILE_STDIO_H 1 | |||||
| #pragma GCC system_header | |||||
| #include <bits/c++config.h> | |||||
| #include <bits/c++io.h> // for __c_lock and __c_file | |||||
| #include <bits/move.h> // for swap | |||||
| #include <ios> | |||||
| namespace std _GLIBCXX_VISIBILITY(default) | |||||
| { | |||||
| _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||||
| // Generic declaration. | |||||
| template<typename _CharT> | |||||
| class __basic_file; | |||||
| // Specialization. | |||||
| template<> | |||||
| class __basic_file<char> | |||||
| { | |||||
| // Underlying data source/sink. | |||||
| __c_file* _M_cfile; | |||||
| // True iff we opened _M_cfile, and thus must close it ourselves. | |||||
| bool _M_cfile_created; | |||||
| public: | |||||
| __basic_file(__c_lock* __lock = 0) throw (); | |||||
| #if __cplusplus >= 201103L | |||||
| __basic_file(__basic_file&& __rv, __c_lock* = 0) noexcept | |||||
| : _M_cfile(__rv._M_cfile), _M_cfile_created(__rv._M_cfile_created) | |||||
| { | |||||
| __rv._M_cfile = nullptr; | |||||
| __rv._M_cfile_created = false; | |||||
| } | |||||
| __basic_file& operator=(const __basic_file&) = delete; | |||||
| __basic_file& operator=(__basic_file&&) = delete; | |||||
| void | |||||
| swap(__basic_file& __f) noexcept | |||||
| { | |||||
| std::swap(_M_cfile, __f._M_cfile); | |||||
| std::swap(_M_cfile_created, __f._M_cfile_created); | |||||
| } | |||||
| #endif | |||||
| __basic_file* | |||||
| open(const char* __name, ios_base::openmode __mode, int __prot = 0664); | |||||
| #if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T | |||||
| __basic_file* | |||||
| open(const wchar_t* __name, ios_base::openmode __mode); | |||||
| #endif | |||||
| __basic_file* | |||||
| sys_open(__c_file* __file, ios_base::openmode); | |||||
| __basic_file* | |||||
| sys_open(int __fd, ios_base::openmode __mode) throw (); | |||||
| __basic_file* | |||||
| close(); | |||||
| _GLIBCXX_PURE bool | |||||
| is_open() const throw (); | |||||
| _GLIBCXX_PURE int | |||||
| fd() throw (); | |||||
| _GLIBCXX_PURE __c_file* | |||||
| file() throw (); | |||||
| ~__basic_file(); | |||||
| streamsize | |||||
| xsputn(const char* __s, streamsize __n); | |||||
| streamsize | |||||
| xsputn_2(const char* __s1, streamsize __n1, | |||||
| const char* __s2, streamsize __n2); | |||||
| streamsize | |||||
| xsgetn(char* __s, streamsize __n); | |||||
| streamoff | |||||
| seekoff(streamoff __off, ios_base::seekdir __way) throw (); | |||||
| int | |||||
| sync(); | |||||
| streamsize | |||||
| showmanyc(); | |||||
| }; | |||||
| _GLIBCXX_END_NAMESPACE_VERSION | |||||
| } // namespace | |||||
| #endif | 
| // Base to std::allocator -*- C++ -*- | |||||
| // Copyright (C) 2004-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/c++allocator.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{memory} | |||||
| */ | |||||
| #ifndef _GLIBCXX_CXX_ALLOCATOR_H | |||||
| #define _GLIBCXX_CXX_ALLOCATOR_H 1 | |||||
| #include <ext/new_allocator.h> | |||||
| #if __cplusplus >= 201103L | |||||
| namespace std | |||||
| { | |||||
| /** | |||||
| * @brief An alias to the base class for std::allocator. | |||||
| * | |||||
| * Used to set the std::allocator base class to | |||||
| * __gnu_cxx::new_allocator. | |||||
| * | |||||
| * @ingroup allocators | |||||
| * @tparam _Tp Type of allocated object. | |||||
| */ | |||||
| template<typename _Tp> | |||||
| using __allocator_base = __gnu_cxx::new_allocator<_Tp>; | |||||
| } | |||||
| #else | |||||
| // Define new_allocator as the base class to std::allocator. | |||||
| # define __allocator_base __gnu_cxx::new_allocator | |||||
| #endif | |||||
| #if defined(__SANITIZE_ADDRESS__) && !defined(_GLIBCXX_SANITIZE_STD_ALLOCATOR) | |||||
| # define _GLIBCXX_SANITIZE_STD_ALLOCATOR 1 | |||||
| #endif | |||||
| #endif | 
| // Underlying io library details -*- C++ -*- | |||||
| // Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/c++io.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{ios} | |||||
| */ | |||||
| // c_io_stdio.h - Defines for using "C" stdio.h | |||||
| #ifndef _GLIBCXX_CXX_IO_H | |||||
| #define _GLIBCXX_CXX_IO_H 1 | |||||
| #include <cstdio> | |||||
| #include <bits/gthr.h> | |||||
| namespace std _GLIBCXX_VISIBILITY(default) | |||||
| { | |||||
| _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||||
| typedef __gthread_mutex_t __c_lock; | |||||
| // for basic_file.h | |||||
| typedef FILE __c_file; | |||||
| _GLIBCXX_END_NAMESPACE_VERSION | |||||
| } // namespace | |||||
| #endif | 
| // Wrapper for underlying C-language localization -*- C++ -*- | |||||
| // Copyright (C) 2001-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/c++locale.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{locale} | |||||
| */ | |||||
| // | |||||
| // ISO C++ 14882: 22.8 Standard locale categories. | |||||
| // | |||||
| // Written by Benjamin Kosnik <bkoz@redhat.com> | |||||
| #ifndef _GLIBCXX_CXX_LOCALE_H | |||||
| #define _GLIBCXX_CXX_LOCALE_H 1 | |||||
| #pragma GCC system_header | |||||
| #include <clocale> | |||||
| #define _GLIBCXX_NUM_CATEGORIES 0 | |||||
| namespace std _GLIBCXX_VISIBILITY(default) | |||||
| { | |||||
| _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||||
| typedef int* __c_locale; | |||||
| // Convert numeric value of type double and long double to string and | |||||
| // return length of string. If vsnprintf is available use it, otherwise | |||||
| // fall back to the unsafe vsprintf which, in general, can be dangerous | |||||
| // and should be avoided. | |||||
| inline int | |||||
| __convert_from_v(const __c_locale&, char* __out, | |||||
| const int __size __attribute__((__unused__)), | |||||
| const char* __fmt, ...) | |||||
| { | |||||
| char* __old = std::setlocale(LC_NUMERIC, 0); | |||||
| char* __sav = 0; | |||||
| if (__builtin_strcmp(__old, "C")) | |||||
| { | |||||
| const size_t __len = __builtin_strlen(__old) + 1; | |||||
| __sav = new char[__len]; | |||||
| __builtin_memcpy(__sav, __old, __len); | |||||
| std::setlocale(LC_NUMERIC, "C"); | |||||
| } | |||||
| __builtin_va_list __args; | |||||
| __builtin_va_start(__args, __fmt); | |||||
| #if _GLIBCXX_USE_C99_STDIO && !_GLIBCXX_HAVE_BROKEN_VSNPRINTF | |||||
| const int __ret = __builtin_vsnprintf(__out, __size, __fmt, __args); | |||||
| #else | |||||
| const int __ret = __builtin_vsprintf(__out, __fmt, __args); | |||||
| #endif | |||||
| __builtin_va_end(__args); | |||||
| if (__sav) | |||||
| { | |||||
| std::setlocale(LC_NUMERIC, __sav); | |||||
| delete [] __sav; | |||||
| } | |||||
| return __ret; | |||||
| } | |||||
| _GLIBCXX_END_NAMESPACE_VERSION | |||||
| } // namespace | |||||
| #endif | 
| // Specific definitions for generic platforms -*- C++ -*- | |||||
| // Copyright (C) 2015-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/cpu_defines.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{iosfwd} | |||||
| */ | |||||
| #ifndef _GLIBCXX_CPU_DEFINES | |||||
| #define _GLIBCXX_CPU_DEFINES 1 | |||||
| // Integer divide instructions don't trap on ARM. | |||||
| #ifdef __ARM_ARCH_EXT_IDIV__ | |||||
| #define __glibcxx_integral_traps false | |||||
| #else | |||||
| #define __glibcxx_integral_traps true | |||||
| #endif | |||||
| #endif | 
| // Locale support -*- C++ -*- | |||||
| // Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| // | |||||
| // ISO C++ 14882: 22.1 Locales | |||||
| // | |||||
| // Information as gleaned from /usr/include/ctype.h | |||||
| namespace std _GLIBCXX_VISIBILITY(default) | |||||
| { | |||||
| _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||||
| /// @brief Base class for ctype. | |||||
| struct ctype_base | |||||
| { | |||||
| // Non-standard typedefs. | |||||
| typedef const int* __to_type; | |||||
| // NB: Offsets into ctype<char>::_M_table force a particular size | |||||
| // on the mask type. Because of this, we don't use an enum. | |||||
| typedef char mask; | |||||
| static const mask upper = _U; | |||||
| static const mask lower = _L; | |||||
| static const mask alpha = _U | _L; | |||||
| static const mask digit = _N; | |||||
| static const mask xdigit = _X | _N; | |||||
| static const mask space = _S; | |||||
| static const mask print = _P | _U | _L | _N | _B; | |||||
| static const mask graph = _P | _U | _L | _N; | |||||
| static const mask cntrl = _C; | |||||
| static const mask punct = _P; | |||||
| static const mask alnum = _U | _L | _N; | |||||
| #if __cplusplus >= 201103L | |||||
| static const mask blank = space; | |||||
| #endif | |||||
| }; | |||||
| _GLIBCXX_END_NAMESPACE_VERSION | |||||
| } // namespace | 
| // Locale support -*- C++ -*- | |||||
| // Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/ctype_inline.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{locale} | |||||
| */ | |||||
| // | |||||
| // ISO C++ 14882: 22.1 Locales | |||||
| // | |||||
| // ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) | |||||
| // functions go in ctype.cc | |||||
| namespace std _GLIBCXX_VISIBILITY(default) | |||||
| { | |||||
| _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||||
| bool | |||||
| ctype<char>:: | |||||
| is(mask __m, char __c) const | |||||
| { return _M_table[static_cast<unsigned char>(__c)] & __m; } | |||||
| const char* | |||||
| ctype<char>:: | |||||
| is(const char* __low, const char* __high, mask* __vec) const | |||||
| { | |||||
| while (__low < __high) | |||||
| *__vec++ = _M_table[static_cast<unsigned char>(*__low++)]; | |||||
| return __high; | |||||
| } | |||||
| const char* | |||||
| ctype<char>:: | |||||
| scan_is(mask __m, const char* __low, const char* __high) const | |||||
| { | |||||
| while (__low < __high && !this->is(__m, *__low)) | |||||
| ++__low; | |||||
| return __low; | |||||
| } | |||||
| const char* | |||||
| ctype<char>:: | |||||
| scan_not(mask __m, const char* __low, const char* __high) const | |||||
| { | |||||
| while (__low < __high && this->is(__m, *__low) != 0) | |||||
| ++__low; | |||||
| return __low; | |||||
| } | |||||
| _GLIBCXX_END_NAMESPACE_VERSION | |||||
| } // namespace | 
| // Control various target specific ABI tweaks. ARM version. | |||||
| // Copyright (C) 2004-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/cxxabi_tweaks.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{cxxabi.h} | |||||
| */ | |||||
| #ifndef _CXXABI_TWEAKS_H | |||||
| #define _CXXABI_TWEAKS_H 1 | |||||
| #ifdef __cplusplus | |||||
| namespace __cxxabiv1 | |||||
| { | |||||
| extern "C" | |||||
| { | |||||
| #endif | |||||
| #ifdef __ARM_EABI__ | |||||
| // The ARM EABI uses the least significant bit of a 32-bit | |||||
| // guard variable. */ | |||||
| #define _GLIBCXX_GUARD_TEST(x) ((*(x) & 1) != 0) | |||||
| #define _GLIBCXX_GUARD_SET(x) *(x) = 1 | |||||
| #define _GLIBCXX_GUARD_BIT 1 | |||||
| #define _GLIBCXX_GUARD_PENDING_BIT __guard_test_bit (1, 1) | |||||
| #define _GLIBCXX_GUARD_WAITING_BIT __guard_test_bit (2, 1) | |||||
| typedef int __guard; | |||||
| // We also want the element size in array cookies. | |||||
| #define _GLIBCXX_ELTSIZE_IN_COOKIE 1 | |||||
| // __cxa_vec_ctor should return a pointer to the array. | |||||
| typedef void * __cxa_vec_ctor_return_type; | |||||
| #define _GLIBCXX_CXA_VEC_CTOR_RETURN(x) return x | |||||
| // Constructors and destructors return the "this" pointer. | |||||
| typedef void * __cxa_cdtor_return_type; | |||||
| #else // __ARM_EABI__ | |||||
| // The generic ABI uses the first byte of a 64-bit guard variable. | |||||
| #define _GLIBCXX_GUARD_TEST(x) (*(char *) (x) != 0) | |||||
| #define _GLIBCXX_GUARD_SET(x) *(char *) (x) = 1 | |||||
| #define _GLIBCXX_GUARD_BIT __guard_test_bit (0, 1) | |||||
| #define _GLIBCXX_GUARD_PENDING_BIT __guard_test_bit (1, 1) | |||||
| #define _GLIBCXX_GUARD_WAITING_BIT __guard_test_bit (2, 1) | |||||
| __extension__ typedef int __guard __attribute__((mode (__DI__))); | |||||
| // __cxa_vec_ctor has void return type. | |||||
| typedef void __cxa_vec_ctor_return_type; | |||||
| #define _GLIBCXX_CXA_VEC_CTOR_RETURN(x) return | |||||
| // Constructors and destructors do not return a value. | |||||
| typedef void __cxa_cdtor_return_type; | |||||
| #endif //!__ARM_EABI__ | |||||
| #ifdef __cplusplus | |||||
| } | |||||
| } // namespace __cxxabiv1 | |||||
| #endif | |||||
| #endif | 
| // Specific definitions for generic platforms -*- C++ -*- | |||||
| // Copyright (C) 2007-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/error_constants.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{system_error} | |||||
| */ | |||||
| #ifndef _GLIBCXX_ERROR_CONSTANTS | |||||
| #define _GLIBCXX_ERROR_CONSTANTS 1 | |||||
| #include <bits/c++config.h> | |||||
| #include <cerrno> | |||||
| namespace std _GLIBCXX_VISIBILITY(default) | |||||
| { | |||||
| _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||||
| enum class errc | |||||
| { | |||||
| address_family_not_supported = EAFNOSUPPORT, | |||||
| address_in_use = EADDRINUSE, | |||||
| address_not_available = EADDRNOTAVAIL, | |||||
| already_connected = EISCONN, | |||||
| argument_list_too_long = E2BIG, | |||||
| argument_out_of_domain = EDOM, | |||||
| bad_address = EFAULT, | |||||
| bad_file_descriptor = EBADF, | |||||
| #ifdef _GLIBCXX_HAVE_EBADMSG | |||||
| bad_message = EBADMSG, | |||||
| #endif | |||||
| broken_pipe = EPIPE, | |||||
| connection_aborted = ECONNABORTED, | |||||
| connection_already_in_progress = EALREADY, | |||||
| connection_refused = ECONNREFUSED, | |||||
| connection_reset = ECONNRESET, | |||||
| cross_device_link = EXDEV, | |||||
| destination_address_required = EDESTADDRREQ, | |||||
| device_or_resource_busy = EBUSY, | |||||
| directory_not_empty = ENOTEMPTY, | |||||
| executable_format_error = ENOEXEC, | |||||
| file_exists = EEXIST, | |||||
| file_too_large = EFBIG, | |||||
| filename_too_long = ENAMETOOLONG, | |||||
| function_not_supported = ENOSYS, | |||||
| host_unreachable = EHOSTUNREACH, | |||||
| #ifdef _GLIBCXX_HAVE_EIDRM | |||||
| identifier_removed = EIDRM, | |||||
| #endif | |||||
| illegal_byte_sequence = EILSEQ, | |||||
| inappropriate_io_control_operation = ENOTTY, | |||||
| interrupted = EINTR, | |||||
| invalid_argument = EINVAL, | |||||
| invalid_seek = ESPIPE, | |||||
| io_error = EIO, | |||||
| is_a_directory = EISDIR, | |||||
| message_size = EMSGSIZE, | |||||
| network_down = ENETDOWN, | |||||
| network_reset = ENETRESET, | |||||
| network_unreachable = ENETUNREACH, | |||||
| no_buffer_space = ENOBUFS, | |||||
| no_child_process = ECHILD, | |||||
| #ifdef _GLIBCXX_HAVE_ENOLINK | |||||
| no_link = ENOLINK, | |||||
| #endif | |||||
| no_lock_available = ENOLCK, | |||||
| #ifdef _GLIBCXX_HAVE_ENODATA | |||||
| no_message_available = ENODATA, | |||||
| #endif | |||||
| no_message = ENOMSG, | |||||
| no_protocol_option = ENOPROTOOPT, | |||||
| no_space_on_device = ENOSPC, | |||||
| #ifdef _GLIBCXX_HAVE_ENOSR | |||||
| no_stream_resources = ENOSR, | |||||
| #endif | |||||
| no_such_device_or_address = ENXIO, | |||||
| no_such_device = ENODEV, | |||||
| no_such_file_or_directory = ENOENT, | |||||
| no_such_process = ESRCH, | |||||
| not_a_directory = ENOTDIR, | |||||
| not_a_socket = ENOTSOCK, | |||||
| #ifdef _GLIBCXX_HAVE_ENOSTR | |||||
| not_a_stream = ENOSTR, | |||||
| #endif | |||||
| not_connected = ENOTCONN, | |||||
| not_enough_memory = ENOMEM, | |||||
| #ifdef _GLIBCXX_HAVE_ENOTSUP | |||||
| not_supported = ENOTSUP, | |||||
| #endif | |||||
| #ifdef _GLIBCXX_HAVE_ECANCELED | |||||
| operation_canceled = ECANCELED, | |||||
| #endif | |||||
| operation_in_progress = EINPROGRESS, | |||||
| operation_not_permitted = EPERM, | |||||
| operation_not_supported = EOPNOTSUPP, | |||||
| operation_would_block = EWOULDBLOCK, | |||||
| #ifdef _GLIBCXX_HAVE_EOWNERDEAD | |||||
| owner_dead = EOWNERDEAD, | |||||
| #endif | |||||
| permission_denied = EACCES, | |||||
| #ifdef _GLIBCXX_HAVE_EPROTO | |||||
| protocol_error = EPROTO, | |||||
| #endif | |||||
| protocol_not_supported = EPROTONOSUPPORT, | |||||
| read_only_file_system = EROFS, | |||||
| resource_deadlock_would_occur = EDEADLK, | |||||
| resource_unavailable_try_again = EAGAIN, | |||||
| result_out_of_range = ERANGE, | |||||
| #ifdef _GLIBCXX_HAVE_ENOTRECOVERABLE | |||||
| state_not_recoverable = ENOTRECOVERABLE, | |||||
| #endif | |||||
| #ifdef _GLIBCXX_HAVE_ETIME | |||||
| stream_timeout = ETIME, | |||||
| #endif | |||||
| #ifdef _GLIBCXX_HAVE_ETXTBSY | |||||
| text_file_busy = ETXTBSY, | |||||
| #endif | |||||
| timed_out = ETIMEDOUT, | |||||
| too_many_files_open_in_system = ENFILE, | |||||
| too_many_files_open = EMFILE, | |||||
| too_many_links = EMLINK, | |||||
| too_many_symbolic_link_levels = ELOOP, | |||||
| #ifdef _GLIBCXX_HAVE_EOVERFLOW | |||||
| value_too_large = EOVERFLOW, | |||||
| #endif | |||||
| wrong_protocol_type = EPROTOTYPE | |||||
| }; | |||||
| _GLIBCXX_END_NAMESPACE_VERSION | |||||
| } // namespace | |||||
| #endif | 
| // C++ includes used for precompiling extensions -*- C++ -*- | |||||
| // Copyright (C) 2006-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file extc++.h | |||||
| * This is an implementation file for a precompiled header. | |||||
| */ | |||||
| #if __cplusplus < 201103L | |||||
| #include <bits/stdtr1c++.h> | |||||
| #else | |||||
| #include <bits/stdc++.h> | |||||
| #endif | |||||
| #include <ext/algorithm> | |||||
| #if __cplusplus >= 201103L | |||||
| # include <ext/aligned_buffer.h> | |||||
| #endif | |||||
| #include <ext/alloc_traits.h> | |||||
| #include <ext/atomicity.h> | |||||
| #include <ext/bitmap_allocator.h> | |||||
| #include <ext/cast.h> | |||||
| #if __cplusplus >= 201103L | |||||
| # include <ext/cmath> | |||||
| #endif | |||||
| #include <ext/concurrence.h> | |||||
| #include <ext/debug_allocator.h> | |||||
| #include <ext/extptr_allocator.h> | |||||
| #include <ext/functional> | |||||
| #include <ext/iterator> | |||||
| #include <ext/malloc_allocator.h> | |||||
| #include <ext/memory> | |||||
| #include <ext/mt_allocator.h> | |||||
| #include <ext/new_allocator.h> | |||||
| #include <ext/numeric> | |||||
| #include <ext/numeric_traits.h> | |||||
| #include <ext/pod_char_traits.h> | |||||
| #include <ext/pointer.h> | |||||
| #include <ext/pool_allocator.h> | |||||
| #if __cplusplus >= 201103L | |||||
| # include <ext/random> | |||||
| #endif | |||||
| #include <ext/rb_tree> | |||||
| #include <ext/rope> | |||||
| #include <ext/slist> | |||||
| #include <ext/stdio_filebuf.h> | |||||
| #include <ext/stdio_sync_filebuf.h> | |||||
| #include <ext/throw_allocator.h> | |||||
| #include <ext/typelist.h> | |||||
| #include <ext/type_traits.h> | |||||
| #include <ext/vstring.h> | |||||
| #include <ext/pb_ds/assoc_container.hpp> | |||||
| #include <ext/pb_ds/priority_queue.hpp> | |||||
| #include <ext/pb_ds/exception.hpp> | |||||
| #include <ext/pb_ds/hash_policy.hpp> | |||||
| #include <ext/pb_ds/list_update_policy.hpp> | |||||
| #include <ext/pb_ds/tree_policy.hpp> | |||||
| #include <ext/pb_ds/trie_policy.hpp> | |||||
| #ifdef _GLIBCXX_HAVE_ICONV | |||||
| #include <ext/codecvt_specializations.h> | |||||
| #include <ext/enc_filebuf.h> | |||||
| #endif | 
| /* Threads compatibility routines for libgcc2 and libobjc. */ | |||||
| /* Compile this one with gcc. */ | |||||
| /* Copyright (C) 1997-2020 Free Software Foundation, Inc. | |||||
| This file is part of GCC. | |||||
| GCC is free software; you can redistribute it and/or modify it under | |||||
| the terms of the GNU General Public License as published by the Free | |||||
| Software Foundation; either version 3, or (at your option) any later | |||||
| version. | |||||
| GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |||||
| WARRANTY; without even the implied warranty of MERCHANTABILITY or | |||||
| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |||||
| for more details. | |||||
| Under Section 7 of GPL version 3, you are granted additional | |||||
| permissions described in the GCC Runtime Library Exception, version | |||||
| 3.1, as published by the Free Software Foundation. | |||||
| You should have received a copy of the GNU General Public License and | |||||
| a copy of the GCC Runtime Library Exception along with this program; | |||||
| see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| <http://www.gnu.org/licenses/>. */ | |||||
| #ifndef _GLIBCXX_GCC_GTHR_SINGLE_H | |||||
| #define _GLIBCXX_GCC_GTHR_SINGLE_H | |||||
| /* Just provide compatibility for mutex handling. */ | |||||
| typedef int __gthread_key_t; | |||||
| typedef int __gthread_once_t; | |||||
| typedef int __gthread_mutex_t; | |||||
| typedef int __gthread_recursive_mutex_t; | |||||
| #define __GTHREAD_ONCE_INIT 0 | |||||
| #define __GTHREAD_MUTEX_INIT 0 | |||||
| #define __GTHREAD_MUTEX_INIT_FUNCTION(mx) do {} while (0) | |||||
| #define __GTHREAD_RECURSIVE_MUTEX_INIT 0 | |||||
| #define _GLIBCXX_UNUSED __attribute__((__unused__)) | |||||
| #ifdef _LIBOBJC | |||||
| /* Thread local storage for a single thread */ | |||||
| static void *thread_local_storage = NULL; | |||||
| /* Backend initialization functions */ | |||||
| /* Initialize the threads subsystem. */ | |||||
| static inline int | |||||
| __gthread_objc_init_thread_system (void) | |||||
| { | |||||
| /* No thread support available */ | |||||
| return -1; | |||||
| } | |||||
| /* Close the threads subsystem. */ | |||||
| static inline int | |||||
| __gthread_objc_close_thread_system (void) | |||||
| { | |||||
| /* No thread support available */ | |||||
| return -1; | |||||
| } | |||||
| /* Backend thread functions */ | |||||
| /* Create a new thread of execution. */ | |||||
| static inline objc_thread_t | |||||
| __gthread_objc_thread_detach (void (* func)(void *), void * arg _GLIBCXX_UNUSED) | |||||
| { | |||||
| /* No thread support available */ | |||||
| return NULL; | |||||
| } | |||||
| /* Set the current thread's priority. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_set_priority (int priority _GLIBCXX_UNUSED) | |||||
| { | |||||
| /* No thread support available */ | |||||
| return -1; | |||||
| } | |||||
| /* Return the current thread's priority. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_get_priority (void) | |||||
| { | |||||
| return OBJC_THREAD_INTERACTIVE_PRIORITY; | |||||
| } | |||||
| /* Yield our process time to another thread. */ | |||||
| static inline void | |||||
| __gthread_objc_thread_yield (void) | |||||
| { | |||||
| return; | |||||
| } | |||||
| /* Terminate the current thread. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_exit (void) | |||||
| { | |||||
| /* No thread support available */ | |||||
| /* Should we really exit the program */ | |||||
| /* exit (&__objc_thread_exit_status); */ | |||||
| return -1; | |||||
| } | |||||
| /* Returns an integer value which uniquely describes a thread. */ | |||||
| static inline objc_thread_t | |||||
| __gthread_objc_thread_id (void) | |||||
| { | |||||
| /* No thread support, use 1. */ | |||||
| return (objc_thread_t) 1; | |||||
| } | |||||
| /* Sets the thread's local storage pointer. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_set_data (void *value) | |||||
| { | |||||
| thread_local_storage = value; | |||||
| return 0; | |||||
| } | |||||
| /* Returns the thread's local storage pointer. */ | |||||
| static inline void * | |||||
| __gthread_objc_thread_get_data (void) | |||||
| { | |||||
| return thread_local_storage; | |||||
| } | |||||
| /* Backend mutex functions */ | |||||
| /* Allocate a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_allocate (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Deallocate a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_deallocate (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Grab a lock on a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_lock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| /* There can only be one thread, so we always get the lock */ | |||||
| return 0; | |||||
| } | |||||
| /* Try to grab a lock on a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_trylock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| /* There can only be one thread, so we always get the lock */ | |||||
| return 0; | |||||
| } | |||||
| /* Unlock the mutex */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_unlock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Backend condition mutex functions */ | |||||
| /* Allocate a condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_allocate (objc_condition_t condition _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Deallocate a condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_deallocate (objc_condition_t condition _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Wait on the condition */ | |||||
| static inline int | |||||
| __gthread_objc_condition_wait (objc_condition_t condition _GLIBCXX_UNUSED, | |||||
| objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Wake up all threads waiting on this condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_broadcast (objc_condition_t condition _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Wake up one thread waiting on this condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_signal (objc_condition_t condition _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| #else /* _LIBOBJC */ | |||||
| static inline int | |||||
| __gthread_active_p (void) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_once (__gthread_once_t *__once _GLIBCXX_UNUSED, void (*__func) (void) _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int _GLIBCXX_UNUSED | |||||
| __gthread_key_create (__gthread_key_t *__key _GLIBCXX_UNUSED, void (*__func) (void *) _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static int _GLIBCXX_UNUSED | |||||
| __gthread_key_delete (__gthread_key_t __key _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline void * | |||||
| __gthread_getspecific (__gthread_key_t __key _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_setspecific (__gthread_key_t __key _GLIBCXX_UNUSED, const void *__v _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_destroy (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_lock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_trylock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_unlock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_lock (__mutex); | |||||
| } | |||||
| static inline int | |||||
| __gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_trylock (__mutex); | |||||
| } | |||||
| static inline int | |||||
| __gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_unlock (__mutex); | |||||
| } | |||||
| static inline int | |||||
| __gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_destroy (__mutex); | |||||
| } | |||||
| #endif /* _LIBOBJC */ | |||||
| #undef _GLIBCXX_UNUSED | |||||
| #endif /* ! _GLIBCXX_GCC_GTHR_SINGLE_H */ | 
| /* Threads compatibility routines for libgcc2 and libobjc. */ | |||||
| /* Compile this one with gcc. */ | |||||
| /* Copyright (C) 1997-2020 Free Software Foundation, Inc. | |||||
| This file is part of GCC. | |||||
| GCC is free software; you can redistribute it and/or modify it under | |||||
| the terms of the GNU General Public License as published by the Free | |||||
| Software Foundation; either version 3, or (at your option) any later | |||||
| version. | |||||
| GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |||||
| WARRANTY; without even the implied warranty of MERCHANTABILITY or | |||||
| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |||||
| for more details. | |||||
| Under Section 7 of GPL version 3, you are granted additional | |||||
| permissions described in the GCC Runtime Library Exception, version | |||||
| 3.1, as published by the Free Software Foundation. | |||||
| You should have received a copy of the GNU General Public License and | |||||
| a copy of the GCC Runtime Library Exception along with this program; | |||||
| see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| <http://www.gnu.org/licenses/>. */ | |||||
| #ifndef _GLIBCXX_GCC_GTHR_POSIX_H | |||||
| #define _GLIBCXX_GCC_GTHR_POSIX_H | |||||
| /* POSIX threads specific definitions. | |||||
| Easy, since the interface is just one-to-one mapping. */ | |||||
| #define __GTHREADS 1 | |||||
| #define __GTHREADS_CXX0X 1 | |||||
| #include <pthread.h> | |||||
| #if ((defined(_LIBOBJC) || defined(_LIBOBJC_WEAK)) \ | |||||
| || !defined(_GTHREAD_USE_MUTEX_TIMEDLOCK)) | |||||
| # include <unistd.h> | |||||
| # if defined(_POSIX_TIMEOUTS) && _POSIX_TIMEOUTS >= 0 | |||||
| # define _GTHREAD_USE_MUTEX_TIMEDLOCK 1 | |||||
| # else | |||||
| # define _GTHREAD_USE_MUTEX_TIMEDLOCK 0 | |||||
| # endif | |||||
| #endif | |||||
| typedef pthread_t __gthread_t; | |||||
| typedef pthread_key_t __gthread_key_t; | |||||
| typedef pthread_once_t __gthread_once_t; | |||||
| typedef pthread_mutex_t __gthread_mutex_t; | |||||
| typedef pthread_mutex_t __gthread_recursive_mutex_t; | |||||
| typedef pthread_cond_t __gthread_cond_t; | |||||
| typedef struct timespec __gthread_time_t; | |||||
| /* POSIX like conditional variables are supported. Please look at comments | |||||
| in gthr.h for details. */ | |||||
| #define __GTHREAD_HAS_COND 1 | |||||
| #define __GTHREAD_MUTEX_INIT PTHREAD_MUTEX_INITIALIZER | |||||
| #define __GTHREAD_MUTEX_INIT_FUNCTION __gthread_mutex_init_function | |||||
| #define __GTHREAD_ONCE_INIT PTHREAD_ONCE_INIT | |||||
| #if defined(PTHREAD_RECURSIVE_MUTEX_INITIALIZER) | |||||
| #define __GTHREAD_RECURSIVE_MUTEX_INIT PTHREAD_RECURSIVE_MUTEX_INITIALIZER | |||||
| #elif defined(PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP) | |||||
| #define __GTHREAD_RECURSIVE_MUTEX_INIT PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP | |||||
| #else | |||||
| #define __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION __gthread_recursive_mutex_init_function | |||||
| #endif | |||||
| #define __GTHREAD_COND_INIT PTHREAD_COND_INITIALIZER | |||||
| #define __GTHREAD_TIME_INIT {0,0} | |||||
| #ifdef _GTHREAD_USE_MUTEX_INIT_FUNC | |||||
| # undef __GTHREAD_MUTEX_INIT | |||||
| #endif | |||||
| #ifdef _GTHREAD_USE_RECURSIVE_MUTEX_INIT_FUNC | |||||
| # undef __GTHREAD_RECURSIVE_MUTEX_INIT | |||||
| # undef __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION | |||||
| # define __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION __gthread_recursive_mutex_init_function | |||||
| #endif | |||||
| #ifdef _GTHREAD_USE_COND_INIT_FUNC | |||||
| # undef __GTHREAD_COND_INIT | |||||
| # define __GTHREAD_COND_INIT_FUNCTION __gthread_cond_init_function | |||||
| #endif | |||||
| #if __GXX_WEAK__ && _GLIBCXX_GTHREAD_USE_WEAK | |||||
| # ifndef __gthrw_pragma | |||||
| # define __gthrw_pragma(pragma) | |||||
| # endif | |||||
| # define __gthrw2(name,name2,type) \ | |||||
| static __typeof(type) name \ | |||||
| __attribute__ ((__weakref__(#name2), __copy__ (type))); \ | |||||
| __gthrw_pragma(weak type) | |||||
| # define __gthrw_(name) __gthrw_ ## name | |||||
| #else | |||||
| # define __gthrw2(name,name2,type) | |||||
| # define __gthrw_(name) name | |||||
| #endif | |||||
| /* Typically, __gthrw_foo is a weak reference to symbol foo. */ | |||||
| #define __gthrw(name) __gthrw2(__gthrw_ ## name,name,name) | |||||
| __gthrw(pthread_once) | |||||
| __gthrw(pthread_getspecific) | |||||
| __gthrw(pthread_setspecific) | |||||
| __gthrw(pthread_create) | |||||
| __gthrw(pthread_join) | |||||
| __gthrw(pthread_equal) | |||||
| __gthrw(pthread_self) | |||||
| __gthrw(pthread_detach) | |||||
| #ifndef __BIONIC__ | |||||
| __gthrw(pthread_cancel) | |||||
| #endif | |||||
| __gthrw(sched_yield) | |||||
| __gthrw(pthread_mutex_lock) | |||||
| __gthrw(pthread_mutex_trylock) | |||||
| #if _GTHREAD_USE_MUTEX_TIMEDLOCK | |||||
| __gthrw(pthread_mutex_timedlock) | |||||
| #endif | |||||
| __gthrw(pthread_mutex_unlock) | |||||
| __gthrw(pthread_mutex_init) | |||||
| __gthrw(pthread_mutex_destroy) | |||||
| __gthrw(pthread_cond_init) | |||||
| __gthrw(pthread_cond_broadcast) | |||||
| __gthrw(pthread_cond_signal) | |||||
| __gthrw(pthread_cond_wait) | |||||
| __gthrw(pthread_cond_timedwait) | |||||
| __gthrw(pthread_cond_destroy) | |||||
| __gthrw(pthread_key_create) | |||||
| __gthrw(pthread_key_delete) | |||||
| __gthrw(pthread_mutexattr_init) | |||||
| __gthrw(pthread_mutexattr_settype) | |||||
| __gthrw(pthread_mutexattr_destroy) | |||||
| #if defined(_LIBOBJC) || defined(_LIBOBJC_WEAK) | |||||
| /* Objective-C. */ | |||||
| __gthrw(pthread_exit) | |||||
| #ifdef _POSIX_PRIORITY_SCHEDULING | |||||
| #ifdef _POSIX_THREAD_PRIORITY_SCHEDULING | |||||
| __gthrw(sched_get_priority_max) | |||||
| __gthrw(sched_get_priority_min) | |||||
| #endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ | |||||
| #endif /* _POSIX_PRIORITY_SCHEDULING */ | |||||
| __gthrw(pthread_attr_destroy) | |||||
| __gthrw(pthread_attr_init) | |||||
| __gthrw(pthread_attr_setdetachstate) | |||||
| #ifdef _POSIX_THREAD_PRIORITY_SCHEDULING | |||||
| __gthrw(pthread_getschedparam) | |||||
| __gthrw(pthread_setschedparam) | |||||
| #endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ | |||||
| #endif /* _LIBOBJC || _LIBOBJC_WEAK */ | |||||
| #if __GXX_WEAK__ && _GLIBCXX_GTHREAD_USE_WEAK | |||||
| /* On Solaris 2.6 up to 9, the libc exposes a POSIX threads interface even if | |||||
| -pthreads is not specified. The functions are dummies and most return an | |||||
| error value. However pthread_once returns 0 without invoking the routine | |||||
| it is passed so we cannot pretend that the interface is active if -pthreads | |||||
| is not specified. On Solaris 2.5.1, the interface is not exposed at all so | |||||
| we need to play the usual game with weak symbols. On Solaris 10 and up, a | |||||
| working interface is always exposed. On FreeBSD 6 and later, libc also | |||||
| exposes a dummy POSIX threads interface, similar to what Solaris 2.6 up | |||||
| to 9 does. FreeBSD >= 700014 even provides a pthread_cancel stub in libc, | |||||
| which means the alternate __gthread_active_p below cannot be used there. */ | |||||
| #if defined(__FreeBSD__) || (defined(__sun) && defined(__svr4__)) | |||||
| static volatile int __gthread_active = -1; | |||||
| static void | |||||
| __gthread_trigger (void) | |||||
| { | |||||
| __gthread_active = 1; | |||||
| } | |||||
| static inline int | |||||
| __gthread_active_p (void) | |||||
| { | |||||
| static pthread_mutex_t __gthread_active_mutex = PTHREAD_MUTEX_INITIALIZER; | |||||
| static pthread_once_t __gthread_active_once = PTHREAD_ONCE_INIT; | |||||
| /* Avoid reading __gthread_active twice on the main code path. */ | |||||
| int __gthread_active_latest_value = __gthread_active; | |||||
| /* This test is not protected to avoid taking a lock on the main code | |||||
| path so every update of __gthread_active in a threaded program must | |||||
| be atomic with regard to the result of the test. */ | |||||
| if (__builtin_expect (__gthread_active_latest_value < 0, 0)) | |||||
| { | |||||
| if (__gthrw_(pthread_once)) | |||||
| { | |||||
| /* If this really is a threaded program, then we must ensure that | |||||
| __gthread_active has been set to 1 before exiting this block. */ | |||||
| __gthrw_(pthread_mutex_lock) (&__gthread_active_mutex); | |||||
| __gthrw_(pthread_once) (&__gthread_active_once, __gthread_trigger); | |||||
| __gthrw_(pthread_mutex_unlock) (&__gthread_active_mutex); | |||||
| } | |||||
| /* Make sure we'll never enter this block again. */ | |||||
| if (__gthread_active < 0) | |||||
| __gthread_active = 0; | |||||
| __gthread_active_latest_value = __gthread_active; | |||||
| } | |||||
| return __gthread_active_latest_value != 0; | |||||
| } | |||||
| #else /* neither FreeBSD nor Solaris */ | |||||
| /* For a program to be multi-threaded the only thing that it certainly must | |||||
| be using is pthread_create. However, there may be other libraries that | |||||
| intercept pthread_create with their own definitions to wrap pthreads | |||||
| functionality for some purpose. In those cases, pthread_create being | |||||
| defined might not necessarily mean that libpthread is actually linked | |||||
| in. | |||||
| For the GNU C library, we can use a known internal name. This is always | |||||
| available in the ABI, but no other library would define it. That is | |||||
| ideal, since any public pthread function might be intercepted just as | |||||
| pthread_create might be. __pthread_key_create is an "internal" | |||||
| implementation symbol, but it is part of the public exported ABI. Also, | |||||
| it's among the symbols that the static libpthread.a always links in | |||||
| whenever pthread_create is used, so there is no danger of a false | |||||
| negative result in any statically-linked, multi-threaded program. | |||||
| For others, we choose pthread_cancel as a function that seems unlikely | |||||
| to be redefined by an interceptor library. The bionic (Android) C | |||||
| library does not provide pthread_cancel, so we do use pthread_create | |||||
| there (and interceptor libraries lose). */ | |||||
| #ifdef __GLIBC__ | |||||
| __gthrw2(__gthrw_(__pthread_key_create), | |||||
| __pthread_key_create, | |||||
| pthread_key_create) | |||||
| # define GTHR_ACTIVE_PROXY __gthrw_(__pthread_key_create) | |||||
| #elif defined (__BIONIC__) | |||||
| # define GTHR_ACTIVE_PROXY __gthrw_(pthread_create) | |||||
| #else | |||||
| # define GTHR_ACTIVE_PROXY __gthrw_(pthread_cancel) | |||||
| #endif | |||||
| static inline int | |||||
| __gthread_active_p (void) | |||||
| { | |||||
| static void *const __gthread_active_ptr | |||||
| = __extension__ (void *) >HR_ACTIVE_PROXY; | |||||
| return __gthread_active_ptr != 0; | |||||
| } | |||||
| #endif /* FreeBSD or Solaris */ | |||||
| #else /* not __GXX_WEAK__ */ | |||||
| /* Similar to Solaris, HP-UX 11 for PA-RISC provides stubs for pthread | |||||
| calls in shared flavors of the HP-UX C library. Most of the stubs | |||||
| have no functionality. The details are described in the "libc cumulative | |||||
| patch" for each subversion of HP-UX 11. There are two special interfaces | |||||
| provided for checking whether an application is linked to a shared pthread | |||||
| library or not. However, these interfaces aren't available in early | |||||
| libpthread libraries. We also need a test that works for archive | |||||
| libraries. We can't use pthread_once as some libc versions call the | |||||
| init function. We also can't use pthread_create or pthread_attr_init | |||||
| as these create a thread and thereby prevent changing the default stack | |||||
| size. The function pthread_default_stacksize_np is available in both | |||||
| the archive and shared versions of libpthread. It can be used to | |||||
| determine the default pthread stack size. There is a stub in some | |||||
| shared libc versions which returns a zero size if pthreads are not | |||||
| active. We provide an equivalent stub to handle cases where libc | |||||
| doesn't provide one. */ | |||||
| #if defined(__hppa__) && defined(__hpux__) | |||||
| static volatile int __gthread_active = -1; | |||||
| static inline int | |||||
| __gthread_active_p (void) | |||||
| { | |||||
| /* Avoid reading __gthread_active twice on the main code path. */ | |||||
| int __gthread_active_latest_value = __gthread_active; | |||||
| size_t __s; | |||||
| if (__builtin_expect (__gthread_active_latest_value < 0, 0)) | |||||
| { | |||||
| pthread_default_stacksize_np (0, &__s); | |||||
| __gthread_active = __s ? 1 : 0; | |||||
| __gthread_active_latest_value = __gthread_active; | |||||
| } | |||||
| return __gthread_active_latest_value != 0; | |||||
| } | |||||
| #else /* not hppa-hpux */ | |||||
| static inline int | |||||
| __gthread_active_p (void) | |||||
| { | |||||
| return 1; | |||||
| } | |||||
| #endif /* hppa-hpux */ | |||||
| #endif /* __GXX_WEAK__ */ | |||||
| #ifdef _LIBOBJC | |||||
| /* This is the config.h file in libobjc/ */ | |||||
| #include <config.h> | |||||
| #ifdef HAVE_SCHED_H | |||||
| # include <sched.h> | |||||
| #endif | |||||
| /* Key structure for maintaining thread specific storage */ | |||||
| static pthread_key_t _objc_thread_storage; | |||||
| static pthread_attr_t _objc_thread_attribs; | |||||
| /* Thread local storage for a single thread */ | |||||
| static void *thread_local_storage = NULL; | |||||
| /* Backend initialization functions */ | |||||
| /* Initialize the threads subsystem. */ | |||||
| static inline int | |||||
| __gthread_objc_init_thread_system (void) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| { | |||||
| /* Initialize the thread storage key. */ | |||||
| if (__gthrw_(pthread_key_create) (&_objc_thread_storage, NULL) == 0) | |||||
| { | |||||
| /* The normal default detach state for threads is | |||||
| * PTHREAD_CREATE_JOINABLE which causes threads to not die | |||||
| * when you think they should. */ | |||||
| if (__gthrw_(pthread_attr_init) (&_objc_thread_attribs) == 0 | |||||
| && __gthrw_(pthread_attr_setdetachstate) (&_objc_thread_attribs, | |||||
| PTHREAD_CREATE_DETACHED) == 0) | |||||
| return 0; | |||||
| } | |||||
| } | |||||
| return -1; | |||||
| } | |||||
| /* Close the threads subsystem. */ | |||||
| static inline int | |||||
| __gthread_objc_close_thread_system (void) | |||||
| { | |||||
| if (__gthread_active_p () | |||||
| && __gthrw_(pthread_key_delete) (_objc_thread_storage) == 0 | |||||
| && __gthrw_(pthread_attr_destroy) (&_objc_thread_attribs) == 0) | |||||
| return 0; | |||||
| return -1; | |||||
| } | |||||
| /* Backend thread functions */ | |||||
| /* Create a new thread of execution. */ | |||||
| static inline objc_thread_t | |||||
| __gthread_objc_thread_detach (void (*func)(void *), void *arg) | |||||
| { | |||||
| objc_thread_t thread_id; | |||||
| pthread_t new_thread_handle; | |||||
| if (!__gthread_active_p ()) | |||||
| return NULL; | |||||
| if (!(__gthrw_(pthread_create) (&new_thread_handle, &_objc_thread_attribs, | |||||
| (void *) func, arg))) | |||||
| thread_id = (objc_thread_t) new_thread_handle; | |||||
| else | |||||
| thread_id = NULL; | |||||
| return thread_id; | |||||
| } | |||||
| /* Set the current thread's priority. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_set_priority (int priority) | |||||
| { | |||||
| if (!__gthread_active_p ()) | |||||
| return -1; | |||||
| else | |||||
| { | |||||
| #ifdef _POSIX_PRIORITY_SCHEDULING | |||||
| #ifdef _POSIX_THREAD_PRIORITY_SCHEDULING | |||||
| pthread_t thread_id = __gthrw_(pthread_self) (); | |||||
| int policy; | |||||
| struct sched_param params; | |||||
| int priority_min, priority_max; | |||||
| if (__gthrw_(pthread_getschedparam) (thread_id, &policy, ¶ms) == 0) | |||||
| { | |||||
| if ((priority_max = __gthrw_(sched_get_priority_max) (policy)) == -1) | |||||
| return -1; | |||||
| if ((priority_min = __gthrw_(sched_get_priority_min) (policy)) == -1) | |||||
| return -1; | |||||
| if (priority > priority_max) | |||||
| priority = priority_max; | |||||
| else if (priority < priority_min) | |||||
| priority = priority_min; | |||||
| params.sched_priority = priority; | |||||
| /* | |||||
| * The solaris 7 and several other man pages incorrectly state that | |||||
| * this should be a pointer to policy but pthread.h is universally | |||||
| * at odds with this. | |||||
| */ | |||||
| if (__gthrw_(pthread_setschedparam) (thread_id, policy, ¶ms) == 0) | |||||
| return 0; | |||||
| } | |||||
| #endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ | |||||
| #endif /* _POSIX_PRIORITY_SCHEDULING */ | |||||
| return -1; | |||||
| } | |||||
| } | |||||
| /* Return the current thread's priority. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_get_priority (void) | |||||
| { | |||||
| #ifdef _POSIX_PRIORITY_SCHEDULING | |||||
| #ifdef _POSIX_THREAD_PRIORITY_SCHEDULING | |||||
| if (__gthread_active_p ()) | |||||
| { | |||||
| int policy; | |||||
| struct sched_param params; | |||||
| if (__gthrw_(pthread_getschedparam) (__gthrw_(pthread_self) (), &policy, ¶ms) == 0) | |||||
| return params.sched_priority; | |||||
| else | |||||
| return -1; | |||||
| } | |||||
| else | |||||
| #endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ | |||||
| #endif /* _POSIX_PRIORITY_SCHEDULING */ | |||||
| return OBJC_THREAD_INTERACTIVE_PRIORITY; | |||||
| } | |||||
| /* Yield our process time to another thread. */ | |||||
| static inline void | |||||
| __gthread_objc_thread_yield (void) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| __gthrw_(sched_yield) (); | |||||
| } | |||||
| /* Terminate the current thread. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_exit (void) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| /* exit the thread */ | |||||
| __gthrw_(pthread_exit) (&__objc_thread_exit_status); | |||||
| /* Failed if we reached here */ | |||||
| return -1; | |||||
| } | |||||
| /* Returns an integer value which uniquely describes a thread. */ | |||||
| static inline objc_thread_t | |||||
| __gthread_objc_thread_id (void) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return (objc_thread_t) __gthrw_(pthread_self) (); | |||||
| else | |||||
| return (objc_thread_t) 1; | |||||
| } | |||||
| /* Sets the thread's local storage pointer. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_set_data (void *value) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_setspecific) (_objc_thread_storage, value); | |||||
| else | |||||
| { | |||||
| thread_local_storage = value; | |||||
| return 0; | |||||
| } | |||||
| } | |||||
| /* Returns the thread's local storage pointer. */ | |||||
| static inline void * | |||||
| __gthread_objc_thread_get_data (void) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_getspecific) (_objc_thread_storage); | |||||
| else | |||||
| return thread_local_storage; | |||||
| } | |||||
| /* Backend mutex functions */ | |||||
| /* Allocate a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_allocate (objc_mutex_t mutex) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| { | |||||
| mutex->backend = objc_malloc (sizeof (pthread_mutex_t)); | |||||
| if (__gthrw_(pthread_mutex_init) ((pthread_mutex_t *) mutex->backend, NULL)) | |||||
| { | |||||
| objc_free (mutex->backend); | |||||
| mutex->backend = NULL; | |||||
| return -1; | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| /* Deallocate a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_deallocate (objc_mutex_t mutex) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| { | |||||
| int count; | |||||
| /* | |||||
| * Posix Threads specifically require that the thread be unlocked | |||||
| * for __gthrw_(pthread_mutex_destroy) to work. | |||||
| */ | |||||
| do | |||||
| { | |||||
| count = __gthrw_(pthread_mutex_unlock) ((pthread_mutex_t *) mutex->backend); | |||||
| if (count < 0) | |||||
| return -1; | |||||
| } | |||||
| while (count); | |||||
| if (__gthrw_(pthread_mutex_destroy) ((pthread_mutex_t *) mutex->backend)) | |||||
| return -1; | |||||
| objc_free (mutex->backend); | |||||
| mutex->backend = NULL; | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| /* Grab a lock on a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_lock (objc_mutex_t mutex) | |||||
| { | |||||
| if (__gthread_active_p () | |||||
| && __gthrw_(pthread_mutex_lock) ((pthread_mutex_t *) mutex->backend) != 0) | |||||
| { | |||||
| return -1; | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| /* Try to grab a lock on a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_trylock (objc_mutex_t mutex) | |||||
| { | |||||
| if (__gthread_active_p () | |||||
| && __gthrw_(pthread_mutex_trylock) ((pthread_mutex_t *) mutex->backend) != 0) | |||||
| { | |||||
| return -1; | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| /* Unlock the mutex */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_unlock (objc_mutex_t mutex) | |||||
| { | |||||
| if (__gthread_active_p () | |||||
| && __gthrw_(pthread_mutex_unlock) ((pthread_mutex_t *) mutex->backend) != 0) | |||||
| { | |||||
| return -1; | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| /* Backend condition mutex functions */ | |||||
| /* Allocate a condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_allocate (objc_condition_t condition) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| { | |||||
| condition->backend = objc_malloc (sizeof (pthread_cond_t)); | |||||
| if (__gthrw_(pthread_cond_init) ((pthread_cond_t *) condition->backend, NULL)) | |||||
| { | |||||
| objc_free (condition->backend); | |||||
| condition->backend = NULL; | |||||
| return -1; | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| /* Deallocate a condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_deallocate (objc_condition_t condition) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| { | |||||
| if (__gthrw_(pthread_cond_destroy) ((pthread_cond_t *) condition->backend)) | |||||
| return -1; | |||||
| objc_free (condition->backend); | |||||
| condition->backend = NULL; | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| /* Wait on the condition */ | |||||
| static inline int | |||||
| __gthread_objc_condition_wait (objc_condition_t condition, objc_mutex_t mutex) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_cond_wait) ((pthread_cond_t *) condition->backend, | |||||
| (pthread_mutex_t *) mutex->backend); | |||||
| else | |||||
| return 0; | |||||
| } | |||||
| /* Wake up all threads waiting on this condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_broadcast (objc_condition_t condition) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_cond_broadcast) ((pthread_cond_t *) condition->backend); | |||||
| else | |||||
| return 0; | |||||
| } | |||||
| /* Wake up one thread waiting on this condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_signal (objc_condition_t condition) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_cond_signal) ((pthread_cond_t *) condition->backend); | |||||
| else | |||||
| return 0; | |||||
| } | |||||
| #else /* _LIBOBJC */ | |||||
| static inline int | |||||
| __gthread_create (__gthread_t *__threadid, void *(*__func) (void*), | |||||
| void *__args) | |||||
| { | |||||
| return __gthrw_(pthread_create) (__threadid, NULL, __func, __args); | |||||
| } | |||||
| static inline int | |||||
| __gthread_join (__gthread_t __threadid, void **__value_ptr) | |||||
| { | |||||
| return __gthrw_(pthread_join) (__threadid, __value_ptr); | |||||
| } | |||||
| static inline int | |||||
| __gthread_detach (__gthread_t __threadid) | |||||
| { | |||||
| return __gthrw_(pthread_detach) (__threadid); | |||||
| } | |||||
| static inline int | |||||
| __gthread_equal (__gthread_t __t1, __gthread_t __t2) | |||||
| { | |||||
| return __gthrw_(pthread_equal) (__t1, __t2); | |||||
| } | |||||
| static inline __gthread_t | |||||
| __gthread_self (void) | |||||
| { | |||||
| return __gthrw_(pthread_self) (); | |||||
| } | |||||
| static inline int | |||||
| __gthread_yield (void) | |||||
| { | |||||
| return __gthrw_(sched_yield) (); | |||||
| } | |||||
| static inline int | |||||
| __gthread_once (__gthread_once_t *__once, void (*__func) (void)) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_once) (__once, __func); | |||||
| else | |||||
| return -1; | |||||
| } | |||||
| static inline int | |||||
| __gthread_key_create (__gthread_key_t *__key, void (*__dtor) (void *)) | |||||
| { | |||||
| return __gthrw_(pthread_key_create) (__key, __dtor); | |||||
| } | |||||
| static inline int | |||||
| __gthread_key_delete (__gthread_key_t __key) | |||||
| { | |||||
| return __gthrw_(pthread_key_delete) (__key); | |||||
| } | |||||
| static inline void * | |||||
| __gthread_getspecific (__gthread_key_t __key) | |||||
| { | |||||
| return __gthrw_(pthread_getspecific) (__key); | |||||
| } | |||||
| static inline int | |||||
| __gthread_setspecific (__gthread_key_t __key, const void *__ptr) | |||||
| { | |||||
| return __gthrw_(pthread_setspecific) (__key, __ptr); | |||||
| } | |||||
| static inline void | |||||
| __gthread_mutex_init_function (__gthread_mutex_t *__mutex) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| __gthrw_(pthread_mutex_init) (__mutex, NULL); | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_destroy (__gthread_mutex_t *__mutex) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_mutex_destroy) (__mutex); | |||||
| else | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_lock (__gthread_mutex_t *__mutex) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_mutex_lock) (__mutex); | |||||
| else | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_trylock (__gthread_mutex_t *__mutex) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_mutex_trylock) (__mutex); | |||||
| else | |||||
| return 0; | |||||
| } | |||||
| #if _GTHREAD_USE_MUTEX_TIMEDLOCK | |||||
| static inline int | |||||
| __gthread_mutex_timedlock (__gthread_mutex_t *__mutex, | |||||
| const __gthread_time_t *__abs_timeout) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_mutex_timedlock) (__mutex, __abs_timeout); | |||||
| else | |||||
| return 0; | |||||
| } | |||||
| #endif | |||||
| static inline int | |||||
| __gthread_mutex_unlock (__gthread_mutex_t *__mutex) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_mutex_unlock) (__mutex); | |||||
| else | |||||
| return 0; | |||||
| } | |||||
| #if !defined( PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP) \ | |||||
| || defined(_GTHREAD_USE_RECURSIVE_MUTEX_INIT_FUNC) | |||||
| static inline int | |||||
| __gthread_recursive_mutex_init_function (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| { | |||||
| pthread_mutexattr_t __attr; | |||||
| int __r; | |||||
| __r = __gthrw_(pthread_mutexattr_init) (&__attr); | |||||
| if (!__r) | |||||
| __r = __gthrw_(pthread_mutexattr_settype) (&__attr, | |||||
| PTHREAD_MUTEX_RECURSIVE); | |||||
| if (!__r) | |||||
| __r = __gthrw_(pthread_mutex_init) (__mutex, &__attr); | |||||
| if (!__r) | |||||
| __r = __gthrw_(pthread_mutexattr_destroy) (&__attr); | |||||
| return __r; | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| #endif | |||||
| static inline int | |||||
| __gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_lock (__mutex); | |||||
| } | |||||
| static inline int | |||||
| __gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_trylock (__mutex); | |||||
| } | |||||
| #if _GTHREAD_USE_MUTEX_TIMEDLOCK | |||||
| static inline int | |||||
| __gthread_recursive_mutex_timedlock (__gthread_recursive_mutex_t *__mutex, | |||||
| const __gthread_time_t *__abs_timeout) | |||||
| { | |||||
| return __gthread_mutex_timedlock (__mutex, __abs_timeout); | |||||
| } | |||||
| #endif | |||||
| static inline int | |||||
| __gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_unlock (__mutex); | |||||
| } | |||||
| static inline int | |||||
| __gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_destroy (__mutex); | |||||
| } | |||||
| #ifdef _GTHREAD_USE_COND_INIT_FUNC | |||||
| static inline void | |||||
| __gthread_cond_init_function (__gthread_cond_t *__cond) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| __gthrw_(pthread_cond_init) (__cond, NULL); | |||||
| } | |||||
| #endif | |||||
| static inline int | |||||
| __gthread_cond_broadcast (__gthread_cond_t *__cond) | |||||
| { | |||||
| return __gthrw_(pthread_cond_broadcast) (__cond); | |||||
| } | |||||
| static inline int | |||||
| __gthread_cond_signal (__gthread_cond_t *__cond) | |||||
| { | |||||
| return __gthrw_(pthread_cond_signal) (__cond); | |||||
| } | |||||
| static inline int | |||||
| __gthread_cond_wait (__gthread_cond_t *__cond, __gthread_mutex_t *__mutex) | |||||
| { | |||||
| return __gthrw_(pthread_cond_wait) (__cond, __mutex); | |||||
| } | |||||
| static inline int | |||||
| __gthread_cond_timedwait (__gthread_cond_t *__cond, __gthread_mutex_t *__mutex, | |||||
| const __gthread_time_t *__abs_timeout) | |||||
| { | |||||
| return __gthrw_(pthread_cond_timedwait) (__cond, __mutex, __abs_timeout); | |||||
| } | |||||
| static inline int | |||||
| __gthread_cond_wait_recursive (__gthread_cond_t *__cond, | |||||
| __gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_cond_wait (__cond, __mutex); | |||||
| } | |||||
| static inline int | |||||
| __gthread_cond_destroy (__gthread_cond_t* __cond) | |||||
| { | |||||
| return __gthrw_(pthread_cond_destroy) (__cond); | |||||
| } | |||||
| #endif /* _LIBOBJC */ | |||||
| #endif /* ! _GLIBCXX_GCC_GTHR_POSIX_H */ | 
| /* Threads compatibility routines for libgcc2 and libobjc. */ | |||||
| /* Compile this one with gcc. */ | |||||
| /* Copyright (C) 1997-2020 Free Software Foundation, Inc. | |||||
| This file is part of GCC. | |||||
| GCC is free software; you can redistribute it and/or modify it under | |||||
| the terms of the GNU General Public License as published by the Free | |||||
| Software Foundation; either version 3, or (at your option) any later | |||||
| version. | |||||
| GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |||||
| WARRANTY; without even the implied warranty of MERCHANTABILITY or | |||||
| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |||||
| for more details. | |||||
| Under Section 7 of GPL version 3, you are granted additional | |||||
| permissions described in the GCC Runtime Library Exception, version | |||||
| 3.1, as published by the Free Software Foundation. | |||||
| You should have received a copy of the GNU General Public License and | |||||
| a copy of the GCC Runtime Library Exception along with this program; | |||||
| see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| <http://www.gnu.org/licenses/>. */ | |||||
| #ifndef _GLIBCXX_GCC_GTHR_SINGLE_H | |||||
| #define _GLIBCXX_GCC_GTHR_SINGLE_H | |||||
| /* Just provide compatibility for mutex handling. */ | |||||
| typedef int __gthread_key_t; | |||||
| typedef int __gthread_once_t; | |||||
| typedef int __gthread_mutex_t; | |||||
| typedef int __gthread_recursive_mutex_t; | |||||
| #define __GTHREAD_ONCE_INIT 0 | |||||
| #define __GTHREAD_MUTEX_INIT 0 | |||||
| #define __GTHREAD_MUTEX_INIT_FUNCTION(mx) do {} while (0) | |||||
| #define __GTHREAD_RECURSIVE_MUTEX_INIT 0 | |||||
| #define _GLIBCXX_UNUSED __attribute__((__unused__)) | |||||
| #ifdef _LIBOBJC | |||||
| /* Thread local storage for a single thread */ | |||||
| static void *thread_local_storage = NULL; | |||||
| /* Backend initialization functions */ | |||||
| /* Initialize the threads subsystem. */ | |||||
| static inline int | |||||
| __gthread_objc_init_thread_system (void) | |||||
| { | |||||
| /* No thread support available */ | |||||
| return -1; | |||||
| } | |||||
| /* Close the threads subsystem. */ | |||||
| static inline int | |||||
| __gthread_objc_close_thread_system (void) | |||||
| { | |||||
| /* No thread support available */ | |||||
| return -1; | |||||
| } | |||||
| /* Backend thread functions */ | |||||
| /* Create a new thread of execution. */ | |||||
| static inline objc_thread_t | |||||
| __gthread_objc_thread_detach (void (* func)(void *), void * arg _GLIBCXX_UNUSED) | |||||
| { | |||||
| /* No thread support available */ | |||||
| return NULL; | |||||
| } | |||||
| /* Set the current thread's priority. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_set_priority (int priority _GLIBCXX_UNUSED) | |||||
| { | |||||
| /* No thread support available */ | |||||
| return -1; | |||||
| } | |||||
| /* Return the current thread's priority. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_get_priority (void) | |||||
| { | |||||
| return OBJC_THREAD_INTERACTIVE_PRIORITY; | |||||
| } | |||||
| /* Yield our process time to another thread. */ | |||||
| static inline void | |||||
| __gthread_objc_thread_yield (void) | |||||
| { | |||||
| return; | |||||
| } | |||||
| /* Terminate the current thread. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_exit (void) | |||||
| { | |||||
| /* No thread support available */ | |||||
| /* Should we really exit the program */ | |||||
| /* exit (&__objc_thread_exit_status); */ | |||||
| return -1; | |||||
| } | |||||
| /* Returns an integer value which uniquely describes a thread. */ | |||||
| static inline objc_thread_t | |||||
| __gthread_objc_thread_id (void) | |||||
| { | |||||
| /* No thread support, use 1. */ | |||||
| return (objc_thread_t) 1; | |||||
| } | |||||
| /* Sets the thread's local storage pointer. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_set_data (void *value) | |||||
| { | |||||
| thread_local_storage = value; | |||||
| return 0; | |||||
| } | |||||
| /* Returns the thread's local storage pointer. */ | |||||
| static inline void * | |||||
| __gthread_objc_thread_get_data (void) | |||||
| { | |||||
| return thread_local_storage; | |||||
| } | |||||
| /* Backend mutex functions */ | |||||
| /* Allocate a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_allocate (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Deallocate a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_deallocate (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Grab a lock on a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_lock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| /* There can only be one thread, so we always get the lock */ | |||||
| return 0; | |||||
| } | |||||
| /* Try to grab a lock on a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_trylock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| /* There can only be one thread, so we always get the lock */ | |||||
| return 0; | |||||
| } | |||||
| /* Unlock the mutex */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_unlock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Backend condition mutex functions */ | |||||
| /* Allocate a condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_allocate (objc_condition_t condition _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Deallocate a condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_deallocate (objc_condition_t condition _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Wait on the condition */ | |||||
| static inline int | |||||
| __gthread_objc_condition_wait (objc_condition_t condition _GLIBCXX_UNUSED, | |||||
| objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Wake up all threads waiting on this condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_broadcast (objc_condition_t condition _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Wake up one thread waiting on this condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_signal (objc_condition_t condition _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| #else /* _LIBOBJC */ | |||||
| static inline int | |||||
| __gthread_active_p (void) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_once (__gthread_once_t *__once _GLIBCXX_UNUSED, void (*__func) (void) _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int _GLIBCXX_UNUSED | |||||
| __gthread_key_create (__gthread_key_t *__key _GLIBCXX_UNUSED, void (*__func) (void *) _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static int _GLIBCXX_UNUSED | |||||
| __gthread_key_delete (__gthread_key_t __key _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline void * | |||||
| __gthread_getspecific (__gthread_key_t __key _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_setspecific (__gthread_key_t __key _GLIBCXX_UNUSED, const void *__v _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_destroy (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_lock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_trylock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_unlock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_lock (__mutex); | |||||
| } | |||||
| static inline int | |||||
| __gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_trylock (__mutex); | |||||
| } | |||||
| static inline int | |||||
| __gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_unlock (__mutex); | |||||
| } | |||||
| static inline int | |||||
| __gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_destroy (__mutex); | |||||
| } | |||||
| #endif /* _LIBOBJC */ | |||||
| #undef _GLIBCXX_UNUSED | |||||
| #endif /* ! _GLIBCXX_GCC_GTHR_SINGLE_H */ | 
| /* Threads compatibility routines for libgcc2. */ | |||||
| /* Compile this one with gcc. */ | |||||
| /* Copyright (C) 1997-2020 Free Software Foundation, Inc. | |||||
| This file is part of GCC. | |||||
| GCC is free software; you can redistribute it and/or modify it under | |||||
| the terms of the GNU General Public License as published by the Free | |||||
| Software Foundation; either version 3, or (at your option) any later | |||||
| version. | |||||
| GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |||||
| WARRANTY; without even the implied warranty of MERCHANTABILITY or | |||||
| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |||||
| for more details. | |||||
| Under Section 7 of GPL version 3, you are granted additional | |||||
| permissions described in the GCC Runtime Library Exception, version | |||||
| 3.1, as published by the Free Software Foundation. | |||||
| You should have received a copy of the GNU General Public License and | |||||
| a copy of the GCC Runtime Library Exception along with this program; | |||||
| see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| <http://www.gnu.org/licenses/>. */ | |||||
| #ifndef _GLIBCXX_GCC_GTHR_H | |||||
| #define _GLIBCXX_GCC_GTHR_H | |||||
| #ifndef _GLIBCXX_HIDE_EXPORTS | |||||
| #pragma GCC visibility push(default) | |||||
| #endif | |||||
| /* If this file is compiled with threads support, it must | |||||
| #define __GTHREADS 1 | |||||
| to indicate that threads support is present. Also it has define | |||||
| function | |||||
| int __gthread_active_p () | |||||
| that returns 1 if thread system is active, 0 if not. | |||||
| The threads interface must define the following types: | |||||
| __gthread_key_t | |||||
| __gthread_once_t | |||||
| __gthread_mutex_t | |||||
| __gthread_recursive_mutex_t | |||||
| The threads interface must define the following macros: | |||||
| __GTHREAD_ONCE_INIT | |||||
| to initialize __gthread_once_t | |||||
| __GTHREAD_MUTEX_INIT | |||||
| to initialize __gthread_mutex_t to get a fast | |||||
| non-recursive mutex. | |||||
| __GTHREAD_MUTEX_INIT_FUNCTION | |||||
| to initialize __gthread_mutex_t to get a fast | |||||
| non-recursive mutex. | |||||
| Define this to a function which looks like this: | |||||
| void __GTHREAD_MUTEX_INIT_FUNCTION (__gthread_mutex_t *) | |||||
| Some systems can't initialize a mutex without a | |||||
| function call. Don't define __GTHREAD_MUTEX_INIT in this case. | |||||
| __GTHREAD_RECURSIVE_MUTEX_INIT | |||||
| __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION | |||||
| as above, but for a recursive mutex. | |||||
| The threads interface must define the following static functions: | |||||
| int __gthread_once (__gthread_once_t *once, void (*func) ()) | |||||
| int __gthread_key_create (__gthread_key_t *keyp, void (*dtor) (void *)) | |||||
| int __gthread_key_delete (__gthread_key_t key) | |||||
| void *__gthread_getspecific (__gthread_key_t key) | |||||
| int __gthread_setspecific (__gthread_key_t key, const void *ptr) | |||||
| int __gthread_mutex_destroy (__gthread_mutex_t *mutex); | |||||
| int __gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *mutex); | |||||
| int __gthread_mutex_lock (__gthread_mutex_t *mutex); | |||||
| int __gthread_mutex_trylock (__gthread_mutex_t *mutex); | |||||
| int __gthread_mutex_unlock (__gthread_mutex_t *mutex); | |||||
| int __gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *mutex); | |||||
| int __gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *mutex); | |||||
| int __gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *mutex); | |||||
| The following are supported in POSIX threads only. They are required to | |||||
| fix a deadlock in static initialization inside libsupc++. The header file | |||||
| gthr-posix.h defines a symbol __GTHREAD_HAS_COND to signify that these extra | |||||
| features are supported. | |||||
| Types: | |||||
| __gthread_cond_t | |||||
| Macros: | |||||
| __GTHREAD_COND_INIT | |||||
| __GTHREAD_COND_INIT_FUNCTION | |||||
| Interface: | |||||
| int __gthread_cond_broadcast (__gthread_cond_t *cond); | |||||
| int __gthread_cond_wait (__gthread_cond_t *cond, __gthread_mutex_t *mutex); | |||||
| int __gthread_cond_wait_recursive (__gthread_cond_t *cond, | |||||
| __gthread_recursive_mutex_t *mutex); | |||||
| All functions returning int should return zero on success or the error | |||||
| number. If the operation is not supported, -1 is returned. | |||||
| If the following are also defined, you should | |||||
| #define __GTHREADS_CXX0X 1 | |||||
| to enable the c++0x thread library. | |||||
| Types: | |||||
| __gthread_t | |||||
| __gthread_time_t | |||||
| Interface: | |||||
| int __gthread_create (__gthread_t *thread, void *(*func) (void*), | |||||
| void *args); | |||||
| int __gthread_join (__gthread_t thread, void **value_ptr); | |||||
| int __gthread_detach (__gthread_t thread); | |||||
| int __gthread_equal (__gthread_t t1, __gthread_t t2); | |||||
| __gthread_t __gthread_self (void); | |||||
| int __gthread_yield (void); | |||||
| int __gthread_mutex_timedlock (__gthread_mutex_t *m, | |||||
| const __gthread_time_t *abs_timeout); | |||||
| int __gthread_recursive_mutex_timedlock (__gthread_recursive_mutex_t *m, | |||||
| const __gthread_time_t *abs_time); | |||||
| int __gthread_cond_signal (__gthread_cond_t *cond); | |||||
| int __gthread_cond_timedwait (__gthread_cond_t *cond, | |||||
| __gthread_mutex_t *mutex, | |||||
| const __gthread_time_t *abs_timeout); | |||||
| */ | |||||
| #if __GXX_WEAK__ | |||||
| /* The pe-coff weak support isn't fully compatible to ELF's weak. | |||||
| For static libraries it might would work, but as we need to deal | |||||
| with shared versions too, we disable it for mingw-targets. */ | |||||
| #ifdef __MINGW32__ | |||||
| #undef _GLIBCXX_GTHREAD_USE_WEAK | |||||
| #define _GLIBCXX_GTHREAD_USE_WEAK 0 | |||||
| #endif | |||||
| #ifndef _GLIBCXX_GTHREAD_USE_WEAK | |||||
| #define _GLIBCXX_GTHREAD_USE_WEAK 1 | |||||
| #endif | |||||
| #endif | |||||
| #include <bits/gthr-default.h> | |||||
| #ifndef _GLIBCXX_HIDE_EXPORTS | |||||
| #pragma GCC visibility pop | |||||
| #endif | |||||
| #endif /* ! _GLIBCXX_GCC_GTHR_H */ | 
| // std::messages implementation details, generic version -*- C++ -*- | |||||
| // Copyright (C) 2001-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/messages_members.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{locale} | |||||
| */ | |||||
| // | |||||
| // ISO C++ 14882: 22.2.7.1.2 messages virtual functions | |||||
| // | |||||
| // Written by Benjamin Kosnik <bkoz@redhat.com> | |||||
| namespace std _GLIBCXX_VISIBILITY(default) | |||||
| { | |||||
| _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||||
| // Non-virtual member functions. | |||||
| template<typename _CharT> | |||||
| messages<_CharT>::messages(size_t __refs) | |||||
| : facet(__refs) | |||||
| { _M_c_locale_messages = _S_get_c_locale(); } | |||||
| template<typename _CharT> | |||||
| messages<_CharT>::messages(__c_locale, const char*, size_t __refs) | |||||
| : facet(__refs) | |||||
| { _M_c_locale_messages = _S_get_c_locale(); } | |||||
| template<typename _CharT> | |||||
| typename messages<_CharT>::catalog | |||||
| messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc, | |||||
| const char*) const | |||||
| { return this->do_open(__s, __loc); } | |||||
| // Virtual member functions. | |||||
| template<typename _CharT> | |||||
| messages<_CharT>::~messages() | |||||
| { _S_destroy_c_locale(_M_c_locale_messages); } | |||||
| template<typename _CharT> | |||||
| typename messages<_CharT>::catalog | |||||
| messages<_CharT>::do_open(const basic_string<char>&, const locale&) const | |||||
| { return 0; } | |||||
| template<typename _CharT> | |||||
| typename messages<_CharT>::string_type | |||||
| messages<_CharT>::do_get(catalog, int, int, | |||||
| const string_type& __dfault) const | |||||
| { return __dfault; } | |||||
| template<typename _CharT> | |||||
| void | |||||
| messages<_CharT>::do_close(catalog) const | |||||
| { } | |||||
| // messages_byname | |||||
| template<typename _CharT> | |||||
| messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs) | |||||
| : messages<_CharT>(__refs) | |||||
| { | |||||
| if (__builtin_strcmp(__s, "C") != 0 | |||||
| && __builtin_strcmp(__s, "POSIX") != 0) | |||||
| { | |||||
| this->_S_destroy_c_locale(this->_M_c_locale_messages); | |||||
| this->_S_create_c_locale(this->_M_c_locale_messages, __s); | |||||
| } | |||||
| } | |||||
| _GLIBCXX_END_NAMESPACE_VERSION | |||||
| } // namespace | 
| // Optimizations for random number handling, generic version -*- C++ -*- | |||||
| // Copyright (C) 2012-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/opt_random.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{random} | |||||
| */ | |||||
| #ifndef _BITS_OPT_RANDOM_H | |||||
| #define _BITS_OPT_RANDOM_H 1 | |||||
| #pragma GCC system_header | |||||
| #endif // _BITS_OPT_RANDOM_H | 
| // Specific definitions for newlib -*- C++ -*- | |||||
| // Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/os_defines.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{iosfwd} | |||||
| */ | |||||
| #ifndef _GLIBCXX_OS_DEFINES | |||||
| #define _GLIBCXX_OS_DEFINES 1 | |||||
| // System-specific #define, typedefs, corrections, etc, go here. This | |||||
| // file will come before all others. | |||||
| #ifdef __CYGWIN__ | |||||
| #define _GLIBCXX_GTHREAD_USE_WEAK 0 | |||||
| #if defined (_GLIBCXX_DLL) | |||||
| #define _GLIBCXX_PSEUDO_VISIBILITY_default __attribute__ ((__dllimport__)) | |||||
| #else | |||||
| #define _GLIBCXX_PSEUDO_VISIBILITY_default | |||||
| #endif | |||||
| #define _GLIBCXX_PSEUDO_VISIBILITY_hidden | |||||
| #define _GLIBCXX_PSEUDO_VISIBILITY(V) _GLIBCXX_PSEUDO_VISIBILITY_ ## V | |||||
| // See libstdc++/20806. | |||||
| #define _GLIBCXX_HAVE_DOS_BASED_FILESYSTEM 1 | |||||
| // Enable use of GetModuleHandleEx (requires Windows XP/2003) in | |||||
| // __cxa_thread_atexit to prevent modules from being unloaded before | |||||
| // their dtors are called | |||||
| #define _GLIBCXX_THREAD_ATEXIT_WIN32 1 | |||||
| // See libstdc++/69506 | |||||
| #define _GLIBCXX_USE_WEAK_REF 0 | |||||
| #endif | |||||
| #endif | 
| // C++ includes used for precompiling -*- C++ -*- | |||||
| // Copyright (C) 2003-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file stdc++.h | |||||
| * This is an implementation file for a precompiled header. | |||||
| */ | |||||
| // 17.4.1.2 Headers | |||||
| // C | |||||
| #ifndef _GLIBCXX_NO_ASSERT | |||||
| #include <cassert> | |||||
| #endif | |||||
| #include <cctype> | |||||
| #include <cerrno> | |||||
| #include <cfloat> | |||||
| #include <ciso646> | |||||
| #include <climits> | |||||
| #include <clocale> | |||||
| #include <cmath> | |||||
| #include <csetjmp> | |||||
| #include <csignal> | |||||
| #include <cstdarg> | |||||
| #include <cstddef> | |||||
| #include <cstdio> | |||||
| #include <cstdlib> | |||||
| #include <cstring> | |||||
| #include <ctime> | |||||
| #include <cwchar> | |||||
| #include <cwctype> | |||||
| #if __cplusplus >= 201103L | |||||
| #include <ccomplex> | |||||
| #include <cfenv> | |||||
| #include <cinttypes> | |||||
| #include <cstdalign> | |||||
| #include <cstdbool> | |||||
| #include <cstdint> | |||||
| #include <ctgmath> | |||||
| #include <cuchar> | |||||
| #endif | |||||
| // C++ | |||||
| #include <algorithm> | |||||
| #include <bitset> | |||||
| #include <complex> | |||||
| #include <deque> | |||||
| #include <exception> | |||||
| #include <fstream> | |||||
| #include <functional> | |||||
| #include <iomanip> | |||||
| #include <ios> | |||||
| #include <iosfwd> | |||||
| #include <iostream> | |||||
| #include <istream> | |||||
| #include <iterator> | |||||
| #include <limits> | |||||
| #include <list> | |||||
| #include <locale> | |||||
| #include <map> | |||||
| #include <memory> | |||||
| #include <new> | |||||
| #include <numeric> | |||||
| #include <ostream> | |||||
| #include <queue> | |||||
| #include <set> | |||||
| #include <sstream> | |||||
| #include <stack> | |||||
| #include <stdexcept> | |||||
| #include <streambuf> | |||||
| #include <string> | |||||
| #include <typeinfo> | |||||
| #include <utility> | |||||
| #include <valarray> | |||||
| #include <vector> | |||||
| #if __cplusplus >= 201103L | |||||
| #include <array> | |||||
| #include <atomic> | |||||
| #include <chrono> | |||||
| #include <codecvt> | |||||
| #include <condition_variable> | |||||
| #include <forward_list> | |||||
| #include <future> | |||||
| #include <initializer_list> | |||||
| #include <mutex> | |||||
| #include <random> | |||||
| #include <ratio> | |||||
| #include <regex> | |||||
| #include <scoped_allocator> | |||||
| #include <system_error> | |||||
| #include <thread> | |||||
| #include <tuple> | |||||
| #include <typeindex> | |||||
| #include <type_traits> | |||||
| #include <unordered_map> | |||||
| #include <unordered_set> | |||||
| #endif | |||||
| #if __cplusplus >= 201402L | |||||
| #include <shared_mutex> | |||||
| #endif | |||||
| #if __cplusplus >= 201703L | |||||
| #include <any> | |||||
| #include <charconv> | |||||
| // #include <execution> | |||||
| #include <filesystem> | |||||
| #include <optional> | |||||
| #include <memory_resource> | |||||
| #include <string_view> | |||||
| #include <variant> | |||||
| #endif | |||||
| #if __cplusplus > 201703L | |||||
| #include <bit> | |||||
| #include <compare> | |||||
| #include <concepts> | |||||
| #include <numbers> | |||||
| #include <ranges> | |||||
| #include <span> | |||||
| #include <stop_token> | |||||
| // #include <syncstream> | |||||
| #include <version> | |||||
| #endif | 
| // C++ includes used for precompiling TR1 -*- C++ -*- | |||||
| // Copyright (C) 2006-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file stdtr1c++.h | |||||
| * This is an implementation file for a precompiled header. | |||||
| */ | |||||
| #include <bits/stdc++.h> | |||||
| #include <tr1/array> | |||||
| #include <tr1/cctype> | |||||
| #include <tr1/cfenv> | |||||
| #include <tr1/cfloat> | |||||
| #include <tr1/cinttypes> | |||||
| #include <tr1/climits> | |||||
| #include <tr1/cmath> | |||||
| #include <tr1/complex> | |||||
| #include <tr1/cstdarg> | |||||
| #include <tr1/cstdbool> | |||||
| #include <tr1/cstdint> | |||||
| #include <tr1/cstdio> | |||||
| #include <tr1/cstdlib> | |||||
| #include <tr1/ctgmath> | |||||
| #include <tr1/ctime> | |||||
| #include <tr1/cwchar> | |||||
| #include <tr1/cwctype> | |||||
| #include <tr1/functional> | |||||
| #include <tr1/random> | |||||
| #include <tr1/tuple> | |||||
| #include <tr1/unordered_map> | |||||
| #include <tr1/unordered_set> | |||||
| #include <tr1/utility> | 
| // std::time_get, std::time_put implementation, generic version -*- C++ -*- | |||||
| // Copyright (C) 2001-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/time_members.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{locale} | |||||
| */ | |||||
| // | |||||
| // ISO C++ 14882: 22.2.5.1.2 - time_get functions | |||||
| // ISO C++ 14882: 22.2.5.3.2 - time_put functions | |||||
| // | |||||
| // Written by Benjamin Kosnik <bkoz@redhat.com> | |||||
| namespace std _GLIBCXX_VISIBILITY(default) | |||||
| { | |||||
| _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||||
| template<typename _CharT> | |||||
| __timepunct<_CharT>::__timepunct(size_t __refs) | |||||
| : facet(__refs), _M_data(0) | |||||
| { | |||||
| _M_name_timepunct = _S_get_c_name(); | |||||
| _M_initialize_timepunct(); | |||||
| } | |||||
| template<typename _CharT> | |||||
| __timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs) | |||||
| : facet(__refs), _M_data(__cache) | |||||
| { | |||||
| _M_name_timepunct = _S_get_c_name(); | |||||
| _M_initialize_timepunct(); | |||||
| } | |||||
| template<typename _CharT> | |||||
| __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s, | |||||
| size_t __refs) | |||||
| : facet(__refs), _M_data(0) | |||||
| { | |||||
| if (__builtin_strcmp(__s, _S_get_c_name()) != 0) | |||||
| { | |||||
| const size_t __len = __builtin_strlen(__s) + 1; | |||||
| char* __tmp = new char[__len]; | |||||
| __builtin_memcpy(__tmp, __s, __len); | |||||
| _M_name_timepunct = __tmp; | |||||
| } | |||||
| else | |||||
| _M_name_timepunct = _S_get_c_name(); | |||||
| __try | |||||
| { _M_initialize_timepunct(__cloc); } | |||||
| __catch(...) | |||||
| { | |||||
| if (_M_name_timepunct != _S_get_c_name()) | |||||
| delete [] _M_name_timepunct; | |||||
| __throw_exception_again; | |||||
| } | |||||
| } | |||||
| template<typename _CharT> | |||||
| __timepunct<_CharT>::~__timepunct() | |||||
| { | |||||
| if (_M_name_timepunct != _S_get_c_name()) | |||||
| delete [] _M_name_timepunct; | |||||
| delete _M_data; | |||||
| _S_destroy_c_locale(_M_c_locale_timepunct); | |||||
| } | |||||
| _GLIBCXX_END_NAMESPACE_VERSION | |||||
| } // namespace | 
| // Optimizations for random number extensions, generic version -*- C++ -*- | |||||
| // Copyright (C) 2012-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file ext/opt_random.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{ext/random} | |||||
| */ | |||||
| #ifndef _EXT_OPT_RANDOM_H | |||||
| #define _EXT_OPT_RANDOM_H 1 | |||||
| #pragma GCC system_header | |||||
| #endif // _EXT_OPT_RANDOM_H | 
| // Low-level type for atomic operations -*- C++ -*- | |||||
| // Copyright (C) 2004-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file atomic_word.h | |||||
| * This file is a GNU extension to the Standard C++ Library. | |||||
| */ | |||||
| #ifndef _GLIBCXX_ATOMIC_WORD_H | |||||
| #define _GLIBCXX_ATOMIC_WORD_H 1 | |||||
| typedef int _Atomic_word; | |||||
| // This is a memory order acquire fence. | |||||
| #define _GLIBCXX_READ_MEM_BARRIER __atomic_thread_fence (__ATOMIC_ACQUIRE) | |||||
| // This is a memory order release fence. | |||||
| #define _GLIBCXX_WRITE_MEM_BARRIER __atomic_thread_fence (__ATOMIC_RELEASE) | |||||
| #endif | 
| // Wrapper of C-language FILE struct -*- C++ -*- | |||||
| // Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| // | |||||
| // ISO C++ 14882: 27.8 File-based streams | |||||
| // | |||||
| /** @file bits/basic_file.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{ios} | |||||
| */ | |||||
| #ifndef _GLIBCXX_BASIC_FILE_STDIO_H | |||||
| #define _GLIBCXX_BASIC_FILE_STDIO_H 1 | |||||
| #pragma GCC system_header | |||||
| #include <bits/c++config.h> | |||||
| #include <bits/c++io.h> // for __c_lock and __c_file | |||||
| #include <bits/move.h> // for swap | |||||
| #include <ios> | |||||
| namespace std _GLIBCXX_VISIBILITY(default) | |||||
| { | |||||
| _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||||
| // Generic declaration. | |||||
| template<typename _CharT> | |||||
| class __basic_file; | |||||
| // Specialization. | |||||
| template<> | |||||
| class __basic_file<char> | |||||
| { | |||||
| // Underlying data source/sink. | |||||
| __c_file* _M_cfile; | |||||
| // True iff we opened _M_cfile, and thus must close it ourselves. | |||||
| bool _M_cfile_created; | |||||
| public: | |||||
| __basic_file(__c_lock* __lock = 0) throw (); | |||||
| #if __cplusplus >= 201103L | |||||
| __basic_file(__basic_file&& __rv, __c_lock* = 0) noexcept | |||||
| : _M_cfile(__rv._M_cfile), _M_cfile_created(__rv._M_cfile_created) | |||||
| { | |||||
| __rv._M_cfile = nullptr; | |||||
| __rv._M_cfile_created = false; | |||||
| } | |||||
| __basic_file& operator=(const __basic_file&) = delete; | |||||
| __basic_file& operator=(__basic_file&&) = delete; | |||||
| void | |||||
| swap(__basic_file& __f) noexcept | |||||
| { | |||||
| std::swap(_M_cfile, __f._M_cfile); | |||||
| std::swap(_M_cfile_created, __f._M_cfile_created); | |||||
| } | |||||
| #endif | |||||
| __basic_file* | |||||
| open(const char* __name, ios_base::openmode __mode, int __prot = 0664); | |||||
| #if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T | |||||
| __basic_file* | |||||
| open(const wchar_t* __name, ios_base::openmode __mode); | |||||
| #endif | |||||
| __basic_file* | |||||
| sys_open(__c_file* __file, ios_base::openmode); | |||||
| __basic_file* | |||||
| sys_open(int __fd, ios_base::openmode __mode) throw (); | |||||
| __basic_file* | |||||
| close(); | |||||
| _GLIBCXX_PURE bool | |||||
| is_open() const throw (); | |||||
| _GLIBCXX_PURE int | |||||
| fd() throw (); | |||||
| _GLIBCXX_PURE __c_file* | |||||
| file() throw (); | |||||
| ~__basic_file(); | |||||
| streamsize | |||||
| xsputn(const char* __s, streamsize __n); | |||||
| streamsize | |||||
| xsputn_2(const char* __s1, streamsize __n1, | |||||
| const char* __s2, streamsize __n2); | |||||
| streamsize | |||||
| xsgetn(char* __s, streamsize __n); | |||||
| streamoff | |||||
| seekoff(streamoff __off, ios_base::seekdir __way) throw (); | |||||
| int | |||||
| sync(); | |||||
| streamsize | |||||
| showmanyc(); | |||||
| }; | |||||
| _GLIBCXX_END_NAMESPACE_VERSION | |||||
| } // namespace | |||||
| #endif | 
| // Base to std::allocator -*- C++ -*- | |||||
| // Copyright (C) 2004-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/c++allocator.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{memory} | |||||
| */ | |||||
| #ifndef _GLIBCXX_CXX_ALLOCATOR_H | |||||
| #define _GLIBCXX_CXX_ALLOCATOR_H 1 | |||||
| #include <ext/new_allocator.h> | |||||
| #if __cplusplus >= 201103L | |||||
| namespace std | |||||
| { | |||||
| /** | |||||
| * @brief An alias to the base class for std::allocator. | |||||
| * | |||||
| * Used to set the std::allocator base class to | |||||
| * __gnu_cxx::new_allocator. | |||||
| * | |||||
| * @ingroup allocators | |||||
| * @tparam _Tp Type of allocated object. | |||||
| */ | |||||
| template<typename _Tp> | |||||
| using __allocator_base = __gnu_cxx::new_allocator<_Tp>; | |||||
| } | |||||
| #else | |||||
| // Define new_allocator as the base class to std::allocator. | |||||
| # define __allocator_base __gnu_cxx::new_allocator | |||||
| #endif | |||||
| #if defined(__SANITIZE_ADDRESS__) && !defined(_GLIBCXX_SANITIZE_STD_ALLOCATOR) | |||||
| # define _GLIBCXX_SANITIZE_STD_ALLOCATOR 1 | |||||
| #endif | |||||
| #endif | 
| // Underlying io library details -*- C++ -*- | |||||
| // Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/c++io.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{ios} | |||||
| */ | |||||
| // c_io_stdio.h - Defines for using "C" stdio.h | |||||
| #ifndef _GLIBCXX_CXX_IO_H | |||||
| #define _GLIBCXX_CXX_IO_H 1 | |||||
| #include <cstdio> | |||||
| #include <bits/gthr.h> | |||||
| namespace std _GLIBCXX_VISIBILITY(default) | |||||
| { | |||||
| _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||||
| typedef __gthread_mutex_t __c_lock; | |||||
| // for basic_file.h | |||||
| typedef FILE __c_file; | |||||
| _GLIBCXX_END_NAMESPACE_VERSION | |||||
| } // namespace | |||||
| #endif | 
| // Wrapper for underlying C-language localization -*- C++ -*- | |||||
| // Copyright (C) 2001-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/c++locale.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{locale} | |||||
| */ | |||||
| // | |||||
| // ISO C++ 14882: 22.8 Standard locale categories. | |||||
| // | |||||
| // Written by Benjamin Kosnik <bkoz@redhat.com> | |||||
| #ifndef _GLIBCXX_CXX_LOCALE_H | |||||
| #define _GLIBCXX_CXX_LOCALE_H 1 | |||||
| #pragma GCC system_header | |||||
| #include <clocale> | |||||
| #define _GLIBCXX_NUM_CATEGORIES 0 | |||||
| namespace std _GLIBCXX_VISIBILITY(default) | |||||
| { | |||||
| _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||||
| typedef int* __c_locale; | |||||
| // Convert numeric value of type double and long double to string and | |||||
| // return length of string. If vsnprintf is available use it, otherwise | |||||
| // fall back to the unsafe vsprintf which, in general, can be dangerous | |||||
| // and should be avoided. | |||||
| inline int | |||||
| __convert_from_v(const __c_locale&, char* __out, | |||||
| const int __size __attribute__((__unused__)), | |||||
| const char* __fmt, ...) | |||||
| { | |||||
| char* __old = std::setlocale(LC_NUMERIC, 0); | |||||
| char* __sav = 0; | |||||
| if (__builtin_strcmp(__old, "C")) | |||||
| { | |||||
| const size_t __len = __builtin_strlen(__old) + 1; | |||||
| __sav = new char[__len]; | |||||
| __builtin_memcpy(__sav, __old, __len); | |||||
| std::setlocale(LC_NUMERIC, "C"); | |||||
| } | |||||
| __builtin_va_list __args; | |||||
| __builtin_va_start(__args, __fmt); | |||||
| #if _GLIBCXX_USE_C99_STDIO && !_GLIBCXX_HAVE_BROKEN_VSNPRINTF | |||||
| const int __ret = __builtin_vsnprintf(__out, __size, __fmt, __args); | |||||
| #else | |||||
| const int __ret = __builtin_vsprintf(__out, __fmt, __args); | |||||
| #endif | |||||
| __builtin_va_end(__args); | |||||
| if (__sav) | |||||
| { | |||||
| std::setlocale(LC_NUMERIC, __sav); | |||||
| delete [] __sav; | |||||
| } | |||||
| return __ret; | |||||
| } | |||||
| _GLIBCXX_END_NAMESPACE_VERSION | |||||
| } // namespace | |||||
| #endif | 
| // Specific definitions for generic platforms -*- C++ -*- | |||||
| // Copyright (C) 2015-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/cpu_defines.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{iosfwd} | |||||
| */ | |||||
| #ifndef _GLIBCXX_CPU_DEFINES | |||||
| #define _GLIBCXX_CPU_DEFINES 1 | |||||
| // Integer divide instructions don't trap on ARM. | |||||
| #ifdef __ARM_ARCH_EXT_IDIV__ | |||||
| #define __glibcxx_integral_traps false | |||||
| #else | |||||
| #define __glibcxx_integral_traps true | |||||
| #endif | |||||
| #endif | 
| // Locale support -*- C++ -*- | |||||
| // Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| // | |||||
| // ISO C++ 14882: 22.1 Locales | |||||
| // | |||||
| // Information as gleaned from /usr/include/ctype.h | |||||
| namespace std _GLIBCXX_VISIBILITY(default) | |||||
| { | |||||
| _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||||
| /// @brief Base class for ctype. | |||||
| struct ctype_base | |||||
| { | |||||
| // Non-standard typedefs. | |||||
| typedef const int* __to_type; | |||||
| // NB: Offsets into ctype<char>::_M_table force a particular size | |||||
| // on the mask type. Because of this, we don't use an enum. | |||||
| typedef char mask; | |||||
| static const mask upper = _U; | |||||
| static const mask lower = _L; | |||||
| static const mask alpha = _U | _L; | |||||
| static const mask digit = _N; | |||||
| static const mask xdigit = _X | _N; | |||||
| static const mask space = _S; | |||||
| static const mask print = _P | _U | _L | _N | _B; | |||||
| static const mask graph = _P | _U | _L | _N; | |||||
| static const mask cntrl = _C; | |||||
| static const mask punct = _P; | |||||
| static const mask alnum = _U | _L | _N; | |||||
| #if __cplusplus >= 201103L | |||||
| static const mask blank = space; | |||||
| #endif | |||||
| }; | |||||
| _GLIBCXX_END_NAMESPACE_VERSION | |||||
| } // namespace | 
| // Locale support -*- C++ -*- | |||||
| // Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/ctype_inline.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{locale} | |||||
| */ | |||||
| // | |||||
| // ISO C++ 14882: 22.1 Locales | |||||
| // | |||||
| // ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) | |||||
| // functions go in ctype.cc | |||||
| namespace std _GLIBCXX_VISIBILITY(default) | |||||
| { | |||||
| _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||||
| bool | |||||
| ctype<char>:: | |||||
| is(mask __m, char __c) const | |||||
| { return _M_table[static_cast<unsigned char>(__c)] & __m; } | |||||
| const char* | |||||
| ctype<char>:: | |||||
| is(const char* __low, const char* __high, mask* __vec) const | |||||
| { | |||||
| while (__low < __high) | |||||
| *__vec++ = _M_table[static_cast<unsigned char>(*__low++)]; | |||||
| return __high; | |||||
| } | |||||
| const char* | |||||
| ctype<char>:: | |||||
| scan_is(mask __m, const char* __low, const char* __high) const | |||||
| { | |||||
| while (__low < __high && !this->is(__m, *__low)) | |||||
| ++__low; | |||||
| return __low; | |||||
| } | |||||
| const char* | |||||
| ctype<char>:: | |||||
| scan_not(mask __m, const char* __low, const char* __high) const | |||||
| { | |||||
| while (__low < __high && this->is(__m, *__low) != 0) | |||||
| ++__low; | |||||
| return __low; | |||||
| } | |||||
| _GLIBCXX_END_NAMESPACE_VERSION | |||||
| } // namespace | 
| // Control various target specific ABI tweaks. ARM version. | |||||
| // Copyright (C) 2004-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/cxxabi_tweaks.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{cxxabi.h} | |||||
| */ | |||||
| #ifndef _CXXABI_TWEAKS_H | |||||
| #define _CXXABI_TWEAKS_H 1 | |||||
| #ifdef __cplusplus | |||||
| namespace __cxxabiv1 | |||||
| { | |||||
| extern "C" | |||||
| { | |||||
| #endif | |||||
| #ifdef __ARM_EABI__ | |||||
| // The ARM EABI uses the least significant bit of a 32-bit | |||||
| // guard variable. */ | |||||
| #define _GLIBCXX_GUARD_TEST(x) ((*(x) & 1) != 0) | |||||
| #define _GLIBCXX_GUARD_SET(x) *(x) = 1 | |||||
| #define _GLIBCXX_GUARD_BIT 1 | |||||
| #define _GLIBCXX_GUARD_PENDING_BIT __guard_test_bit (1, 1) | |||||
| #define _GLIBCXX_GUARD_WAITING_BIT __guard_test_bit (2, 1) | |||||
| typedef int __guard; | |||||
| // We also want the element size in array cookies. | |||||
| #define _GLIBCXX_ELTSIZE_IN_COOKIE 1 | |||||
| // __cxa_vec_ctor should return a pointer to the array. | |||||
| typedef void * __cxa_vec_ctor_return_type; | |||||
| #define _GLIBCXX_CXA_VEC_CTOR_RETURN(x) return x | |||||
| // Constructors and destructors return the "this" pointer. | |||||
| typedef void * __cxa_cdtor_return_type; | |||||
| #else // __ARM_EABI__ | |||||
| // The generic ABI uses the first byte of a 64-bit guard variable. | |||||
| #define _GLIBCXX_GUARD_TEST(x) (*(char *) (x) != 0) | |||||
| #define _GLIBCXX_GUARD_SET(x) *(char *) (x) = 1 | |||||
| #define _GLIBCXX_GUARD_BIT __guard_test_bit (0, 1) | |||||
| #define _GLIBCXX_GUARD_PENDING_BIT __guard_test_bit (1, 1) | |||||
| #define _GLIBCXX_GUARD_WAITING_BIT __guard_test_bit (2, 1) | |||||
| __extension__ typedef int __guard __attribute__((mode (__DI__))); | |||||
| // __cxa_vec_ctor has void return type. | |||||
| typedef void __cxa_vec_ctor_return_type; | |||||
| #define _GLIBCXX_CXA_VEC_CTOR_RETURN(x) return | |||||
| // Constructors and destructors do not return a value. | |||||
| typedef void __cxa_cdtor_return_type; | |||||
| #endif //!__ARM_EABI__ | |||||
| #ifdef __cplusplus | |||||
| } | |||||
| } // namespace __cxxabiv1 | |||||
| #endif | |||||
| #endif | 
| // Specific definitions for generic platforms -*- C++ -*- | |||||
| // Copyright (C) 2007-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/error_constants.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{system_error} | |||||
| */ | |||||
| #ifndef _GLIBCXX_ERROR_CONSTANTS | |||||
| #define _GLIBCXX_ERROR_CONSTANTS 1 | |||||
| #include <bits/c++config.h> | |||||
| #include <cerrno> | |||||
| namespace std _GLIBCXX_VISIBILITY(default) | |||||
| { | |||||
| _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||||
| enum class errc | |||||
| { | |||||
| address_family_not_supported = EAFNOSUPPORT, | |||||
| address_in_use = EADDRINUSE, | |||||
| address_not_available = EADDRNOTAVAIL, | |||||
| already_connected = EISCONN, | |||||
| argument_list_too_long = E2BIG, | |||||
| argument_out_of_domain = EDOM, | |||||
| bad_address = EFAULT, | |||||
| bad_file_descriptor = EBADF, | |||||
| #ifdef _GLIBCXX_HAVE_EBADMSG | |||||
| bad_message = EBADMSG, | |||||
| #endif | |||||
| broken_pipe = EPIPE, | |||||
| connection_aborted = ECONNABORTED, | |||||
| connection_already_in_progress = EALREADY, | |||||
| connection_refused = ECONNREFUSED, | |||||
| connection_reset = ECONNRESET, | |||||
| cross_device_link = EXDEV, | |||||
| destination_address_required = EDESTADDRREQ, | |||||
| device_or_resource_busy = EBUSY, | |||||
| directory_not_empty = ENOTEMPTY, | |||||
| executable_format_error = ENOEXEC, | |||||
| file_exists = EEXIST, | |||||
| file_too_large = EFBIG, | |||||
| filename_too_long = ENAMETOOLONG, | |||||
| function_not_supported = ENOSYS, | |||||
| host_unreachable = EHOSTUNREACH, | |||||
| #ifdef _GLIBCXX_HAVE_EIDRM | |||||
| identifier_removed = EIDRM, | |||||
| #endif | |||||
| illegal_byte_sequence = EILSEQ, | |||||
| inappropriate_io_control_operation = ENOTTY, | |||||
| interrupted = EINTR, | |||||
| invalid_argument = EINVAL, | |||||
| invalid_seek = ESPIPE, | |||||
| io_error = EIO, | |||||
| is_a_directory = EISDIR, | |||||
| message_size = EMSGSIZE, | |||||
| network_down = ENETDOWN, | |||||
| network_reset = ENETRESET, | |||||
| network_unreachable = ENETUNREACH, | |||||
| no_buffer_space = ENOBUFS, | |||||
| no_child_process = ECHILD, | |||||
| #ifdef _GLIBCXX_HAVE_ENOLINK | |||||
| no_link = ENOLINK, | |||||
| #endif | |||||
| no_lock_available = ENOLCK, | |||||
| #ifdef _GLIBCXX_HAVE_ENODATA | |||||
| no_message_available = ENODATA, | |||||
| #endif | |||||
| no_message = ENOMSG, | |||||
| no_protocol_option = ENOPROTOOPT, | |||||
| no_space_on_device = ENOSPC, | |||||
| #ifdef _GLIBCXX_HAVE_ENOSR | |||||
| no_stream_resources = ENOSR, | |||||
| #endif | |||||
| no_such_device_or_address = ENXIO, | |||||
| no_such_device = ENODEV, | |||||
| no_such_file_or_directory = ENOENT, | |||||
| no_such_process = ESRCH, | |||||
| not_a_directory = ENOTDIR, | |||||
| not_a_socket = ENOTSOCK, | |||||
| #ifdef _GLIBCXX_HAVE_ENOSTR | |||||
| not_a_stream = ENOSTR, | |||||
| #endif | |||||
| not_connected = ENOTCONN, | |||||
| not_enough_memory = ENOMEM, | |||||
| #ifdef _GLIBCXX_HAVE_ENOTSUP | |||||
| not_supported = ENOTSUP, | |||||
| #endif | |||||
| #ifdef _GLIBCXX_HAVE_ECANCELED | |||||
| operation_canceled = ECANCELED, | |||||
| #endif | |||||
| operation_in_progress = EINPROGRESS, | |||||
| operation_not_permitted = EPERM, | |||||
| operation_not_supported = EOPNOTSUPP, | |||||
| operation_would_block = EWOULDBLOCK, | |||||
| #ifdef _GLIBCXX_HAVE_EOWNERDEAD | |||||
| owner_dead = EOWNERDEAD, | |||||
| #endif | |||||
| permission_denied = EACCES, | |||||
| #ifdef _GLIBCXX_HAVE_EPROTO | |||||
| protocol_error = EPROTO, | |||||
| #endif | |||||
| protocol_not_supported = EPROTONOSUPPORT, | |||||
| read_only_file_system = EROFS, | |||||
| resource_deadlock_would_occur = EDEADLK, | |||||
| resource_unavailable_try_again = EAGAIN, | |||||
| result_out_of_range = ERANGE, | |||||
| #ifdef _GLIBCXX_HAVE_ENOTRECOVERABLE | |||||
| state_not_recoverable = ENOTRECOVERABLE, | |||||
| #endif | |||||
| #ifdef _GLIBCXX_HAVE_ETIME | |||||
| stream_timeout = ETIME, | |||||
| #endif | |||||
| #ifdef _GLIBCXX_HAVE_ETXTBSY | |||||
| text_file_busy = ETXTBSY, | |||||
| #endif | |||||
| timed_out = ETIMEDOUT, | |||||
| too_many_files_open_in_system = ENFILE, | |||||
| too_many_files_open = EMFILE, | |||||
| too_many_links = EMLINK, | |||||
| too_many_symbolic_link_levels = ELOOP, | |||||
| #ifdef _GLIBCXX_HAVE_EOVERFLOW | |||||
| value_too_large = EOVERFLOW, | |||||
| #endif | |||||
| wrong_protocol_type = EPROTOTYPE | |||||
| }; | |||||
| _GLIBCXX_END_NAMESPACE_VERSION | |||||
| } // namespace | |||||
| #endif | 
| // C++ includes used for precompiling extensions -*- C++ -*- | |||||
| // Copyright (C) 2006-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file extc++.h | |||||
| * This is an implementation file for a precompiled header. | |||||
| */ | |||||
| #if __cplusplus < 201103L | |||||
| #include <bits/stdtr1c++.h> | |||||
| #else | |||||
| #include <bits/stdc++.h> | |||||
| #endif | |||||
| #include <ext/algorithm> | |||||
| #if __cplusplus >= 201103L | |||||
| # include <ext/aligned_buffer.h> | |||||
| #endif | |||||
| #include <ext/alloc_traits.h> | |||||
| #include <ext/atomicity.h> | |||||
| #include <ext/bitmap_allocator.h> | |||||
| #include <ext/cast.h> | |||||
| #if __cplusplus >= 201103L | |||||
| # include <ext/cmath> | |||||
| #endif | |||||
| #include <ext/concurrence.h> | |||||
| #include <ext/debug_allocator.h> | |||||
| #include <ext/extptr_allocator.h> | |||||
| #include <ext/functional> | |||||
| #include <ext/iterator> | |||||
| #include <ext/malloc_allocator.h> | |||||
| #include <ext/memory> | |||||
| #include <ext/mt_allocator.h> | |||||
| #include <ext/new_allocator.h> | |||||
| #include <ext/numeric> | |||||
| #include <ext/numeric_traits.h> | |||||
| #include <ext/pod_char_traits.h> | |||||
| #include <ext/pointer.h> | |||||
| #include <ext/pool_allocator.h> | |||||
| #if __cplusplus >= 201103L | |||||
| # include <ext/random> | |||||
| #endif | |||||
| #include <ext/rb_tree> | |||||
| #include <ext/rope> | |||||
| #include <ext/slist> | |||||
| #include <ext/stdio_filebuf.h> | |||||
| #include <ext/stdio_sync_filebuf.h> | |||||
| #include <ext/throw_allocator.h> | |||||
| #include <ext/typelist.h> | |||||
| #include <ext/type_traits.h> | |||||
| #include <ext/vstring.h> | |||||
| #include <ext/pb_ds/assoc_container.hpp> | |||||
| #include <ext/pb_ds/priority_queue.hpp> | |||||
| #include <ext/pb_ds/exception.hpp> | |||||
| #include <ext/pb_ds/hash_policy.hpp> | |||||
| #include <ext/pb_ds/list_update_policy.hpp> | |||||
| #include <ext/pb_ds/tree_policy.hpp> | |||||
| #include <ext/pb_ds/trie_policy.hpp> | |||||
| #ifdef _GLIBCXX_HAVE_ICONV | |||||
| #include <ext/codecvt_specializations.h> | |||||
| #include <ext/enc_filebuf.h> | |||||
| #endif | 
| /* Threads compatibility routines for libgcc2 and libobjc. */ | |||||
| /* Compile this one with gcc. */ | |||||
| /* Copyright (C) 1997-2020 Free Software Foundation, Inc. | |||||
| This file is part of GCC. | |||||
| GCC is free software; you can redistribute it and/or modify it under | |||||
| the terms of the GNU General Public License as published by the Free | |||||
| Software Foundation; either version 3, or (at your option) any later | |||||
| version. | |||||
| GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |||||
| WARRANTY; without even the implied warranty of MERCHANTABILITY or | |||||
| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |||||
| for more details. | |||||
| Under Section 7 of GPL version 3, you are granted additional | |||||
| permissions described in the GCC Runtime Library Exception, version | |||||
| 3.1, as published by the Free Software Foundation. | |||||
| You should have received a copy of the GNU General Public License and | |||||
| a copy of the GCC Runtime Library Exception along with this program; | |||||
| see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| <http://www.gnu.org/licenses/>. */ | |||||
| #ifndef _GLIBCXX_GCC_GTHR_SINGLE_H | |||||
| #define _GLIBCXX_GCC_GTHR_SINGLE_H | |||||
| /* Just provide compatibility for mutex handling. */ | |||||
| typedef int __gthread_key_t; | |||||
| typedef int __gthread_once_t; | |||||
| typedef int __gthread_mutex_t; | |||||
| typedef int __gthread_recursive_mutex_t; | |||||
| #define __GTHREAD_ONCE_INIT 0 | |||||
| #define __GTHREAD_MUTEX_INIT 0 | |||||
| #define __GTHREAD_MUTEX_INIT_FUNCTION(mx) do {} while (0) | |||||
| #define __GTHREAD_RECURSIVE_MUTEX_INIT 0 | |||||
| #define _GLIBCXX_UNUSED __attribute__((__unused__)) | |||||
| #ifdef _LIBOBJC | |||||
| /* Thread local storage for a single thread */ | |||||
| static void *thread_local_storage = NULL; | |||||
| /* Backend initialization functions */ | |||||
| /* Initialize the threads subsystem. */ | |||||
| static inline int | |||||
| __gthread_objc_init_thread_system (void) | |||||
| { | |||||
| /* No thread support available */ | |||||
| return -1; | |||||
| } | |||||
| /* Close the threads subsystem. */ | |||||
| static inline int | |||||
| __gthread_objc_close_thread_system (void) | |||||
| { | |||||
| /* No thread support available */ | |||||
| return -1; | |||||
| } | |||||
| /* Backend thread functions */ | |||||
| /* Create a new thread of execution. */ | |||||
| static inline objc_thread_t | |||||
| __gthread_objc_thread_detach (void (* func)(void *), void * arg _GLIBCXX_UNUSED) | |||||
| { | |||||
| /* No thread support available */ | |||||
| return NULL; | |||||
| } | |||||
| /* Set the current thread's priority. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_set_priority (int priority _GLIBCXX_UNUSED) | |||||
| { | |||||
| /* No thread support available */ | |||||
| return -1; | |||||
| } | |||||
| /* Return the current thread's priority. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_get_priority (void) | |||||
| { | |||||
| return OBJC_THREAD_INTERACTIVE_PRIORITY; | |||||
| } | |||||
| /* Yield our process time to another thread. */ | |||||
| static inline void | |||||
| __gthread_objc_thread_yield (void) | |||||
| { | |||||
| return; | |||||
| } | |||||
| /* Terminate the current thread. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_exit (void) | |||||
| { | |||||
| /* No thread support available */ | |||||
| /* Should we really exit the program */ | |||||
| /* exit (&__objc_thread_exit_status); */ | |||||
| return -1; | |||||
| } | |||||
| /* Returns an integer value which uniquely describes a thread. */ | |||||
| static inline objc_thread_t | |||||
| __gthread_objc_thread_id (void) | |||||
| { | |||||
| /* No thread support, use 1. */ | |||||
| return (objc_thread_t) 1; | |||||
| } | |||||
| /* Sets the thread's local storage pointer. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_set_data (void *value) | |||||
| { | |||||
| thread_local_storage = value; | |||||
| return 0; | |||||
| } | |||||
| /* Returns the thread's local storage pointer. */ | |||||
| static inline void * | |||||
| __gthread_objc_thread_get_data (void) | |||||
| { | |||||
| return thread_local_storage; | |||||
| } | |||||
| /* Backend mutex functions */ | |||||
| /* Allocate a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_allocate (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Deallocate a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_deallocate (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Grab a lock on a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_lock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| /* There can only be one thread, so we always get the lock */ | |||||
| return 0; | |||||
| } | |||||
| /* Try to grab a lock on a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_trylock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| /* There can only be one thread, so we always get the lock */ | |||||
| return 0; | |||||
| } | |||||
| /* Unlock the mutex */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_unlock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Backend condition mutex functions */ | |||||
| /* Allocate a condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_allocate (objc_condition_t condition _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Deallocate a condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_deallocate (objc_condition_t condition _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Wait on the condition */ | |||||
| static inline int | |||||
| __gthread_objc_condition_wait (objc_condition_t condition _GLIBCXX_UNUSED, | |||||
| objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Wake up all threads waiting on this condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_broadcast (objc_condition_t condition _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Wake up one thread waiting on this condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_signal (objc_condition_t condition _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| #else /* _LIBOBJC */ | |||||
| static inline int | |||||
| __gthread_active_p (void) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_once (__gthread_once_t *__once _GLIBCXX_UNUSED, void (*__func) (void) _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int _GLIBCXX_UNUSED | |||||
| __gthread_key_create (__gthread_key_t *__key _GLIBCXX_UNUSED, void (*__func) (void *) _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static int _GLIBCXX_UNUSED | |||||
| __gthread_key_delete (__gthread_key_t __key _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline void * | |||||
| __gthread_getspecific (__gthread_key_t __key _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_setspecific (__gthread_key_t __key _GLIBCXX_UNUSED, const void *__v _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_destroy (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_lock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_trylock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_unlock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_lock (__mutex); | |||||
| } | |||||
| static inline int | |||||
| __gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_trylock (__mutex); | |||||
| } | |||||
| static inline int | |||||
| __gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_unlock (__mutex); | |||||
| } | |||||
| static inline int | |||||
| __gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_destroy (__mutex); | |||||
| } | |||||
| #endif /* _LIBOBJC */ | |||||
| #undef _GLIBCXX_UNUSED | |||||
| #endif /* ! _GLIBCXX_GCC_GTHR_SINGLE_H */ | 
| /* Threads compatibility routines for libgcc2 and libobjc. */ | |||||
| /* Compile this one with gcc. */ | |||||
| /* Copyright (C) 1997-2020 Free Software Foundation, Inc. | |||||
| This file is part of GCC. | |||||
| GCC is free software; you can redistribute it and/or modify it under | |||||
| the terms of the GNU General Public License as published by the Free | |||||
| Software Foundation; either version 3, or (at your option) any later | |||||
| version. | |||||
| GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |||||
| WARRANTY; without even the implied warranty of MERCHANTABILITY or | |||||
| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |||||
| for more details. | |||||
| Under Section 7 of GPL version 3, you are granted additional | |||||
| permissions described in the GCC Runtime Library Exception, version | |||||
| 3.1, as published by the Free Software Foundation. | |||||
| You should have received a copy of the GNU General Public License and | |||||
| a copy of the GCC Runtime Library Exception along with this program; | |||||
| see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| <http://www.gnu.org/licenses/>. */ | |||||
| #ifndef _GLIBCXX_GCC_GTHR_POSIX_H | |||||
| #define _GLIBCXX_GCC_GTHR_POSIX_H | |||||
| /* POSIX threads specific definitions. | |||||
| Easy, since the interface is just one-to-one mapping. */ | |||||
| #define __GTHREADS 1 | |||||
| #define __GTHREADS_CXX0X 1 | |||||
| #include <pthread.h> | |||||
| #if ((defined(_LIBOBJC) || defined(_LIBOBJC_WEAK)) \ | |||||
| || !defined(_GTHREAD_USE_MUTEX_TIMEDLOCK)) | |||||
| # include <unistd.h> | |||||
| # if defined(_POSIX_TIMEOUTS) && _POSIX_TIMEOUTS >= 0 | |||||
| # define _GTHREAD_USE_MUTEX_TIMEDLOCK 1 | |||||
| # else | |||||
| # define _GTHREAD_USE_MUTEX_TIMEDLOCK 0 | |||||
| # endif | |||||
| #endif | |||||
| typedef pthread_t __gthread_t; | |||||
| typedef pthread_key_t __gthread_key_t; | |||||
| typedef pthread_once_t __gthread_once_t; | |||||
| typedef pthread_mutex_t __gthread_mutex_t; | |||||
| typedef pthread_mutex_t __gthread_recursive_mutex_t; | |||||
| typedef pthread_cond_t __gthread_cond_t; | |||||
| typedef struct timespec __gthread_time_t; | |||||
| /* POSIX like conditional variables are supported. Please look at comments | |||||
| in gthr.h for details. */ | |||||
| #define __GTHREAD_HAS_COND 1 | |||||
| #define __GTHREAD_MUTEX_INIT PTHREAD_MUTEX_INITIALIZER | |||||
| #define __GTHREAD_MUTEX_INIT_FUNCTION __gthread_mutex_init_function | |||||
| #define __GTHREAD_ONCE_INIT PTHREAD_ONCE_INIT | |||||
| #if defined(PTHREAD_RECURSIVE_MUTEX_INITIALIZER) | |||||
| #define __GTHREAD_RECURSIVE_MUTEX_INIT PTHREAD_RECURSIVE_MUTEX_INITIALIZER | |||||
| #elif defined(PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP) | |||||
| #define __GTHREAD_RECURSIVE_MUTEX_INIT PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP | |||||
| #else | |||||
| #define __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION __gthread_recursive_mutex_init_function | |||||
| #endif | |||||
| #define __GTHREAD_COND_INIT PTHREAD_COND_INITIALIZER | |||||
| #define __GTHREAD_TIME_INIT {0,0} | |||||
| #ifdef _GTHREAD_USE_MUTEX_INIT_FUNC | |||||
| # undef __GTHREAD_MUTEX_INIT | |||||
| #endif | |||||
| #ifdef _GTHREAD_USE_RECURSIVE_MUTEX_INIT_FUNC | |||||
| # undef __GTHREAD_RECURSIVE_MUTEX_INIT | |||||
| # undef __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION | |||||
| # define __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION __gthread_recursive_mutex_init_function | |||||
| #endif | |||||
| #ifdef _GTHREAD_USE_COND_INIT_FUNC | |||||
| # undef __GTHREAD_COND_INIT | |||||
| # define __GTHREAD_COND_INIT_FUNCTION __gthread_cond_init_function | |||||
| #endif | |||||
| #if __GXX_WEAK__ && _GLIBCXX_GTHREAD_USE_WEAK | |||||
| # ifndef __gthrw_pragma | |||||
| # define __gthrw_pragma(pragma) | |||||
| # endif | |||||
| # define __gthrw2(name,name2,type) \ | |||||
| static __typeof(type) name \ | |||||
| __attribute__ ((__weakref__(#name2), __copy__ (type))); \ | |||||
| __gthrw_pragma(weak type) | |||||
| # define __gthrw_(name) __gthrw_ ## name | |||||
| #else | |||||
| # define __gthrw2(name,name2,type) | |||||
| # define __gthrw_(name) name | |||||
| #endif | |||||
| /* Typically, __gthrw_foo is a weak reference to symbol foo. */ | |||||
| #define __gthrw(name) __gthrw2(__gthrw_ ## name,name,name) | |||||
| __gthrw(pthread_once) | |||||
| __gthrw(pthread_getspecific) | |||||
| __gthrw(pthread_setspecific) | |||||
| __gthrw(pthread_create) | |||||
| __gthrw(pthread_join) | |||||
| __gthrw(pthread_equal) | |||||
| __gthrw(pthread_self) | |||||
| __gthrw(pthread_detach) | |||||
| #ifndef __BIONIC__ | |||||
| __gthrw(pthread_cancel) | |||||
| #endif | |||||
| __gthrw(sched_yield) | |||||
| __gthrw(pthread_mutex_lock) | |||||
| __gthrw(pthread_mutex_trylock) | |||||
| #if _GTHREAD_USE_MUTEX_TIMEDLOCK | |||||
| __gthrw(pthread_mutex_timedlock) | |||||
| #endif | |||||
| __gthrw(pthread_mutex_unlock) | |||||
| __gthrw(pthread_mutex_init) | |||||
| __gthrw(pthread_mutex_destroy) | |||||
| __gthrw(pthread_cond_init) | |||||
| __gthrw(pthread_cond_broadcast) | |||||
| __gthrw(pthread_cond_signal) | |||||
| __gthrw(pthread_cond_wait) | |||||
| __gthrw(pthread_cond_timedwait) | |||||
| __gthrw(pthread_cond_destroy) | |||||
| __gthrw(pthread_key_create) | |||||
| __gthrw(pthread_key_delete) | |||||
| __gthrw(pthread_mutexattr_init) | |||||
| __gthrw(pthread_mutexattr_settype) | |||||
| __gthrw(pthread_mutexattr_destroy) | |||||
| #if defined(_LIBOBJC) || defined(_LIBOBJC_WEAK) | |||||
| /* Objective-C. */ | |||||
| __gthrw(pthread_exit) | |||||
| #ifdef _POSIX_PRIORITY_SCHEDULING | |||||
| #ifdef _POSIX_THREAD_PRIORITY_SCHEDULING | |||||
| __gthrw(sched_get_priority_max) | |||||
| __gthrw(sched_get_priority_min) | |||||
| #endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ | |||||
| #endif /* _POSIX_PRIORITY_SCHEDULING */ | |||||
| __gthrw(pthread_attr_destroy) | |||||
| __gthrw(pthread_attr_init) | |||||
| __gthrw(pthread_attr_setdetachstate) | |||||
| #ifdef _POSIX_THREAD_PRIORITY_SCHEDULING | |||||
| __gthrw(pthread_getschedparam) | |||||
| __gthrw(pthread_setschedparam) | |||||
| #endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ | |||||
| #endif /* _LIBOBJC || _LIBOBJC_WEAK */ | |||||
| #if __GXX_WEAK__ && _GLIBCXX_GTHREAD_USE_WEAK | |||||
| /* On Solaris 2.6 up to 9, the libc exposes a POSIX threads interface even if | |||||
| -pthreads is not specified. The functions are dummies and most return an | |||||
| error value. However pthread_once returns 0 without invoking the routine | |||||
| it is passed so we cannot pretend that the interface is active if -pthreads | |||||
| is not specified. On Solaris 2.5.1, the interface is not exposed at all so | |||||
| we need to play the usual game with weak symbols. On Solaris 10 and up, a | |||||
| working interface is always exposed. On FreeBSD 6 and later, libc also | |||||
| exposes a dummy POSIX threads interface, similar to what Solaris 2.6 up | |||||
| to 9 does. FreeBSD >= 700014 even provides a pthread_cancel stub in libc, | |||||
| which means the alternate __gthread_active_p below cannot be used there. */ | |||||
| #if defined(__FreeBSD__) || (defined(__sun) && defined(__svr4__)) | |||||
| static volatile int __gthread_active = -1; | |||||
| static void | |||||
| __gthread_trigger (void) | |||||
| { | |||||
| __gthread_active = 1; | |||||
| } | |||||
| static inline int | |||||
| __gthread_active_p (void) | |||||
| { | |||||
| static pthread_mutex_t __gthread_active_mutex = PTHREAD_MUTEX_INITIALIZER; | |||||
| static pthread_once_t __gthread_active_once = PTHREAD_ONCE_INIT; | |||||
| /* Avoid reading __gthread_active twice on the main code path. */ | |||||
| int __gthread_active_latest_value = __gthread_active; | |||||
| /* This test is not protected to avoid taking a lock on the main code | |||||
| path so every update of __gthread_active in a threaded program must | |||||
| be atomic with regard to the result of the test. */ | |||||
| if (__builtin_expect (__gthread_active_latest_value < 0, 0)) | |||||
| { | |||||
| if (__gthrw_(pthread_once)) | |||||
| { | |||||
| /* If this really is a threaded program, then we must ensure that | |||||
| __gthread_active has been set to 1 before exiting this block. */ | |||||
| __gthrw_(pthread_mutex_lock) (&__gthread_active_mutex); | |||||
| __gthrw_(pthread_once) (&__gthread_active_once, __gthread_trigger); | |||||
| __gthrw_(pthread_mutex_unlock) (&__gthread_active_mutex); | |||||
| } | |||||
| /* Make sure we'll never enter this block again. */ | |||||
| if (__gthread_active < 0) | |||||
| __gthread_active = 0; | |||||
| __gthread_active_latest_value = __gthread_active; | |||||
| } | |||||
| return __gthread_active_latest_value != 0; | |||||
| } | |||||
| #else /* neither FreeBSD nor Solaris */ | |||||
| /* For a program to be multi-threaded the only thing that it certainly must | |||||
| be using is pthread_create. However, there may be other libraries that | |||||
| intercept pthread_create with their own definitions to wrap pthreads | |||||
| functionality for some purpose. In those cases, pthread_create being | |||||
| defined might not necessarily mean that libpthread is actually linked | |||||
| in. | |||||
| For the GNU C library, we can use a known internal name. This is always | |||||
| available in the ABI, but no other library would define it. That is | |||||
| ideal, since any public pthread function might be intercepted just as | |||||
| pthread_create might be. __pthread_key_create is an "internal" | |||||
| implementation symbol, but it is part of the public exported ABI. Also, | |||||
| it's among the symbols that the static libpthread.a always links in | |||||
| whenever pthread_create is used, so there is no danger of a false | |||||
| negative result in any statically-linked, multi-threaded program. | |||||
| For others, we choose pthread_cancel as a function that seems unlikely | |||||
| to be redefined by an interceptor library. The bionic (Android) C | |||||
| library does not provide pthread_cancel, so we do use pthread_create | |||||
| there (and interceptor libraries lose). */ | |||||
| #ifdef __GLIBC__ | |||||
| __gthrw2(__gthrw_(__pthread_key_create), | |||||
| __pthread_key_create, | |||||
| pthread_key_create) | |||||
| # define GTHR_ACTIVE_PROXY __gthrw_(__pthread_key_create) | |||||
| #elif defined (__BIONIC__) | |||||
| # define GTHR_ACTIVE_PROXY __gthrw_(pthread_create) | |||||
| #else | |||||
| # define GTHR_ACTIVE_PROXY __gthrw_(pthread_cancel) | |||||
| #endif | |||||
| static inline int | |||||
| __gthread_active_p (void) | |||||
| { | |||||
| static void *const __gthread_active_ptr | |||||
| = __extension__ (void *) >HR_ACTIVE_PROXY; | |||||
| return __gthread_active_ptr != 0; | |||||
| } | |||||
| #endif /* FreeBSD or Solaris */ | |||||
| #else /* not __GXX_WEAK__ */ | |||||
| /* Similar to Solaris, HP-UX 11 for PA-RISC provides stubs for pthread | |||||
| calls in shared flavors of the HP-UX C library. Most of the stubs | |||||
| have no functionality. The details are described in the "libc cumulative | |||||
| patch" for each subversion of HP-UX 11. There are two special interfaces | |||||
| provided for checking whether an application is linked to a shared pthread | |||||
| library or not. However, these interfaces aren't available in early | |||||
| libpthread libraries. We also need a test that works for archive | |||||
| libraries. We can't use pthread_once as some libc versions call the | |||||
| init function. We also can't use pthread_create or pthread_attr_init | |||||
| as these create a thread and thereby prevent changing the default stack | |||||
| size. The function pthread_default_stacksize_np is available in both | |||||
| the archive and shared versions of libpthread. It can be used to | |||||
| determine the default pthread stack size. There is a stub in some | |||||
| shared libc versions which returns a zero size if pthreads are not | |||||
| active. We provide an equivalent stub to handle cases where libc | |||||
| doesn't provide one. */ | |||||
| #if defined(__hppa__) && defined(__hpux__) | |||||
| static volatile int __gthread_active = -1; | |||||
| static inline int | |||||
| __gthread_active_p (void) | |||||
| { | |||||
| /* Avoid reading __gthread_active twice on the main code path. */ | |||||
| int __gthread_active_latest_value = __gthread_active; | |||||
| size_t __s; | |||||
| if (__builtin_expect (__gthread_active_latest_value < 0, 0)) | |||||
| { | |||||
| pthread_default_stacksize_np (0, &__s); | |||||
| __gthread_active = __s ? 1 : 0; | |||||
| __gthread_active_latest_value = __gthread_active; | |||||
| } | |||||
| return __gthread_active_latest_value != 0; | |||||
| } | |||||
| #else /* not hppa-hpux */ | |||||
| static inline int | |||||
| __gthread_active_p (void) | |||||
| { | |||||
| return 1; | |||||
| } | |||||
| #endif /* hppa-hpux */ | |||||
| #endif /* __GXX_WEAK__ */ | |||||
| #ifdef _LIBOBJC | |||||
| /* This is the config.h file in libobjc/ */ | |||||
| #include <config.h> | |||||
| #ifdef HAVE_SCHED_H | |||||
| # include <sched.h> | |||||
| #endif | |||||
| /* Key structure for maintaining thread specific storage */ | |||||
| static pthread_key_t _objc_thread_storage; | |||||
| static pthread_attr_t _objc_thread_attribs; | |||||
| /* Thread local storage for a single thread */ | |||||
| static void *thread_local_storage = NULL; | |||||
| /* Backend initialization functions */ | |||||
| /* Initialize the threads subsystem. */ | |||||
| static inline int | |||||
| __gthread_objc_init_thread_system (void) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| { | |||||
| /* Initialize the thread storage key. */ | |||||
| if (__gthrw_(pthread_key_create) (&_objc_thread_storage, NULL) == 0) | |||||
| { | |||||
| /* The normal default detach state for threads is | |||||
| * PTHREAD_CREATE_JOINABLE which causes threads to not die | |||||
| * when you think they should. */ | |||||
| if (__gthrw_(pthread_attr_init) (&_objc_thread_attribs) == 0 | |||||
| && __gthrw_(pthread_attr_setdetachstate) (&_objc_thread_attribs, | |||||
| PTHREAD_CREATE_DETACHED) == 0) | |||||
| return 0; | |||||
| } | |||||
| } | |||||
| return -1; | |||||
| } | |||||
| /* Close the threads subsystem. */ | |||||
| static inline int | |||||
| __gthread_objc_close_thread_system (void) | |||||
| { | |||||
| if (__gthread_active_p () | |||||
| && __gthrw_(pthread_key_delete) (_objc_thread_storage) == 0 | |||||
| && __gthrw_(pthread_attr_destroy) (&_objc_thread_attribs) == 0) | |||||
| return 0; | |||||
| return -1; | |||||
| } | |||||
| /* Backend thread functions */ | |||||
| /* Create a new thread of execution. */ | |||||
| static inline objc_thread_t | |||||
| __gthread_objc_thread_detach (void (*func)(void *), void *arg) | |||||
| { | |||||
| objc_thread_t thread_id; | |||||
| pthread_t new_thread_handle; | |||||
| if (!__gthread_active_p ()) | |||||
| return NULL; | |||||
| if (!(__gthrw_(pthread_create) (&new_thread_handle, &_objc_thread_attribs, | |||||
| (void *) func, arg))) | |||||
| thread_id = (objc_thread_t) new_thread_handle; | |||||
| else | |||||
| thread_id = NULL; | |||||
| return thread_id; | |||||
| } | |||||
| /* Set the current thread's priority. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_set_priority (int priority) | |||||
| { | |||||
| if (!__gthread_active_p ()) | |||||
| return -1; | |||||
| else | |||||
| { | |||||
| #ifdef _POSIX_PRIORITY_SCHEDULING | |||||
| #ifdef _POSIX_THREAD_PRIORITY_SCHEDULING | |||||
| pthread_t thread_id = __gthrw_(pthread_self) (); | |||||
| int policy; | |||||
| struct sched_param params; | |||||
| int priority_min, priority_max; | |||||
| if (__gthrw_(pthread_getschedparam) (thread_id, &policy, ¶ms) == 0) | |||||
| { | |||||
| if ((priority_max = __gthrw_(sched_get_priority_max) (policy)) == -1) | |||||
| return -1; | |||||
| if ((priority_min = __gthrw_(sched_get_priority_min) (policy)) == -1) | |||||
| return -1; | |||||
| if (priority > priority_max) | |||||
| priority = priority_max; | |||||
| else if (priority < priority_min) | |||||
| priority = priority_min; | |||||
| params.sched_priority = priority; | |||||
| /* | |||||
| * The solaris 7 and several other man pages incorrectly state that | |||||
| * this should be a pointer to policy but pthread.h is universally | |||||
| * at odds with this. | |||||
| */ | |||||
| if (__gthrw_(pthread_setschedparam) (thread_id, policy, ¶ms) == 0) | |||||
| return 0; | |||||
| } | |||||
| #endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ | |||||
| #endif /* _POSIX_PRIORITY_SCHEDULING */ | |||||
| return -1; | |||||
| } | |||||
| } | |||||
| /* Return the current thread's priority. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_get_priority (void) | |||||
| { | |||||
| #ifdef _POSIX_PRIORITY_SCHEDULING | |||||
| #ifdef _POSIX_THREAD_PRIORITY_SCHEDULING | |||||
| if (__gthread_active_p ()) | |||||
| { | |||||
| int policy; | |||||
| struct sched_param params; | |||||
| if (__gthrw_(pthread_getschedparam) (__gthrw_(pthread_self) (), &policy, ¶ms) == 0) | |||||
| return params.sched_priority; | |||||
| else | |||||
| return -1; | |||||
| } | |||||
| else | |||||
| #endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ | |||||
| #endif /* _POSIX_PRIORITY_SCHEDULING */ | |||||
| return OBJC_THREAD_INTERACTIVE_PRIORITY; | |||||
| } | |||||
| /* Yield our process time to another thread. */ | |||||
| static inline void | |||||
| __gthread_objc_thread_yield (void) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| __gthrw_(sched_yield) (); | |||||
| } | |||||
| /* Terminate the current thread. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_exit (void) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| /* exit the thread */ | |||||
| __gthrw_(pthread_exit) (&__objc_thread_exit_status); | |||||
| /* Failed if we reached here */ | |||||
| return -1; | |||||
| } | |||||
| /* Returns an integer value which uniquely describes a thread. */ | |||||
| static inline objc_thread_t | |||||
| __gthread_objc_thread_id (void) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return (objc_thread_t) __gthrw_(pthread_self) (); | |||||
| else | |||||
| return (objc_thread_t) 1; | |||||
| } | |||||
| /* Sets the thread's local storage pointer. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_set_data (void *value) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_setspecific) (_objc_thread_storage, value); | |||||
| else | |||||
| { | |||||
| thread_local_storage = value; | |||||
| return 0; | |||||
| } | |||||
| } | |||||
| /* Returns the thread's local storage pointer. */ | |||||
| static inline void * | |||||
| __gthread_objc_thread_get_data (void) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_getspecific) (_objc_thread_storage); | |||||
| else | |||||
| return thread_local_storage; | |||||
| } | |||||
| /* Backend mutex functions */ | |||||
| /* Allocate a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_allocate (objc_mutex_t mutex) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| { | |||||
| mutex->backend = objc_malloc (sizeof (pthread_mutex_t)); | |||||
| if (__gthrw_(pthread_mutex_init) ((pthread_mutex_t *) mutex->backend, NULL)) | |||||
| { | |||||
| objc_free (mutex->backend); | |||||
| mutex->backend = NULL; | |||||
| return -1; | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| /* Deallocate a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_deallocate (objc_mutex_t mutex) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| { | |||||
| int count; | |||||
| /* | |||||
| * Posix Threads specifically require that the thread be unlocked | |||||
| * for __gthrw_(pthread_mutex_destroy) to work. | |||||
| */ | |||||
| do | |||||
| { | |||||
| count = __gthrw_(pthread_mutex_unlock) ((pthread_mutex_t *) mutex->backend); | |||||
| if (count < 0) | |||||
| return -1; | |||||
| } | |||||
| while (count); | |||||
| if (__gthrw_(pthread_mutex_destroy) ((pthread_mutex_t *) mutex->backend)) | |||||
| return -1; | |||||
| objc_free (mutex->backend); | |||||
| mutex->backend = NULL; | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| /* Grab a lock on a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_lock (objc_mutex_t mutex) | |||||
| { | |||||
| if (__gthread_active_p () | |||||
| && __gthrw_(pthread_mutex_lock) ((pthread_mutex_t *) mutex->backend) != 0) | |||||
| { | |||||
| return -1; | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| /* Try to grab a lock on a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_trylock (objc_mutex_t mutex) | |||||
| { | |||||
| if (__gthread_active_p () | |||||
| && __gthrw_(pthread_mutex_trylock) ((pthread_mutex_t *) mutex->backend) != 0) | |||||
| { | |||||
| return -1; | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| /* Unlock the mutex */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_unlock (objc_mutex_t mutex) | |||||
| { | |||||
| if (__gthread_active_p () | |||||
| && __gthrw_(pthread_mutex_unlock) ((pthread_mutex_t *) mutex->backend) != 0) | |||||
| { | |||||
| return -1; | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| /* Backend condition mutex functions */ | |||||
| /* Allocate a condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_allocate (objc_condition_t condition) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| { | |||||
| condition->backend = objc_malloc (sizeof (pthread_cond_t)); | |||||
| if (__gthrw_(pthread_cond_init) ((pthread_cond_t *) condition->backend, NULL)) | |||||
| { | |||||
| objc_free (condition->backend); | |||||
| condition->backend = NULL; | |||||
| return -1; | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| /* Deallocate a condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_deallocate (objc_condition_t condition) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| { | |||||
| if (__gthrw_(pthread_cond_destroy) ((pthread_cond_t *) condition->backend)) | |||||
| return -1; | |||||
| objc_free (condition->backend); | |||||
| condition->backend = NULL; | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| /* Wait on the condition */ | |||||
| static inline int | |||||
| __gthread_objc_condition_wait (objc_condition_t condition, objc_mutex_t mutex) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_cond_wait) ((pthread_cond_t *) condition->backend, | |||||
| (pthread_mutex_t *) mutex->backend); | |||||
| else | |||||
| return 0; | |||||
| } | |||||
| /* Wake up all threads waiting on this condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_broadcast (objc_condition_t condition) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_cond_broadcast) ((pthread_cond_t *) condition->backend); | |||||
| else | |||||
| return 0; | |||||
| } | |||||
| /* Wake up one thread waiting on this condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_signal (objc_condition_t condition) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_cond_signal) ((pthread_cond_t *) condition->backend); | |||||
| else | |||||
| return 0; | |||||
| } | |||||
| #else /* _LIBOBJC */ | |||||
| static inline int | |||||
| __gthread_create (__gthread_t *__threadid, void *(*__func) (void*), | |||||
| void *__args) | |||||
| { | |||||
| return __gthrw_(pthread_create) (__threadid, NULL, __func, __args); | |||||
| } | |||||
| static inline int | |||||
| __gthread_join (__gthread_t __threadid, void **__value_ptr) | |||||
| { | |||||
| return __gthrw_(pthread_join) (__threadid, __value_ptr); | |||||
| } | |||||
| static inline int | |||||
| __gthread_detach (__gthread_t __threadid) | |||||
| { | |||||
| return __gthrw_(pthread_detach) (__threadid); | |||||
| } | |||||
| static inline int | |||||
| __gthread_equal (__gthread_t __t1, __gthread_t __t2) | |||||
| { | |||||
| return __gthrw_(pthread_equal) (__t1, __t2); | |||||
| } | |||||
| static inline __gthread_t | |||||
| __gthread_self (void) | |||||
| { | |||||
| return __gthrw_(pthread_self) (); | |||||
| } | |||||
| static inline int | |||||
| __gthread_yield (void) | |||||
| { | |||||
| return __gthrw_(sched_yield) (); | |||||
| } | |||||
| static inline int | |||||
| __gthread_once (__gthread_once_t *__once, void (*__func) (void)) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_once) (__once, __func); | |||||
| else | |||||
| return -1; | |||||
| } | |||||
| static inline int | |||||
| __gthread_key_create (__gthread_key_t *__key, void (*__dtor) (void *)) | |||||
| { | |||||
| return __gthrw_(pthread_key_create) (__key, __dtor); | |||||
| } | |||||
| static inline int | |||||
| __gthread_key_delete (__gthread_key_t __key) | |||||
| { | |||||
| return __gthrw_(pthread_key_delete) (__key); | |||||
| } | |||||
| static inline void * | |||||
| __gthread_getspecific (__gthread_key_t __key) | |||||
| { | |||||
| return __gthrw_(pthread_getspecific) (__key); | |||||
| } | |||||
| static inline int | |||||
| __gthread_setspecific (__gthread_key_t __key, const void *__ptr) | |||||
| { | |||||
| return __gthrw_(pthread_setspecific) (__key, __ptr); | |||||
| } | |||||
| static inline void | |||||
| __gthread_mutex_init_function (__gthread_mutex_t *__mutex) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| __gthrw_(pthread_mutex_init) (__mutex, NULL); | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_destroy (__gthread_mutex_t *__mutex) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_mutex_destroy) (__mutex); | |||||
| else | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_lock (__gthread_mutex_t *__mutex) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_mutex_lock) (__mutex); | |||||
| else | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_trylock (__gthread_mutex_t *__mutex) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_mutex_trylock) (__mutex); | |||||
| else | |||||
| return 0; | |||||
| } | |||||
| #if _GTHREAD_USE_MUTEX_TIMEDLOCK | |||||
| static inline int | |||||
| __gthread_mutex_timedlock (__gthread_mutex_t *__mutex, | |||||
| const __gthread_time_t *__abs_timeout) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_mutex_timedlock) (__mutex, __abs_timeout); | |||||
| else | |||||
| return 0; | |||||
| } | |||||
| #endif | |||||
| static inline int | |||||
| __gthread_mutex_unlock (__gthread_mutex_t *__mutex) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_mutex_unlock) (__mutex); | |||||
| else | |||||
| return 0; | |||||
| } | |||||
| #if !defined( PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP) \ | |||||
| || defined(_GTHREAD_USE_RECURSIVE_MUTEX_INIT_FUNC) | |||||
| static inline int | |||||
| __gthread_recursive_mutex_init_function (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| { | |||||
| pthread_mutexattr_t __attr; | |||||
| int __r; | |||||
| __r = __gthrw_(pthread_mutexattr_init) (&__attr); | |||||
| if (!__r) | |||||
| __r = __gthrw_(pthread_mutexattr_settype) (&__attr, | |||||
| PTHREAD_MUTEX_RECURSIVE); | |||||
| if (!__r) | |||||
| __r = __gthrw_(pthread_mutex_init) (__mutex, &__attr); | |||||
| if (!__r) | |||||
| __r = __gthrw_(pthread_mutexattr_destroy) (&__attr); | |||||
| return __r; | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| #endif | |||||
| static inline int | |||||
| __gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_lock (__mutex); | |||||
| } | |||||
| static inline int | |||||
| __gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_trylock (__mutex); | |||||
| } | |||||
| #if _GTHREAD_USE_MUTEX_TIMEDLOCK | |||||
| static inline int | |||||
| __gthread_recursive_mutex_timedlock (__gthread_recursive_mutex_t *__mutex, | |||||
| const __gthread_time_t *__abs_timeout) | |||||
| { | |||||
| return __gthread_mutex_timedlock (__mutex, __abs_timeout); | |||||
| } | |||||
| #endif | |||||
| static inline int | |||||
| __gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_unlock (__mutex); | |||||
| } | |||||
| static inline int | |||||
| __gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_destroy (__mutex); | |||||
| } | |||||
| #ifdef _GTHREAD_USE_COND_INIT_FUNC | |||||
| static inline void | |||||
| __gthread_cond_init_function (__gthread_cond_t *__cond) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| __gthrw_(pthread_cond_init) (__cond, NULL); | |||||
| } | |||||
| #endif | |||||
| static inline int | |||||
| __gthread_cond_broadcast (__gthread_cond_t *__cond) | |||||
| { | |||||
| return __gthrw_(pthread_cond_broadcast) (__cond); | |||||
| } | |||||
| static inline int | |||||
| __gthread_cond_signal (__gthread_cond_t *__cond) | |||||
| { | |||||
| return __gthrw_(pthread_cond_signal) (__cond); | |||||
| } | |||||
| static inline int | |||||
| __gthread_cond_wait (__gthread_cond_t *__cond, __gthread_mutex_t *__mutex) | |||||
| { | |||||
| return __gthrw_(pthread_cond_wait) (__cond, __mutex); | |||||
| } | |||||
| static inline int | |||||
| __gthread_cond_timedwait (__gthread_cond_t *__cond, __gthread_mutex_t *__mutex, | |||||
| const __gthread_time_t *__abs_timeout) | |||||
| { | |||||
| return __gthrw_(pthread_cond_timedwait) (__cond, __mutex, __abs_timeout); | |||||
| } | |||||
| static inline int | |||||
| __gthread_cond_wait_recursive (__gthread_cond_t *__cond, | |||||
| __gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_cond_wait (__cond, __mutex); | |||||
| } | |||||
| static inline int | |||||
| __gthread_cond_destroy (__gthread_cond_t* __cond) | |||||
| { | |||||
| return __gthrw_(pthread_cond_destroy) (__cond); | |||||
| } | |||||
| #endif /* _LIBOBJC */ | |||||
| #endif /* ! _GLIBCXX_GCC_GTHR_POSIX_H */ | 
| /* Threads compatibility routines for libgcc2 and libobjc. */ | |||||
| /* Compile this one with gcc. */ | |||||
| /* Copyright (C) 1997-2020 Free Software Foundation, Inc. | |||||
| This file is part of GCC. | |||||
| GCC is free software; you can redistribute it and/or modify it under | |||||
| the terms of the GNU General Public License as published by the Free | |||||
| Software Foundation; either version 3, or (at your option) any later | |||||
| version. | |||||
| GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |||||
| WARRANTY; without even the implied warranty of MERCHANTABILITY or | |||||
| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |||||
| for more details. | |||||
| Under Section 7 of GPL version 3, you are granted additional | |||||
| permissions described in the GCC Runtime Library Exception, version | |||||
| 3.1, as published by the Free Software Foundation. | |||||
| You should have received a copy of the GNU General Public License and | |||||
| a copy of the GCC Runtime Library Exception along with this program; | |||||
| see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| <http://www.gnu.org/licenses/>. */ | |||||
| #ifndef _GLIBCXX_GCC_GTHR_SINGLE_H | |||||
| #define _GLIBCXX_GCC_GTHR_SINGLE_H | |||||
| /* Just provide compatibility for mutex handling. */ | |||||
| typedef int __gthread_key_t; | |||||
| typedef int __gthread_once_t; | |||||
| typedef int __gthread_mutex_t; | |||||
| typedef int __gthread_recursive_mutex_t; | |||||
| #define __GTHREAD_ONCE_INIT 0 | |||||
| #define __GTHREAD_MUTEX_INIT 0 | |||||
| #define __GTHREAD_MUTEX_INIT_FUNCTION(mx) do {} while (0) | |||||
| #define __GTHREAD_RECURSIVE_MUTEX_INIT 0 | |||||
| #define _GLIBCXX_UNUSED __attribute__((__unused__)) | |||||
| #ifdef _LIBOBJC | |||||
| /* Thread local storage for a single thread */ | |||||
| static void *thread_local_storage = NULL; | |||||
| /* Backend initialization functions */ | |||||
| /* Initialize the threads subsystem. */ | |||||
| static inline int | |||||
| __gthread_objc_init_thread_system (void) | |||||
| { | |||||
| /* No thread support available */ | |||||
| return -1; | |||||
| } | |||||
| /* Close the threads subsystem. */ | |||||
| static inline int | |||||
| __gthread_objc_close_thread_system (void) | |||||
| { | |||||
| /* No thread support available */ | |||||
| return -1; | |||||
| } | |||||
| /* Backend thread functions */ | |||||
| /* Create a new thread of execution. */ | |||||
| static inline objc_thread_t | |||||
| __gthread_objc_thread_detach (void (* func)(void *), void * arg _GLIBCXX_UNUSED) | |||||
| { | |||||
| /* No thread support available */ | |||||
| return NULL; | |||||
| } | |||||
| /* Set the current thread's priority. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_set_priority (int priority _GLIBCXX_UNUSED) | |||||
| { | |||||
| /* No thread support available */ | |||||
| return -1; | |||||
| } | |||||
| /* Return the current thread's priority. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_get_priority (void) | |||||
| { | |||||
| return OBJC_THREAD_INTERACTIVE_PRIORITY; | |||||
| } | |||||
| /* Yield our process time to another thread. */ | |||||
| static inline void | |||||
| __gthread_objc_thread_yield (void) | |||||
| { | |||||
| return; | |||||
| } | |||||
| /* Terminate the current thread. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_exit (void) | |||||
| { | |||||
| /* No thread support available */ | |||||
| /* Should we really exit the program */ | |||||
| /* exit (&__objc_thread_exit_status); */ | |||||
| return -1; | |||||
| } | |||||
| /* Returns an integer value which uniquely describes a thread. */ | |||||
| static inline objc_thread_t | |||||
| __gthread_objc_thread_id (void) | |||||
| { | |||||
| /* No thread support, use 1. */ | |||||
| return (objc_thread_t) 1; | |||||
| } | |||||
| /* Sets the thread's local storage pointer. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_set_data (void *value) | |||||
| { | |||||
| thread_local_storage = value; | |||||
| return 0; | |||||
| } | |||||
| /* Returns the thread's local storage pointer. */ | |||||
| static inline void * | |||||
| __gthread_objc_thread_get_data (void) | |||||
| { | |||||
| return thread_local_storage; | |||||
| } | |||||
| /* Backend mutex functions */ | |||||
| /* Allocate a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_allocate (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Deallocate a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_deallocate (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Grab a lock on a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_lock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| /* There can only be one thread, so we always get the lock */ | |||||
| return 0; | |||||
| } | |||||
| /* Try to grab a lock on a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_trylock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| /* There can only be one thread, so we always get the lock */ | |||||
| return 0; | |||||
| } | |||||
| /* Unlock the mutex */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_unlock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Backend condition mutex functions */ | |||||
| /* Allocate a condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_allocate (objc_condition_t condition _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Deallocate a condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_deallocate (objc_condition_t condition _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Wait on the condition */ | |||||
| static inline int | |||||
| __gthread_objc_condition_wait (objc_condition_t condition _GLIBCXX_UNUSED, | |||||
| objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Wake up all threads waiting on this condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_broadcast (objc_condition_t condition _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Wake up one thread waiting on this condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_signal (objc_condition_t condition _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| #else /* _LIBOBJC */ | |||||
| static inline int | |||||
| __gthread_active_p (void) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_once (__gthread_once_t *__once _GLIBCXX_UNUSED, void (*__func) (void) _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int _GLIBCXX_UNUSED | |||||
| __gthread_key_create (__gthread_key_t *__key _GLIBCXX_UNUSED, void (*__func) (void *) _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static int _GLIBCXX_UNUSED | |||||
| __gthread_key_delete (__gthread_key_t __key _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline void * | |||||
| __gthread_getspecific (__gthread_key_t __key _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_setspecific (__gthread_key_t __key _GLIBCXX_UNUSED, const void *__v _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_destroy (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_lock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_trylock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_unlock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_lock (__mutex); | |||||
| } | |||||
| static inline int | |||||
| __gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_trylock (__mutex); | |||||
| } | |||||
| static inline int | |||||
| __gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_unlock (__mutex); | |||||
| } | |||||
| static inline int | |||||
| __gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_destroy (__mutex); | |||||
| } | |||||
| #endif /* _LIBOBJC */ | |||||
| #undef _GLIBCXX_UNUSED | |||||
| #endif /* ! _GLIBCXX_GCC_GTHR_SINGLE_H */ | 
| /* Threads compatibility routines for libgcc2. */ | |||||
| /* Compile this one with gcc. */ | |||||
| /* Copyright (C) 1997-2020 Free Software Foundation, Inc. | |||||
| This file is part of GCC. | |||||
| GCC is free software; you can redistribute it and/or modify it under | |||||
| the terms of the GNU General Public License as published by the Free | |||||
| Software Foundation; either version 3, or (at your option) any later | |||||
| version. | |||||
| GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |||||
| WARRANTY; without even the implied warranty of MERCHANTABILITY or | |||||
| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |||||
| for more details. | |||||
| Under Section 7 of GPL version 3, you are granted additional | |||||
| permissions described in the GCC Runtime Library Exception, version | |||||
| 3.1, as published by the Free Software Foundation. | |||||
| You should have received a copy of the GNU General Public License and | |||||
| a copy of the GCC Runtime Library Exception along with this program; | |||||
| see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| <http://www.gnu.org/licenses/>. */ | |||||
| #ifndef _GLIBCXX_GCC_GTHR_H | |||||
| #define _GLIBCXX_GCC_GTHR_H | |||||
| #ifndef _GLIBCXX_HIDE_EXPORTS | |||||
| #pragma GCC visibility push(default) | |||||
| #endif | |||||
| /* If this file is compiled with threads support, it must | |||||
| #define __GTHREADS 1 | |||||
| to indicate that threads support is present. Also it has define | |||||
| function | |||||
| int __gthread_active_p () | |||||
| that returns 1 if thread system is active, 0 if not. | |||||
| The threads interface must define the following types: | |||||
| __gthread_key_t | |||||
| __gthread_once_t | |||||
| __gthread_mutex_t | |||||
| __gthread_recursive_mutex_t | |||||
| The threads interface must define the following macros: | |||||
| __GTHREAD_ONCE_INIT | |||||
| to initialize __gthread_once_t | |||||
| __GTHREAD_MUTEX_INIT | |||||
| to initialize __gthread_mutex_t to get a fast | |||||
| non-recursive mutex. | |||||
| __GTHREAD_MUTEX_INIT_FUNCTION | |||||
| to initialize __gthread_mutex_t to get a fast | |||||
| non-recursive mutex. | |||||
| Define this to a function which looks like this: | |||||
| void __GTHREAD_MUTEX_INIT_FUNCTION (__gthread_mutex_t *) | |||||
| Some systems can't initialize a mutex without a | |||||
| function call. Don't define __GTHREAD_MUTEX_INIT in this case. | |||||
| __GTHREAD_RECURSIVE_MUTEX_INIT | |||||
| __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION | |||||
| as above, but for a recursive mutex. | |||||
| The threads interface must define the following static functions: | |||||
| int __gthread_once (__gthread_once_t *once, void (*func) ()) | |||||
| int __gthread_key_create (__gthread_key_t *keyp, void (*dtor) (void *)) | |||||
| int __gthread_key_delete (__gthread_key_t key) | |||||
| void *__gthread_getspecific (__gthread_key_t key) | |||||
| int __gthread_setspecific (__gthread_key_t key, const void *ptr) | |||||
| int __gthread_mutex_destroy (__gthread_mutex_t *mutex); | |||||
| int __gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *mutex); | |||||
| int __gthread_mutex_lock (__gthread_mutex_t *mutex); | |||||
| int __gthread_mutex_trylock (__gthread_mutex_t *mutex); | |||||
| int __gthread_mutex_unlock (__gthread_mutex_t *mutex); | |||||
| int __gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *mutex); | |||||
| int __gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *mutex); | |||||
| int __gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *mutex); | |||||
| The following are supported in POSIX threads only. They are required to | |||||
| fix a deadlock in static initialization inside libsupc++. The header file | |||||
| gthr-posix.h defines a symbol __GTHREAD_HAS_COND to signify that these extra | |||||
| features are supported. | |||||
| Types: | |||||
| __gthread_cond_t | |||||
| Macros: | |||||
| __GTHREAD_COND_INIT | |||||
| __GTHREAD_COND_INIT_FUNCTION | |||||
| Interface: | |||||
| int __gthread_cond_broadcast (__gthread_cond_t *cond); | |||||
| int __gthread_cond_wait (__gthread_cond_t *cond, __gthread_mutex_t *mutex); | |||||
| int __gthread_cond_wait_recursive (__gthread_cond_t *cond, | |||||
| __gthread_recursive_mutex_t *mutex); | |||||
| All functions returning int should return zero on success or the error | |||||
| number. If the operation is not supported, -1 is returned. | |||||
| If the following are also defined, you should | |||||
| #define __GTHREADS_CXX0X 1 | |||||
| to enable the c++0x thread library. | |||||
| Types: | |||||
| __gthread_t | |||||
| __gthread_time_t | |||||
| Interface: | |||||
| int __gthread_create (__gthread_t *thread, void *(*func) (void*), | |||||
| void *args); | |||||
| int __gthread_join (__gthread_t thread, void **value_ptr); | |||||
| int __gthread_detach (__gthread_t thread); | |||||
| int __gthread_equal (__gthread_t t1, __gthread_t t2); | |||||
| __gthread_t __gthread_self (void); | |||||
| int __gthread_yield (void); | |||||
| int __gthread_mutex_timedlock (__gthread_mutex_t *m, | |||||
| const __gthread_time_t *abs_timeout); | |||||
| int __gthread_recursive_mutex_timedlock (__gthread_recursive_mutex_t *m, | |||||
| const __gthread_time_t *abs_time); | |||||
| int __gthread_cond_signal (__gthread_cond_t *cond); | |||||
| int __gthread_cond_timedwait (__gthread_cond_t *cond, | |||||
| __gthread_mutex_t *mutex, | |||||
| const __gthread_time_t *abs_timeout); | |||||
| */ | |||||
| #if __GXX_WEAK__ | |||||
| /* The pe-coff weak support isn't fully compatible to ELF's weak. | |||||
| For static libraries it might would work, but as we need to deal | |||||
| with shared versions too, we disable it for mingw-targets. */ | |||||
| #ifdef __MINGW32__ | |||||
| #undef _GLIBCXX_GTHREAD_USE_WEAK | |||||
| #define _GLIBCXX_GTHREAD_USE_WEAK 0 | |||||
| #endif | |||||
| #ifndef _GLIBCXX_GTHREAD_USE_WEAK | |||||
| #define _GLIBCXX_GTHREAD_USE_WEAK 1 | |||||
| #endif | |||||
| #endif | |||||
| #include <bits/gthr-default.h> | |||||
| #ifndef _GLIBCXX_HIDE_EXPORTS | |||||
| #pragma GCC visibility pop | |||||
| #endif | |||||
| #endif /* ! _GLIBCXX_GCC_GTHR_H */ | 
| // std::messages implementation details, generic version -*- C++ -*- | |||||
| // Copyright (C) 2001-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/messages_members.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{locale} | |||||
| */ | |||||
| // | |||||
| // ISO C++ 14882: 22.2.7.1.2 messages virtual functions | |||||
| // | |||||
| // Written by Benjamin Kosnik <bkoz@redhat.com> | |||||
| namespace std _GLIBCXX_VISIBILITY(default) | |||||
| { | |||||
| _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||||
| // Non-virtual member functions. | |||||
| template<typename _CharT> | |||||
| messages<_CharT>::messages(size_t __refs) | |||||
| : facet(__refs) | |||||
| { _M_c_locale_messages = _S_get_c_locale(); } | |||||
| template<typename _CharT> | |||||
| messages<_CharT>::messages(__c_locale, const char*, size_t __refs) | |||||
| : facet(__refs) | |||||
| { _M_c_locale_messages = _S_get_c_locale(); } | |||||
| template<typename _CharT> | |||||
| typename messages<_CharT>::catalog | |||||
| messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc, | |||||
| const char*) const | |||||
| { return this->do_open(__s, __loc); } | |||||
| // Virtual member functions. | |||||
| template<typename _CharT> | |||||
| messages<_CharT>::~messages() | |||||
| { _S_destroy_c_locale(_M_c_locale_messages); } | |||||
| template<typename _CharT> | |||||
| typename messages<_CharT>::catalog | |||||
| messages<_CharT>::do_open(const basic_string<char>&, const locale&) const | |||||
| { return 0; } | |||||
| template<typename _CharT> | |||||
| typename messages<_CharT>::string_type | |||||
| messages<_CharT>::do_get(catalog, int, int, | |||||
| const string_type& __dfault) const | |||||
| { return __dfault; } | |||||
| template<typename _CharT> | |||||
| void | |||||
| messages<_CharT>::do_close(catalog) const | |||||
| { } | |||||
| // messages_byname | |||||
| template<typename _CharT> | |||||
| messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs) | |||||
| : messages<_CharT>(__refs) | |||||
| { | |||||
| if (__builtin_strcmp(__s, "C") != 0 | |||||
| && __builtin_strcmp(__s, "POSIX") != 0) | |||||
| { | |||||
| this->_S_destroy_c_locale(this->_M_c_locale_messages); | |||||
| this->_S_create_c_locale(this->_M_c_locale_messages, __s); | |||||
| } | |||||
| } | |||||
| _GLIBCXX_END_NAMESPACE_VERSION | |||||
| } // namespace | 
| // Optimizations for random number handling, generic version -*- C++ -*- | |||||
| // Copyright (C) 2012-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/opt_random.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{random} | |||||
| */ | |||||
| #ifndef _BITS_OPT_RANDOM_H | |||||
| #define _BITS_OPT_RANDOM_H 1 | |||||
| #pragma GCC system_header | |||||
| #endif // _BITS_OPT_RANDOM_H | 
| // Specific definitions for newlib -*- C++ -*- | |||||
| // Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/os_defines.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{iosfwd} | |||||
| */ | |||||
| #ifndef _GLIBCXX_OS_DEFINES | |||||
| #define _GLIBCXX_OS_DEFINES 1 | |||||
| // System-specific #define, typedefs, corrections, etc, go here. This | |||||
| // file will come before all others. | |||||
| #ifdef __CYGWIN__ | |||||
| #define _GLIBCXX_GTHREAD_USE_WEAK 0 | |||||
| #if defined (_GLIBCXX_DLL) | |||||
| #define _GLIBCXX_PSEUDO_VISIBILITY_default __attribute__ ((__dllimport__)) | |||||
| #else | |||||
| #define _GLIBCXX_PSEUDO_VISIBILITY_default | |||||
| #endif | |||||
| #define _GLIBCXX_PSEUDO_VISIBILITY_hidden | |||||
| #define _GLIBCXX_PSEUDO_VISIBILITY(V) _GLIBCXX_PSEUDO_VISIBILITY_ ## V | |||||
| // See libstdc++/20806. | |||||
| #define _GLIBCXX_HAVE_DOS_BASED_FILESYSTEM 1 | |||||
| // Enable use of GetModuleHandleEx (requires Windows XP/2003) in | |||||
| // __cxa_thread_atexit to prevent modules from being unloaded before | |||||
| // their dtors are called | |||||
| #define _GLIBCXX_THREAD_ATEXIT_WIN32 1 | |||||
| // See libstdc++/69506 | |||||
| #define _GLIBCXX_USE_WEAK_REF 0 | |||||
| #endif | |||||
| #endif | 
| // C++ includes used for precompiling -*- C++ -*- | |||||
| // Copyright (C) 2003-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file stdc++.h | |||||
| * This is an implementation file for a precompiled header. | |||||
| */ | |||||
| // 17.4.1.2 Headers | |||||
| // C | |||||
| #ifndef _GLIBCXX_NO_ASSERT | |||||
| #include <cassert> | |||||
| #endif | |||||
| #include <cctype> | |||||
| #include <cerrno> | |||||
| #include <cfloat> | |||||
| #include <ciso646> | |||||
| #include <climits> | |||||
| #include <clocale> | |||||
| #include <cmath> | |||||
| #include <csetjmp> | |||||
| #include <csignal> | |||||
| #include <cstdarg> | |||||
| #include <cstddef> | |||||
| #include <cstdio> | |||||
| #include <cstdlib> | |||||
| #include <cstring> | |||||
| #include <ctime> | |||||
| #include <cwchar> | |||||
| #include <cwctype> | |||||
| #if __cplusplus >= 201103L | |||||
| #include <ccomplex> | |||||
| #include <cfenv> | |||||
| #include <cinttypes> | |||||
| #include <cstdalign> | |||||
| #include <cstdbool> | |||||
| #include <cstdint> | |||||
| #include <ctgmath> | |||||
| #include <cuchar> | |||||
| #endif | |||||
| // C++ | |||||
| #include <algorithm> | |||||
| #include <bitset> | |||||
| #include <complex> | |||||
| #include <deque> | |||||
| #include <exception> | |||||
| #include <fstream> | |||||
| #include <functional> | |||||
| #include <iomanip> | |||||
| #include <ios> | |||||
| #include <iosfwd> | |||||
| #include <iostream> | |||||
| #include <istream> | |||||
| #include <iterator> | |||||
| #include <limits> | |||||
| #include <list> | |||||
| #include <locale> | |||||
| #include <map> | |||||
| #include <memory> | |||||
| #include <new> | |||||
| #include <numeric> | |||||
| #include <ostream> | |||||
| #include <queue> | |||||
| #include <set> | |||||
| #include <sstream> | |||||
| #include <stack> | |||||
| #include <stdexcept> | |||||
| #include <streambuf> | |||||
| #include <string> | |||||
| #include <typeinfo> | |||||
| #include <utility> | |||||
| #include <valarray> | |||||
| #include <vector> | |||||
| #if __cplusplus >= 201103L | |||||
| #include <array> | |||||
| #include <atomic> | |||||
| #include <chrono> | |||||
| #include <codecvt> | |||||
| #include <condition_variable> | |||||
| #include <forward_list> | |||||
| #include <future> | |||||
| #include <initializer_list> | |||||
| #include <mutex> | |||||
| #include <random> | |||||
| #include <ratio> | |||||
| #include <regex> | |||||
| #include <scoped_allocator> | |||||
| #include <system_error> | |||||
| #include <thread> | |||||
| #include <tuple> | |||||
| #include <typeindex> | |||||
| #include <type_traits> | |||||
| #include <unordered_map> | |||||
| #include <unordered_set> | |||||
| #endif | |||||
| #if __cplusplus >= 201402L | |||||
| #include <shared_mutex> | |||||
| #endif | |||||
| #if __cplusplus >= 201703L | |||||
| #include <any> | |||||
| #include <charconv> | |||||
| // #include <execution> | |||||
| #include <filesystem> | |||||
| #include <optional> | |||||
| #include <memory_resource> | |||||
| #include <string_view> | |||||
| #include <variant> | |||||
| #endif | |||||
| #if __cplusplus > 201703L | |||||
| #include <bit> | |||||
| #include <compare> | |||||
| #include <concepts> | |||||
| #include <numbers> | |||||
| #include <ranges> | |||||
| #include <span> | |||||
| #include <stop_token> | |||||
| // #include <syncstream> | |||||
| #include <version> | |||||
| #endif | 
| // C++ includes used for precompiling TR1 -*- C++ -*- | |||||
| // Copyright (C) 2006-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file stdtr1c++.h | |||||
| * This is an implementation file for a precompiled header. | |||||
| */ | |||||
| #include <bits/stdc++.h> | |||||
| #include <tr1/array> | |||||
| #include <tr1/cctype> | |||||
| #include <tr1/cfenv> | |||||
| #include <tr1/cfloat> | |||||
| #include <tr1/cinttypes> | |||||
| #include <tr1/climits> | |||||
| #include <tr1/cmath> | |||||
| #include <tr1/complex> | |||||
| #include <tr1/cstdarg> | |||||
| #include <tr1/cstdbool> | |||||
| #include <tr1/cstdint> | |||||
| #include <tr1/cstdio> | |||||
| #include <tr1/cstdlib> | |||||
| #include <tr1/ctgmath> | |||||
| #include <tr1/ctime> | |||||
| #include <tr1/cwchar> | |||||
| #include <tr1/cwctype> | |||||
| #include <tr1/functional> | |||||
| #include <tr1/random> | |||||
| #include <tr1/tuple> | |||||
| #include <tr1/unordered_map> | |||||
| #include <tr1/unordered_set> | |||||
| #include <tr1/utility> | 
| // std::time_get, std::time_put implementation, generic version -*- C++ -*- | |||||
| // Copyright (C) 2001-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/time_members.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{locale} | |||||
| */ | |||||
| // | |||||
| // ISO C++ 14882: 22.2.5.1.2 - time_get functions | |||||
| // ISO C++ 14882: 22.2.5.3.2 - time_put functions | |||||
| // | |||||
| // Written by Benjamin Kosnik <bkoz@redhat.com> | |||||
| namespace std _GLIBCXX_VISIBILITY(default) | |||||
| { | |||||
| _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||||
| template<typename _CharT> | |||||
| __timepunct<_CharT>::__timepunct(size_t __refs) | |||||
| : facet(__refs), _M_data(0) | |||||
| { | |||||
| _M_name_timepunct = _S_get_c_name(); | |||||
| _M_initialize_timepunct(); | |||||
| } | |||||
| template<typename _CharT> | |||||
| __timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs) | |||||
| : facet(__refs), _M_data(__cache) | |||||
| { | |||||
| _M_name_timepunct = _S_get_c_name(); | |||||
| _M_initialize_timepunct(); | |||||
| } | |||||
| template<typename _CharT> | |||||
| __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s, | |||||
| size_t __refs) | |||||
| : facet(__refs), _M_data(0) | |||||
| { | |||||
| if (__builtin_strcmp(__s, _S_get_c_name()) != 0) | |||||
| { | |||||
| const size_t __len = __builtin_strlen(__s) + 1; | |||||
| char* __tmp = new char[__len]; | |||||
| __builtin_memcpy(__tmp, __s, __len); | |||||
| _M_name_timepunct = __tmp; | |||||
| } | |||||
| else | |||||
| _M_name_timepunct = _S_get_c_name(); | |||||
| __try | |||||
| { _M_initialize_timepunct(__cloc); } | |||||
| __catch(...) | |||||
| { | |||||
| if (_M_name_timepunct != _S_get_c_name()) | |||||
| delete [] _M_name_timepunct; | |||||
| __throw_exception_again; | |||||
| } | |||||
| } | |||||
| template<typename _CharT> | |||||
| __timepunct<_CharT>::~__timepunct() | |||||
| { | |||||
| if (_M_name_timepunct != _S_get_c_name()) | |||||
| delete [] _M_name_timepunct; | |||||
| delete _M_data; | |||||
| _S_destroy_c_locale(_M_c_locale_timepunct); | |||||
| } | |||||
| _GLIBCXX_END_NAMESPACE_VERSION | |||||
| } // namespace | 
| // Optimizations for random number extensions, generic version -*- C++ -*- | |||||
| // Copyright (C) 2012-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file ext/opt_random.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{ext/random} | |||||
| */ | |||||
| #ifndef _EXT_OPT_RANDOM_H | |||||
| #define _EXT_OPT_RANDOM_H 1 | |||||
| #pragma GCC system_header | |||||
| #endif // _EXT_OPT_RANDOM_H | 
| // Low-level type for atomic operations -*- C++ -*- | |||||
| // Copyright (C) 2004-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file atomic_word.h | |||||
| * This file is a GNU extension to the Standard C++ Library. | |||||
| */ | |||||
| #ifndef _GLIBCXX_ATOMIC_WORD_H | |||||
| #define _GLIBCXX_ATOMIC_WORD_H 1 | |||||
| typedef int _Atomic_word; | |||||
| // This is a memory order acquire fence. | |||||
| #define _GLIBCXX_READ_MEM_BARRIER __atomic_thread_fence (__ATOMIC_ACQUIRE) | |||||
| // This is a memory order release fence. | |||||
| #define _GLIBCXX_WRITE_MEM_BARRIER __atomic_thread_fence (__ATOMIC_RELEASE) | |||||
| #endif | 
| // Wrapper of C-language FILE struct -*- C++ -*- | |||||
| // Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| // | |||||
| // ISO C++ 14882: 27.8 File-based streams | |||||
| // | |||||
| /** @file bits/basic_file.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{ios} | |||||
| */ | |||||
| #ifndef _GLIBCXX_BASIC_FILE_STDIO_H | |||||
| #define _GLIBCXX_BASIC_FILE_STDIO_H 1 | |||||
| #pragma GCC system_header | |||||
| #include <bits/c++config.h> | |||||
| #include <bits/c++io.h> // for __c_lock and __c_file | |||||
| #include <bits/move.h> // for swap | |||||
| #include <ios> | |||||
| namespace std _GLIBCXX_VISIBILITY(default) | |||||
| { | |||||
| _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||||
| // Generic declaration. | |||||
| template<typename _CharT> | |||||
| class __basic_file; | |||||
| // Specialization. | |||||
| template<> | |||||
| class __basic_file<char> | |||||
| { | |||||
| // Underlying data source/sink. | |||||
| __c_file* _M_cfile; | |||||
| // True iff we opened _M_cfile, and thus must close it ourselves. | |||||
| bool _M_cfile_created; | |||||
| public: | |||||
| __basic_file(__c_lock* __lock = 0) throw (); | |||||
| #if __cplusplus >= 201103L | |||||
| __basic_file(__basic_file&& __rv, __c_lock* = 0) noexcept | |||||
| : _M_cfile(__rv._M_cfile), _M_cfile_created(__rv._M_cfile_created) | |||||
| { | |||||
| __rv._M_cfile = nullptr; | |||||
| __rv._M_cfile_created = false; | |||||
| } | |||||
| __basic_file& operator=(const __basic_file&) = delete; | |||||
| __basic_file& operator=(__basic_file&&) = delete; | |||||
| void | |||||
| swap(__basic_file& __f) noexcept | |||||
| { | |||||
| std::swap(_M_cfile, __f._M_cfile); | |||||
| std::swap(_M_cfile_created, __f._M_cfile_created); | |||||
| } | |||||
| #endif | |||||
| __basic_file* | |||||
| open(const char* __name, ios_base::openmode __mode, int __prot = 0664); | |||||
| #if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T | |||||
| __basic_file* | |||||
| open(const wchar_t* __name, ios_base::openmode __mode); | |||||
| #endif | |||||
| __basic_file* | |||||
| sys_open(__c_file* __file, ios_base::openmode); | |||||
| __basic_file* | |||||
| sys_open(int __fd, ios_base::openmode __mode) throw (); | |||||
| __basic_file* | |||||
| close(); | |||||
| _GLIBCXX_PURE bool | |||||
| is_open() const throw (); | |||||
| _GLIBCXX_PURE int | |||||
| fd() throw (); | |||||
| _GLIBCXX_PURE __c_file* | |||||
| file() throw (); | |||||
| ~__basic_file(); | |||||
| streamsize | |||||
| xsputn(const char* __s, streamsize __n); | |||||
| streamsize | |||||
| xsputn_2(const char* __s1, streamsize __n1, | |||||
| const char* __s2, streamsize __n2); | |||||
| streamsize | |||||
| xsgetn(char* __s, streamsize __n); | |||||
| streamoff | |||||
| seekoff(streamoff __off, ios_base::seekdir __way) throw (); | |||||
| int | |||||
| sync(); | |||||
| streamsize | |||||
| showmanyc(); | |||||
| }; | |||||
| _GLIBCXX_END_NAMESPACE_VERSION | |||||
| } // namespace | |||||
| #endif | 
| // Base to std::allocator -*- C++ -*- | |||||
| // Copyright (C) 2004-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/c++allocator.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{memory} | |||||
| */ | |||||
| #ifndef _GLIBCXX_CXX_ALLOCATOR_H | |||||
| #define _GLIBCXX_CXX_ALLOCATOR_H 1 | |||||
| #include <ext/new_allocator.h> | |||||
| #if __cplusplus >= 201103L | |||||
| namespace std | |||||
| { | |||||
| /** | |||||
| * @brief An alias to the base class for std::allocator. | |||||
| * | |||||
| * Used to set the std::allocator base class to | |||||
| * __gnu_cxx::new_allocator. | |||||
| * | |||||
| * @ingroup allocators | |||||
| * @tparam _Tp Type of allocated object. | |||||
| */ | |||||
| template<typename _Tp> | |||||
| using __allocator_base = __gnu_cxx::new_allocator<_Tp>; | |||||
| } | |||||
| #else | |||||
| // Define new_allocator as the base class to std::allocator. | |||||
| # define __allocator_base __gnu_cxx::new_allocator | |||||
| #endif | |||||
| #if defined(__SANITIZE_ADDRESS__) && !defined(_GLIBCXX_SANITIZE_STD_ALLOCATOR) | |||||
| # define _GLIBCXX_SANITIZE_STD_ALLOCATOR 1 | |||||
| #endif | |||||
| #endif | 
| // Underlying io library details -*- C++ -*- | |||||
| // Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/c++io.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{ios} | |||||
| */ | |||||
| // c_io_stdio.h - Defines for using "C" stdio.h | |||||
| #ifndef _GLIBCXX_CXX_IO_H | |||||
| #define _GLIBCXX_CXX_IO_H 1 | |||||
| #include <cstdio> | |||||
| #include <bits/gthr.h> | |||||
| namespace std _GLIBCXX_VISIBILITY(default) | |||||
| { | |||||
| _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||||
| typedef __gthread_mutex_t __c_lock; | |||||
| // for basic_file.h | |||||
| typedef FILE __c_file; | |||||
| _GLIBCXX_END_NAMESPACE_VERSION | |||||
| } // namespace | |||||
| #endif | 
| // Wrapper for underlying C-language localization -*- C++ -*- | |||||
| // Copyright (C) 2001-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/c++locale.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{locale} | |||||
| */ | |||||
| // | |||||
| // ISO C++ 14882: 22.8 Standard locale categories. | |||||
| // | |||||
| // Written by Benjamin Kosnik <bkoz@redhat.com> | |||||
| #ifndef _GLIBCXX_CXX_LOCALE_H | |||||
| #define _GLIBCXX_CXX_LOCALE_H 1 | |||||
| #pragma GCC system_header | |||||
| #include <clocale> | |||||
| #define _GLIBCXX_NUM_CATEGORIES 0 | |||||
| namespace std _GLIBCXX_VISIBILITY(default) | |||||
| { | |||||
| _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||||
| typedef int* __c_locale; | |||||
| // Convert numeric value of type double and long double to string and | |||||
| // return length of string. If vsnprintf is available use it, otherwise | |||||
| // fall back to the unsafe vsprintf which, in general, can be dangerous | |||||
| // and should be avoided. | |||||
| inline int | |||||
| __convert_from_v(const __c_locale&, char* __out, | |||||
| const int __size __attribute__((__unused__)), | |||||
| const char* __fmt, ...) | |||||
| { | |||||
| char* __old = std::setlocale(LC_NUMERIC, 0); | |||||
| char* __sav = 0; | |||||
| if (__builtin_strcmp(__old, "C")) | |||||
| { | |||||
| const size_t __len = __builtin_strlen(__old) + 1; | |||||
| __sav = new char[__len]; | |||||
| __builtin_memcpy(__sav, __old, __len); | |||||
| std::setlocale(LC_NUMERIC, "C"); | |||||
| } | |||||
| __builtin_va_list __args; | |||||
| __builtin_va_start(__args, __fmt); | |||||
| #if _GLIBCXX_USE_C99_STDIO && !_GLIBCXX_HAVE_BROKEN_VSNPRINTF | |||||
| const int __ret = __builtin_vsnprintf(__out, __size, __fmt, __args); | |||||
| #else | |||||
| const int __ret = __builtin_vsprintf(__out, __fmt, __args); | |||||
| #endif | |||||
| __builtin_va_end(__args); | |||||
| if (__sav) | |||||
| { | |||||
| std::setlocale(LC_NUMERIC, __sav); | |||||
| delete [] __sav; | |||||
| } | |||||
| return __ret; | |||||
| } | |||||
| _GLIBCXX_END_NAMESPACE_VERSION | |||||
| } // namespace | |||||
| #endif | 
| // Specific definitions for generic platforms -*- C++ -*- | |||||
| // Copyright (C) 2015-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/cpu_defines.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{iosfwd} | |||||
| */ | |||||
| #ifndef _GLIBCXX_CPU_DEFINES | |||||
| #define _GLIBCXX_CPU_DEFINES 1 | |||||
| // Integer divide instructions don't trap on ARM. | |||||
| #ifdef __ARM_ARCH_EXT_IDIV__ | |||||
| #define __glibcxx_integral_traps false | |||||
| #else | |||||
| #define __glibcxx_integral_traps true | |||||
| #endif | |||||
| #endif | 
| // Locale support -*- C++ -*- | |||||
| // Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| // | |||||
| // ISO C++ 14882: 22.1 Locales | |||||
| // | |||||
| // Information as gleaned from /usr/include/ctype.h | |||||
| namespace std _GLIBCXX_VISIBILITY(default) | |||||
| { | |||||
| _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||||
| /// @brief Base class for ctype. | |||||
| struct ctype_base | |||||
| { | |||||
| // Non-standard typedefs. | |||||
| typedef const int* __to_type; | |||||
| // NB: Offsets into ctype<char>::_M_table force a particular size | |||||
| // on the mask type. Because of this, we don't use an enum. | |||||
| typedef char mask; | |||||
| static const mask upper = _U; | |||||
| static const mask lower = _L; | |||||
| static const mask alpha = _U | _L; | |||||
| static const mask digit = _N; | |||||
| static const mask xdigit = _X | _N; | |||||
| static const mask space = _S; | |||||
| static const mask print = _P | _U | _L | _N | _B; | |||||
| static const mask graph = _P | _U | _L | _N; | |||||
| static const mask cntrl = _C; | |||||
| static const mask punct = _P; | |||||
| static const mask alnum = _U | _L | _N; | |||||
| #if __cplusplus >= 201103L | |||||
| static const mask blank = space; | |||||
| #endif | |||||
| }; | |||||
| _GLIBCXX_END_NAMESPACE_VERSION | |||||
| } // namespace | 
| // Locale support -*- C++ -*- | |||||
| // Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/ctype_inline.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{locale} | |||||
| */ | |||||
| // | |||||
| // ISO C++ 14882: 22.1 Locales | |||||
| // | |||||
| // ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) | |||||
| // functions go in ctype.cc | |||||
| namespace std _GLIBCXX_VISIBILITY(default) | |||||
| { | |||||
| _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||||
| bool | |||||
| ctype<char>:: | |||||
| is(mask __m, char __c) const | |||||
| { return _M_table[static_cast<unsigned char>(__c)] & __m; } | |||||
| const char* | |||||
| ctype<char>:: | |||||
| is(const char* __low, const char* __high, mask* __vec) const | |||||
| { | |||||
| while (__low < __high) | |||||
| *__vec++ = _M_table[static_cast<unsigned char>(*__low++)]; | |||||
| return __high; | |||||
| } | |||||
| const char* | |||||
| ctype<char>:: | |||||
| scan_is(mask __m, const char* __low, const char* __high) const | |||||
| { | |||||
| while (__low < __high && !this->is(__m, *__low)) | |||||
| ++__low; | |||||
| return __low; | |||||
| } | |||||
| const char* | |||||
| ctype<char>:: | |||||
| scan_not(mask __m, const char* __low, const char* __high) const | |||||
| { | |||||
| while (__low < __high && this->is(__m, *__low) != 0) | |||||
| ++__low; | |||||
| return __low; | |||||
| } | |||||
| _GLIBCXX_END_NAMESPACE_VERSION | |||||
| } // namespace | 
| // Control various target specific ABI tweaks. ARM version. | |||||
| // Copyright (C) 2004-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/cxxabi_tweaks.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{cxxabi.h} | |||||
| */ | |||||
| #ifndef _CXXABI_TWEAKS_H | |||||
| #define _CXXABI_TWEAKS_H 1 | |||||
| #ifdef __cplusplus | |||||
| namespace __cxxabiv1 | |||||
| { | |||||
| extern "C" | |||||
| { | |||||
| #endif | |||||
| #ifdef __ARM_EABI__ | |||||
| // The ARM EABI uses the least significant bit of a 32-bit | |||||
| // guard variable. */ | |||||
| #define _GLIBCXX_GUARD_TEST(x) ((*(x) & 1) != 0) | |||||
| #define _GLIBCXX_GUARD_SET(x) *(x) = 1 | |||||
| #define _GLIBCXX_GUARD_BIT 1 | |||||
| #define _GLIBCXX_GUARD_PENDING_BIT __guard_test_bit (1, 1) | |||||
| #define _GLIBCXX_GUARD_WAITING_BIT __guard_test_bit (2, 1) | |||||
| typedef int __guard; | |||||
| // We also want the element size in array cookies. | |||||
| #define _GLIBCXX_ELTSIZE_IN_COOKIE 1 | |||||
| // __cxa_vec_ctor should return a pointer to the array. | |||||
| typedef void * __cxa_vec_ctor_return_type; | |||||
| #define _GLIBCXX_CXA_VEC_CTOR_RETURN(x) return x | |||||
| // Constructors and destructors return the "this" pointer. | |||||
| typedef void * __cxa_cdtor_return_type; | |||||
| #else // __ARM_EABI__ | |||||
| // The generic ABI uses the first byte of a 64-bit guard variable. | |||||
| #define _GLIBCXX_GUARD_TEST(x) (*(char *) (x) != 0) | |||||
| #define _GLIBCXX_GUARD_SET(x) *(char *) (x) = 1 | |||||
| #define _GLIBCXX_GUARD_BIT __guard_test_bit (0, 1) | |||||
| #define _GLIBCXX_GUARD_PENDING_BIT __guard_test_bit (1, 1) | |||||
| #define _GLIBCXX_GUARD_WAITING_BIT __guard_test_bit (2, 1) | |||||
| __extension__ typedef int __guard __attribute__((mode (__DI__))); | |||||
| // __cxa_vec_ctor has void return type. | |||||
| typedef void __cxa_vec_ctor_return_type; | |||||
| #define _GLIBCXX_CXA_VEC_CTOR_RETURN(x) return | |||||
| // Constructors and destructors do not return a value. | |||||
| typedef void __cxa_cdtor_return_type; | |||||
| #endif //!__ARM_EABI__ | |||||
| #ifdef __cplusplus | |||||
| } | |||||
| } // namespace __cxxabiv1 | |||||
| #endif | |||||
| #endif | 
| // Specific definitions for generic platforms -*- C++ -*- | |||||
| // Copyright (C) 2007-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/error_constants.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{system_error} | |||||
| */ | |||||
| #ifndef _GLIBCXX_ERROR_CONSTANTS | |||||
| #define _GLIBCXX_ERROR_CONSTANTS 1 | |||||
| #include <bits/c++config.h> | |||||
| #include <cerrno> | |||||
| namespace std _GLIBCXX_VISIBILITY(default) | |||||
| { | |||||
| _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||||
| enum class errc | |||||
| { | |||||
| address_family_not_supported = EAFNOSUPPORT, | |||||
| address_in_use = EADDRINUSE, | |||||
| address_not_available = EADDRNOTAVAIL, | |||||
| already_connected = EISCONN, | |||||
| argument_list_too_long = E2BIG, | |||||
| argument_out_of_domain = EDOM, | |||||
| bad_address = EFAULT, | |||||
| bad_file_descriptor = EBADF, | |||||
| #ifdef _GLIBCXX_HAVE_EBADMSG | |||||
| bad_message = EBADMSG, | |||||
| #endif | |||||
| broken_pipe = EPIPE, | |||||
| connection_aborted = ECONNABORTED, | |||||
| connection_already_in_progress = EALREADY, | |||||
| connection_refused = ECONNREFUSED, | |||||
| connection_reset = ECONNRESET, | |||||
| cross_device_link = EXDEV, | |||||
| destination_address_required = EDESTADDRREQ, | |||||
| device_or_resource_busy = EBUSY, | |||||
| directory_not_empty = ENOTEMPTY, | |||||
| executable_format_error = ENOEXEC, | |||||
| file_exists = EEXIST, | |||||
| file_too_large = EFBIG, | |||||
| filename_too_long = ENAMETOOLONG, | |||||
| function_not_supported = ENOSYS, | |||||
| host_unreachable = EHOSTUNREACH, | |||||
| #ifdef _GLIBCXX_HAVE_EIDRM | |||||
| identifier_removed = EIDRM, | |||||
| #endif | |||||
| illegal_byte_sequence = EILSEQ, | |||||
| inappropriate_io_control_operation = ENOTTY, | |||||
| interrupted = EINTR, | |||||
| invalid_argument = EINVAL, | |||||
| invalid_seek = ESPIPE, | |||||
| io_error = EIO, | |||||
| is_a_directory = EISDIR, | |||||
| message_size = EMSGSIZE, | |||||
| network_down = ENETDOWN, | |||||
| network_reset = ENETRESET, | |||||
| network_unreachable = ENETUNREACH, | |||||
| no_buffer_space = ENOBUFS, | |||||
| no_child_process = ECHILD, | |||||
| #ifdef _GLIBCXX_HAVE_ENOLINK | |||||
| no_link = ENOLINK, | |||||
| #endif | |||||
| no_lock_available = ENOLCK, | |||||
| #ifdef _GLIBCXX_HAVE_ENODATA | |||||
| no_message_available = ENODATA, | |||||
| #endif | |||||
| no_message = ENOMSG, | |||||
| no_protocol_option = ENOPROTOOPT, | |||||
| no_space_on_device = ENOSPC, | |||||
| #ifdef _GLIBCXX_HAVE_ENOSR | |||||
| no_stream_resources = ENOSR, | |||||
| #endif | |||||
| no_such_device_or_address = ENXIO, | |||||
| no_such_device = ENODEV, | |||||
| no_such_file_or_directory = ENOENT, | |||||
| no_such_process = ESRCH, | |||||
| not_a_directory = ENOTDIR, | |||||
| not_a_socket = ENOTSOCK, | |||||
| #ifdef _GLIBCXX_HAVE_ENOSTR | |||||
| not_a_stream = ENOSTR, | |||||
| #endif | |||||
| not_connected = ENOTCONN, | |||||
| not_enough_memory = ENOMEM, | |||||
| #ifdef _GLIBCXX_HAVE_ENOTSUP | |||||
| not_supported = ENOTSUP, | |||||
| #endif | |||||
| #ifdef _GLIBCXX_HAVE_ECANCELED | |||||
| operation_canceled = ECANCELED, | |||||
| #endif | |||||
| operation_in_progress = EINPROGRESS, | |||||
| operation_not_permitted = EPERM, | |||||
| operation_not_supported = EOPNOTSUPP, | |||||
| operation_would_block = EWOULDBLOCK, | |||||
| #ifdef _GLIBCXX_HAVE_EOWNERDEAD | |||||
| owner_dead = EOWNERDEAD, | |||||
| #endif | |||||
| permission_denied = EACCES, | |||||
| #ifdef _GLIBCXX_HAVE_EPROTO | |||||
| protocol_error = EPROTO, | |||||
| #endif | |||||
| protocol_not_supported = EPROTONOSUPPORT, | |||||
| read_only_file_system = EROFS, | |||||
| resource_deadlock_would_occur = EDEADLK, | |||||
| resource_unavailable_try_again = EAGAIN, | |||||
| result_out_of_range = ERANGE, | |||||
| #ifdef _GLIBCXX_HAVE_ENOTRECOVERABLE | |||||
| state_not_recoverable = ENOTRECOVERABLE, | |||||
| #endif | |||||
| #ifdef _GLIBCXX_HAVE_ETIME | |||||
| stream_timeout = ETIME, | |||||
| #endif | |||||
| #ifdef _GLIBCXX_HAVE_ETXTBSY | |||||
| text_file_busy = ETXTBSY, | |||||
| #endif | |||||
| timed_out = ETIMEDOUT, | |||||
| too_many_files_open_in_system = ENFILE, | |||||
| too_many_files_open = EMFILE, | |||||
| too_many_links = EMLINK, | |||||
| too_many_symbolic_link_levels = ELOOP, | |||||
| #ifdef _GLIBCXX_HAVE_EOVERFLOW | |||||
| value_too_large = EOVERFLOW, | |||||
| #endif | |||||
| wrong_protocol_type = EPROTOTYPE | |||||
| }; | |||||
| _GLIBCXX_END_NAMESPACE_VERSION | |||||
| } // namespace | |||||
| #endif | 
| // C++ includes used for precompiling extensions -*- C++ -*- | |||||
| // Copyright (C) 2006-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file extc++.h | |||||
| * This is an implementation file for a precompiled header. | |||||
| */ | |||||
| #if __cplusplus < 201103L | |||||
| #include <bits/stdtr1c++.h> | |||||
| #else | |||||
| #include <bits/stdc++.h> | |||||
| #endif | |||||
| #include <ext/algorithm> | |||||
| #if __cplusplus >= 201103L | |||||
| # include <ext/aligned_buffer.h> | |||||
| #endif | |||||
| #include <ext/alloc_traits.h> | |||||
| #include <ext/atomicity.h> | |||||
| #include <ext/bitmap_allocator.h> | |||||
| #include <ext/cast.h> | |||||
| #if __cplusplus >= 201103L | |||||
| # include <ext/cmath> | |||||
| #endif | |||||
| #include <ext/concurrence.h> | |||||
| #include <ext/debug_allocator.h> | |||||
| #include <ext/extptr_allocator.h> | |||||
| #include <ext/functional> | |||||
| #include <ext/iterator> | |||||
| #include <ext/malloc_allocator.h> | |||||
| #include <ext/memory> | |||||
| #include <ext/mt_allocator.h> | |||||
| #include <ext/new_allocator.h> | |||||
| #include <ext/numeric> | |||||
| #include <ext/numeric_traits.h> | |||||
| #include <ext/pod_char_traits.h> | |||||
| #include <ext/pointer.h> | |||||
| #include <ext/pool_allocator.h> | |||||
| #if __cplusplus >= 201103L | |||||
| # include <ext/random> | |||||
| #endif | |||||
| #include <ext/rb_tree> | |||||
| #include <ext/rope> | |||||
| #include <ext/slist> | |||||
| #include <ext/stdio_filebuf.h> | |||||
| #include <ext/stdio_sync_filebuf.h> | |||||
| #include <ext/throw_allocator.h> | |||||
| #include <ext/typelist.h> | |||||
| #include <ext/type_traits.h> | |||||
| #include <ext/vstring.h> | |||||
| #include <ext/pb_ds/assoc_container.hpp> | |||||
| #include <ext/pb_ds/priority_queue.hpp> | |||||
| #include <ext/pb_ds/exception.hpp> | |||||
| #include <ext/pb_ds/hash_policy.hpp> | |||||
| #include <ext/pb_ds/list_update_policy.hpp> | |||||
| #include <ext/pb_ds/tree_policy.hpp> | |||||
| #include <ext/pb_ds/trie_policy.hpp> | |||||
| #ifdef _GLIBCXX_HAVE_ICONV | |||||
| #include <ext/codecvt_specializations.h> | |||||
| #include <ext/enc_filebuf.h> | |||||
| #endif | 
| /* Threads compatibility routines for libgcc2 and libobjc. */ | |||||
| /* Compile this one with gcc. */ | |||||
| /* Copyright (C) 1997-2020 Free Software Foundation, Inc. | |||||
| This file is part of GCC. | |||||
| GCC is free software; you can redistribute it and/or modify it under | |||||
| the terms of the GNU General Public License as published by the Free | |||||
| Software Foundation; either version 3, or (at your option) any later | |||||
| version. | |||||
| GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |||||
| WARRANTY; without even the implied warranty of MERCHANTABILITY or | |||||
| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |||||
| for more details. | |||||
| Under Section 7 of GPL version 3, you are granted additional | |||||
| permissions described in the GCC Runtime Library Exception, version | |||||
| 3.1, as published by the Free Software Foundation. | |||||
| You should have received a copy of the GNU General Public License and | |||||
| a copy of the GCC Runtime Library Exception along with this program; | |||||
| see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| <http://www.gnu.org/licenses/>. */ | |||||
| #ifndef _GLIBCXX_GCC_GTHR_SINGLE_H | |||||
| #define _GLIBCXX_GCC_GTHR_SINGLE_H | |||||
| /* Just provide compatibility for mutex handling. */ | |||||
| typedef int __gthread_key_t; | |||||
| typedef int __gthread_once_t; | |||||
| typedef int __gthread_mutex_t; | |||||
| typedef int __gthread_recursive_mutex_t; | |||||
| #define __GTHREAD_ONCE_INIT 0 | |||||
| #define __GTHREAD_MUTEX_INIT 0 | |||||
| #define __GTHREAD_MUTEX_INIT_FUNCTION(mx) do {} while (0) | |||||
| #define __GTHREAD_RECURSIVE_MUTEX_INIT 0 | |||||
| #define _GLIBCXX_UNUSED __attribute__((__unused__)) | |||||
| #ifdef _LIBOBJC | |||||
| /* Thread local storage for a single thread */ | |||||
| static void *thread_local_storage = NULL; | |||||
| /* Backend initialization functions */ | |||||
| /* Initialize the threads subsystem. */ | |||||
| static inline int | |||||
| __gthread_objc_init_thread_system (void) | |||||
| { | |||||
| /* No thread support available */ | |||||
| return -1; | |||||
| } | |||||
| /* Close the threads subsystem. */ | |||||
| static inline int | |||||
| __gthread_objc_close_thread_system (void) | |||||
| { | |||||
| /* No thread support available */ | |||||
| return -1; | |||||
| } | |||||
| /* Backend thread functions */ | |||||
| /* Create a new thread of execution. */ | |||||
| static inline objc_thread_t | |||||
| __gthread_objc_thread_detach (void (* func)(void *), void * arg _GLIBCXX_UNUSED) | |||||
| { | |||||
| /* No thread support available */ | |||||
| return NULL; | |||||
| } | |||||
| /* Set the current thread's priority. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_set_priority (int priority _GLIBCXX_UNUSED) | |||||
| { | |||||
| /* No thread support available */ | |||||
| return -1; | |||||
| } | |||||
| /* Return the current thread's priority. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_get_priority (void) | |||||
| { | |||||
| return OBJC_THREAD_INTERACTIVE_PRIORITY; | |||||
| } | |||||
| /* Yield our process time to another thread. */ | |||||
| static inline void | |||||
| __gthread_objc_thread_yield (void) | |||||
| { | |||||
| return; | |||||
| } | |||||
| /* Terminate the current thread. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_exit (void) | |||||
| { | |||||
| /* No thread support available */ | |||||
| /* Should we really exit the program */ | |||||
| /* exit (&__objc_thread_exit_status); */ | |||||
| return -1; | |||||
| } | |||||
| /* Returns an integer value which uniquely describes a thread. */ | |||||
| static inline objc_thread_t | |||||
| __gthread_objc_thread_id (void) | |||||
| { | |||||
| /* No thread support, use 1. */ | |||||
| return (objc_thread_t) 1; | |||||
| } | |||||
| /* Sets the thread's local storage pointer. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_set_data (void *value) | |||||
| { | |||||
| thread_local_storage = value; | |||||
| return 0; | |||||
| } | |||||
| /* Returns the thread's local storage pointer. */ | |||||
| static inline void * | |||||
| __gthread_objc_thread_get_data (void) | |||||
| { | |||||
| return thread_local_storage; | |||||
| } | |||||
| /* Backend mutex functions */ | |||||
| /* Allocate a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_allocate (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Deallocate a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_deallocate (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Grab a lock on a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_lock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| /* There can only be one thread, so we always get the lock */ | |||||
| return 0; | |||||
| } | |||||
| /* Try to grab a lock on a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_trylock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| /* There can only be one thread, so we always get the lock */ | |||||
| return 0; | |||||
| } | |||||
| /* Unlock the mutex */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_unlock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Backend condition mutex functions */ | |||||
| /* Allocate a condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_allocate (objc_condition_t condition _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Deallocate a condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_deallocate (objc_condition_t condition _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Wait on the condition */ | |||||
| static inline int | |||||
| __gthread_objc_condition_wait (objc_condition_t condition _GLIBCXX_UNUSED, | |||||
| objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Wake up all threads waiting on this condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_broadcast (objc_condition_t condition _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Wake up one thread waiting on this condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_signal (objc_condition_t condition _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| #else /* _LIBOBJC */ | |||||
| static inline int | |||||
| __gthread_active_p (void) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_once (__gthread_once_t *__once _GLIBCXX_UNUSED, void (*__func) (void) _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int _GLIBCXX_UNUSED | |||||
| __gthread_key_create (__gthread_key_t *__key _GLIBCXX_UNUSED, void (*__func) (void *) _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static int _GLIBCXX_UNUSED | |||||
| __gthread_key_delete (__gthread_key_t __key _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline void * | |||||
| __gthread_getspecific (__gthread_key_t __key _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_setspecific (__gthread_key_t __key _GLIBCXX_UNUSED, const void *__v _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_destroy (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_lock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_trylock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_unlock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_lock (__mutex); | |||||
| } | |||||
| static inline int | |||||
| __gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_trylock (__mutex); | |||||
| } | |||||
| static inline int | |||||
| __gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_unlock (__mutex); | |||||
| } | |||||
| static inline int | |||||
| __gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_destroy (__mutex); | |||||
| } | |||||
| #endif /* _LIBOBJC */ | |||||
| #undef _GLIBCXX_UNUSED | |||||
| #endif /* ! _GLIBCXX_GCC_GTHR_SINGLE_H */ | 
| /* Threads compatibility routines for libgcc2 and libobjc. */ | |||||
| /* Compile this one with gcc. */ | |||||
| /* Copyright (C) 1997-2020 Free Software Foundation, Inc. | |||||
| This file is part of GCC. | |||||
| GCC is free software; you can redistribute it and/or modify it under | |||||
| the terms of the GNU General Public License as published by the Free | |||||
| Software Foundation; either version 3, or (at your option) any later | |||||
| version. | |||||
| GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |||||
| WARRANTY; without even the implied warranty of MERCHANTABILITY or | |||||
| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |||||
| for more details. | |||||
| Under Section 7 of GPL version 3, you are granted additional | |||||
| permissions described in the GCC Runtime Library Exception, version | |||||
| 3.1, as published by the Free Software Foundation. | |||||
| You should have received a copy of the GNU General Public License and | |||||
| a copy of the GCC Runtime Library Exception along with this program; | |||||
| see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| <http://www.gnu.org/licenses/>. */ | |||||
| #ifndef _GLIBCXX_GCC_GTHR_POSIX_H | |||||
| #define _GLIBCXX_GCC_GTHR_POSIX_H | |||||
| /* POSIX threads specific definitions. | |||||
| Easy, since the interface is just one-to-one mapping. */ | |||||
| #define __GTHREADS 1 | |||||
| #define __GTHREADS_CXX0X 1 | |||||
| #include <pthread.h> | |||||
| #if ((defined(_LIBOBJC) || defined(_LIBOBJC_WEAK)) \ | |||||
| || !defined(_GTHREAD_USE_MUTEX_TIMEDLOCK)) | |||||
| # include <unistd.h> | |||||
| # if defined(_POSIX_TIMEOUTS) && _POSIX_TIMEOUTS >= 0 | |||||
| # define _GTHREAD_USE_MUTEX_TIMEDLOCK 1 | |||||
| # else | |||||
| # define _GTHREAD_USE_MUTEX_TIMEDLOCK 0 | |||||
| # endif | |||||
| #endif | |||||
| typedef pthread_t __gthread_t; | |||||
| typedef pthread_key_t __gthread_key_t; | |||||
| typedef pthread_once_t __gthread_once_t; | |||||
| typedef pthread_mutex_t __gthread_mutex_t; | |||||
| typedef pthread_mutex_t __gthread_recursive_mutex_t; | |||||
| typedef pthread_cond_t __gthread_cond_t; | |||||
| typedef struct timespec __gthread_time_t; | |||||
| /* POSIX like conditional variables are supported. Please look at comments | |||||
| in gthr.h for details. */ | |||||
| #define __GTHREAD_HAS_COND 1 | |||||
| #define __GTHREAD_MUTEX_INIT PTHREAD_MUTEX_INITIALIZER | |||||
| #define __GTHREAD_MUTEX_INIT_FUNCTION __gthread_mutex_init_function | |||||
| #define __GTHREAD_ONCE_INIT PTHREAD_ONCE_INIT | |||||
| #if defined(PTHREAD_RECURSIVE_MUTEX_INITIALIZER) | |||||
| #define __GTHREAD_RECURSIVE_MUTEX_INIT PTHREAD_RECURSIVE_MUTEX_INITIALIZER | |||||
| #elif defined(PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP) | |||||
| #define __GTHREAD_RECURSIVE_MUTEX_INIT PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP | |||||
| #else | |||||
| #define __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION __gthread_recursive_mutex_init_function | |||||
| #endif | |||||
| #define __GTHREAD_COND_INIT PTHREAD_COND_INITIALIZER | |||||
| #define __GTHREAD_TIME_INIT {0,0} | |||||
| #ifdef _GTHREAD_USE_MUTEX_INIT_FUNC | |||||
| # undef __GTHREAD_MUTEX_INIT | |||||
| #endif | |||||
| #ifdef _GTHREAD_USE_RECURSIVE_MUTEX_INIT_FUNC | |||||
| # undef __GTHREAD_RECURSIVE_MUTEX_INIT | |||||
| # undef __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION | |||||
| # define __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION __gthread_recursive_mutex_init_function | |||||
| #endif | |||||
| #ifdef _GTHREAD_USE_COND_INIT_FUNC | |||||
| # undef __GTHREAD_COND_INIT | |||||
| # define __GTHREAD_COND_INIT_FUNCTION __gthread_cond_init_function | |||||
| #endif | |||||
| #if __GXX_WEAK__ && _GLIBCXX_GTHREAD_USE_WEAK | |||||
| # ifndef __gthrw_pragma | |||||
| # define __gthrw_pragma(pragma) | |||||
| # endif | |||||
| # define __gthrw2(name,name2,type) \ | |||||
| static __typeof(type) name \ | |||||
| __attribute__ ((__weakref__(#name2), __copy__ (type))); \ | |||||
| __gthrw_pragma(weak type) | |||||
| # define __gthrw_(name) __gthrw_ ## name | |||||
| #else | |||||
| # define __gthrw2(name,name2,type) | |||||
| # define __gthrw_(name) name | |||||
| #endif | |||||
| /* Typically, __gthrw_foo is a weak reference to symbol foo. */ | |||||
| #define __gthrw(name) __gthrw2(__gthrw_ ## name,name,name) | |||||
| __gthrw(pthread_once) | |||||
| __gthrw(pthread_getspecific) | |||||
| __gthrw(pthread_setspecific) | |||||
| __gthrw(pthread_create) | |||||
| __gthrw(pthread_join) | |||||
| __gthrw(pthread_equal) | |||||
| __gthrw(pthread_self) | |||||
| __gthrw(pthread_detach) | |||||
| #ifndef __BIONIC__ | |||||
| __gthrw(pthread_cancel) | |||||
| #endif | |||||
| __gthrw(sched_yield) | |||||
| __gthrw(pthread_mutex_lock) | |||||
| __gthrw(pthread_mutex_trylock) | |||||
| #if _GTHREAD_USE_MUTEX_TIMEDLOCK | |||||
| __gthrw(pthread_mutex_timedlock) | |||||
| #endif | |||||
| __gthrw(pthread_mutex_unlock) | |||||
| __gthrw(pthread_mutex_init) | |||||
| __gthrw(pthread_mutex_destroy) | |||||
| __gthrw(pthread_cond_init) | |||||
| __gthrw(pthread_cond_broadcast) | |||||
| __gthrw(pthread_cond_signal) | |||||
| __gthrw(pthread_cond_wait) | |||||
| __gthrw(pthread_cond_timedwait) | |||||
| __gthrw(pthread_cond_destroy) | |||||
| __gthrw(pthread_key_create) | |||||
| __gthrw(pthread_key_delete) | |||||
| __gthrw(pthread_mutexattr_init) | |||||
| __gthrw(pthread_mutexattr_settype) | |||||
| __gthrw(pthread_mutexattr_destroy) | |||||
| #if defined(_LIBOBJC) || defined(_LIBOBJC_WEAK) | |||||
| /* Objective-C. */ | |||||
| __gthrw(pthread_exit) | |||||
| #ifdef _POSIX_PRIORITY_SCHEDULING | |||||
| #ifdef _POSIX_THREAD_PRIORITY_SCHEDULING | |||||
| __gthrw(sched_get_priority_max) | |||||
| __gthrw(sched_get_priority_min) | |||||
| #endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ | |||||
| #endif /* _POSIX_PRIORITY_SCHEDULING */ | |||||
| __gthrw(pthread_attr_destroy) | |||||
| __gthrw(pthread_attr_init) | |||||
| __gthrw(pthread_attr_setdetachstate) | |||||
| #ifdef _POSIX_THREAD_PRIORITY_SCHEDULING | |||||
| __gthrw(pthread_getschedparam) | |||||
| __gthrw(pthread_setschedparam) | |||||
| #endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ | |||||
| #endif /* _LIBOBJC || _LIBOBJC_WEAK */ | |||||
| #if __GXX_WEAK__ && _GLIBCXX_GTHREAD_USE_WEAK | |||||
| /* On Solaris 2.6 up to 9, the libc exposes a POSIX threads interface even if | |||||
| -pthreads is not specified. The functions are dummies and most return an | |||||
| error value. However pthread_once returns 0 without invoking the routine | |||||
| it is passed so we cannot pretend that the interface is active if -pthreads | |||||
| is not specified. On Solaris 2.5.1, the interface is not exposed at all so | |||||
| we need to play the usual game with weak symbols. On Solaris 10 and up, a | |||||
| working interface is always exposed. On FreeBSD 6 and later, libc also | |||||
| exposes a dummy POSIX threads interface, similar to what Solaris 2.6 up | |||||
| to 9 does. FreeBSD >= 700014 even provides a pthread_cancel stub in libc, | |||||
| which means the alternate __gthread_active_p below cannot be used there. */ | |||||
| #if defined(__FreeBSD__) || (defined(__sun) && defined(__svr4__)) | |||||
| static volatile int __gthread_active = -1; | |||||
| static void | |||||
| __gthread_trigger (void) | |||||
| { | |||||
| __gthread_active = 1; | |||||
| } | |||||
| static inline int | |||||
| __gthread_active_p (void) | |||||
| { | |||||
| static pthread_mutex_t __gthread_active_mutex = PTHREAD_MUTEX_INITIALIZER; | |||||
| static pthread_once_t __gthread_active_once = PTHREAD_ONCE_INIT; | |||||
| /* Avoid reading __gthread_active twice on the main code path. */ | |||||
| int __gthread_active_latest_value = __gthread_active; | |||||
| /* This test is not protected to avoid taking a lock on the main code | |||||
| path so every update of __gthread_active in a threaded program must | |||||
| be atomic with regard to the result of the test. */ | |||||
| if (__builtin_expect (__gthread_active_latest_value < 0, 0)) | |||||
| { | |||||
| if (__gthrw_(pthread_once)) | |||||
| { | |||||
| /* If this really is a threaded program, then we must ensure that | |||||
| __gthread_active has been set to 1 before exiting this block. */ | |||||
| __gthrw_(pthread_mutex_lock) (&__gthread_active_mutex); | |||||
| __gthrw_(pthread_once) (&__gthread_active_once, __gthread_trigger); | |||||
| __gthrw_(pthread_mutex_unlock) (&__gthread_active_mutex); | |||||
| } | |||||
| /* Make sure we'll never enter this block again. */ | |||||
| if (__gthread_active < 0) | |||||
| __gthread_active = 0; | |||||
| __gthread_active_latest_value = __gthread_active; | |||||
| } | |||||
| return __gthread_active_latest_value != 0; | |||||
| } | |||||
| #else /* neither FreeBSD nor Solaris */ | |||||
| /* For a program to be multi-threaded the only thing that it certainly must | |||||
| be using is pthread_create. However, there may be other libraries that | |||||
| intercept pthread_create with their own definitions to wrap pthreads | |||||
| functionality for some purpose. In those cases, pthread_create being | |||||
| defined might not necessarily mean that libpthread is actually linked | |||||
| in. | |||||
| For the GNU C library, we can use a known internal name. This is always | |||||
| available in the ABI, but no other library would define it. That is | |||||
| ideal, since any public pthread function might be intercepted just as | |||||
| pthread_create might be. __pthread_key_create is an "internal" | |||||
| implementation symbol, but it is part of the public exported ABI. Also, | |||||
| it's among the symbols that the static libpthread.a always links in | |||||
| whenever pthread_create is used, so there is no danger of a false | |||||
| negative result in any statically-linked, multi-threaded program. | |||||
| For others, we choose pthread_cancel as a function that seems unlikely | |||||
| to be redefined by an interceptor library. The bionic (Android) C | |||||
| library does not provide pthread_cancel, so we do use pthread_create | |||||
| there (and interceptor libraries lose). */ | |||||
| #ifdef __GLIBC__ | |||||
| __gthrw2(__gthrw_(__pthread_key_create), | |||||
| __pthread_key_create, | |||||
| pthread_key_create) | |||||
| # define GTHR_ACTIVE_PROXY __gthrw_(__pthread_key_create) | |||||
| #elif defined (__BIONIC__) | |||||
| # define GTHR_ACTIVE_PROXY __gthrw_(pthread_create) | |||||
| #else | |||||
| # define GTHR_ACTIVE_PROXY __gthrw_(pthread_cancel) | |||||
| #endif | |||||
| static inline int | |||||
| __gthread_active_p (void) | |||||
| { | |||||
| static void *const __gthread_active_ptr | |||||
| = __extension__ (void *) >HR_ACTIVE_PROXY; | |||||
| return __gthread_active_ptr != 0; | |||||
| } | |||||
| #endif /* FreeBSD or Solaris */ | |||||
| #else /* not __GXX_WEAK__ */ | |||||
| /* Similar to Solaris, HP-UX 11 for PA-RISC provides stubs for pthread | |||||
| calls in shared flavors of the HP-UX C library. Most of the stubs | |||||
| have no functionality. The details are described in the "libc cumulative | |||||
| patch" for each subversion of HP-UX 11. There are two special interfaces | |||||
| provided for checking whether an application is linked to a shared pthread | |||||
| library or not. However, these interfaces aren't available in early | |||||
| libpthread libraries. We also need a test that works for archive | |||||
| libraries. We can't use pthread_once as some libc versions call the | |||||
| init function. We also can't use pthread_create or pthread_attr_init | |||||
| as these create a thread and thereby prevent changing the default stack | |||||
| size. The function pthread_default_stacksize_np is available in both | |||||
| the archive and shared versions of libpthread. It can be used to | |||||
| determine the default pthread stack size. There is a stub in some | |||||
| shared libc versions which returns a zero size if pthreads are not | |||||
| active. We provide an equivalent stub to handle cases where libc | |||||
| doesn't provide one. */ | |||||
| #if defined(__hppa__) && defined(__hpux__) | |||||
| static volatile int __gthread_active = -1; | |||||
| static inline int | |||||
| __gthread_active_p (void) | |||||
| { | |||||
| /* Avoid reading __gthread_active twice on the main code path. */ | |||||
| int __gthread_active_latest_value = __gthread_active; | |||||
| size_t __s; | |||||
| if (__builtin_expect (__gthread_active_latest_value < 0, 0)) | |||||
| { | |||||
| pthread_default_stacksize_np (0, &__s); | |||||
| __gthread_active = __s ? 1 : 0; | |||||
| __gthread_active_latest_value = __gthread_active; | |||||
| } | |||||
| return __gthread_active_latest_value != 0; | |||||
| } | |||||
| #else /* not hppa-hpux */ | |||||
| static inline int | |||||
| __gthread_active_p (void) | |||||
| { | |||||
| return 1; | |||||
| } | |||||
| #endif /* hppa-hpux */ | |||||
| #endif /* __GXX_WEAK__ */ | |||||
| #ifdef _LIBOBJC | |||||
| /* This is the config.h file in libobjc/ */ | |||||
| #include <config.h> | |||||
| #ifdef HAVE_SCHED_H | |||||
| # include <sched.h> | |||||
| #endif | |||||
| /* Key structure for maintaining thread specific storage */ | |||||
| static pthread_key_t _objc_thread_storage; | |||||
| static pthread_attr_t _objc_thread_attribs; | |||||
| /* Thread local storage for a single thread */ | |||||
| static void *thread_local_storage = NULL; | |||||
| /* Backend initialization functions */ | |||||
| /* Initialize the threads subsystem. */ | |||||
| static inline int | |||||
| __gthread_objc_init_thread_system (void) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| { | |||||
| /* Initialize the thread storage key. */ | |||||
| if (__gthrw_(pthread_key_create) (&_objc_thread_storage, NULL) == 0) | |||||
| { | |||||
| /* The normal default detach state for threads is | |||||
| * PTHREAD_CREATE_JOINABLE which causes threads to not die | |||||
| * when you think they should. */ | |||||
| if (__gthrw_(pthread_attr_init) (&_objc_thread_attribs) == 0 | |||||
| && __gthrw_(pthread_attr_setdetachstate) (&_objc_thread_attribs, | |||||
| PTHREAD_CREATE_DETACHED) == 0) | |||||
| return 0; | |||||
| } | |||||
| } | |||||
| return -1; | |||||
| } | |||||
| /* Close the threads subsystem. */ | |||||
| static inline int | |||||
| __gthread_objc_close_thread_system (void) | |||||
| { | |||||
| if (__gthread_active_p () | |||||
| && __gthrw_(pthread_key_delete) (_objc_thread_storage) == 0 | |||||
| && __gthrw_(pthread_attr_destroy) (&_objc_thread_attribs) == 0) | |||||
| return 0; | |||||
| return -1; | |||||
| } | |||||
| /* Backend thread functions */ | |||||
| /* Create a new thread of execution. */ | |||||
| static inline objc_thread_t | |||||
| __gthread_objc_thread_detach (void (*func)(void *), void *arg) | |||||
| { | |||||
| objc_thread_t thread_id; | |||||
| pthread_t new_thread_handle; | |||||
| if (!__gthread_active_p ()) | |||||
| return NULL; | |||||
| if (!(__gthrw_(pthread_create) (&new_thread_handle, &_objc_thread_attribs, | |||||
| (void *) func, arg))) | |||||
| thread_id = (objc_thread_t) new_thread_handle; | |||||
| else | |||||
| thread_id = NULL; | |||||
| return thread_id; | |||||
| } | |||||
| /* Set the current thread's priority. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_set_priority (int priority) | |||||
| { | |||||
| if (!__gthread_active_p ()) | |||||
| return -1; | |||||
| else | |||||
| { | |||||
| #ifdef _POSIX_PRIORITY_SCHEDULING | |||||
| #ifdef _POSIX_THREAD_PRIORITY_SCHEDULING | |||||
| pthread_t thread_id = __gthrw_(pthread_self) (); | |||||
| int policy; | |||||
| struct sched_param params; | |||||
| int priority_min, priority_max; | |||||
| if (__gthrw_(pthread_getschedparam) (thread_id, &policy, ¶ms) == 0) | |||||
| { | |||||
| if ((priority_max = __gthrw_(sched_get_priority_max) (policy)) == -1) | |||||
| return -1; | |||||
| if ((priority_min = __gthrw_(sched_get_priority_min) (policy)) == -1) | |||||
| return -1; | |||||
| if (priority > priority_max) | |||||
| priority = priority_max; | |||||
| else if (priority < priority_min) | |||||
| priority = priority_min; | |||||
| params.sched_priority = priority; | |||||
| /* | |||||
| * The solaris 7 and several other man pages incorrectly state that | |||||
| * this should be a pointer to policy but pthread.h is universally | |||||
| * at odds with this. | |||||
| */ | |||||
| if (__gthrw_(pthread_setschedparam) (thread_id, policy, ¶ms) == 0) | |||||
| return 0; | |||||
| } | |||||
| #endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ | |||||
| #endif /* _POSIX_PRIORITY_SCHEDULING */ | |||||
| return -1; | |||||
| } | |||||
| } | |||||
| /* Return the current thread's priority. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_get_priority (void) | |||||
| { | |||||
| #ifdef _POSIX_PRIORITY_SCHEDULING | |||||
| #ifdef _POSIX_THREAD_PRIORITY_SCHEDULING | |||||
| if (__gthread_active_p ()) | |||||
| { | |||||
| int policy; | |||||
| struct sched_param params; | |||||
| if (__gthrw_(pthread_getschedparam) (__gthrw_(pthread_self) (), &policy, ¶ms) == 0) | |||||
| return params.sched_priority; | |||||
| else | |||||
| return -1; | |||||
| } | |||||
| else | |||||
| #endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ | |||||
| #endif /* _POSIX_PRIORITY_SCHEDULING */ | |||||
| return OBJC_THREAD_INTERACTIVE_PRIORITY; | |||||
| } | |||||
| /* Yield our process time to another thread. */ | |||||
| static inline void | |||||
| __gthread_objc_thread_yield (void) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| __gthrw_(sched_yield) (); | |||||
| } | |||||
| /* Terminate the current thread. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_exit (void) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| /* exit the thread */ | |||||
| __gthrw_(pthread_exit) (&__objc_thread_exit_status); | |||||
| /* Failed if we reached here */ | |||||
| return -1; | |||||
| } | |||||
| /* Returns an integer value which uniquely describes a thread. */ | |||||
| static inline objc_thread_t | |||||
| __gthread_objc_thread_id (void) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return (objc_thread_t) __gthrw_(pthread_self) (); | |||||
| else | |||||
| return (objc_thread_t) 1; | |||||
| } | |||||
| /* Sets the thread's local storage pointer. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_set_data (void *value) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_setspecific) (_objc_thread_storage, value); | |||||
| else | |||||
| { | |||||
| thread_local_storage = value; | |||||
| return 0; | |||||
| } | |||||
| } | |||||
| /* Returns the thread's local storage pointer. */ | |||||
| static inline void * | |||||
| __gthread_objc_thread_get_data (void) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_getspecific) (_objc_thread_storage); | |||||
| else | |||||
| return thread_local_storage; | |||||
| } | |||||
| /* Backend mutex functions */ | |||||
| /* Allocate a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_allocate (objc_mutex_t mutex) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| { | |||||
| mutex->backend = objc_malloc (sizeof (pthread_mutex_t)); | |||||
| if (__gthrw_(pthread_mutex_init) ((pthread_mutex_t *) mutex->backend, NULL)) | |||||
| { | |||||
| objc_free (mutex->backend); | |||||
| mutex->backend = NULL; | |||||
| return -1; | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| /* Deallocate a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_deallocate (objc_mutex_t mutex) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| { | |||||
| int count; | |||||
| /* | |||||
| * Posix Threads specifically require that the thread be unlocked | |||||
| * for __gthrw_(pthread_mutex_destroy) to work. | |||||
| */ | |||||
| do | |||||
| { | |||||
| count = __gthrw_(pthread_mutex_unlock) ((pthread_mutex_t *) mutex->backend); | |||||
| if (count < 0) | |||||
| return -1; | |||||
| } | |||||
| while (count); | |||||
| if (__gthrw_(pthread_mutex_destroy) ((pthread_mutex_t *) mutex->backend)) | |||||
| return -1; | |||||
| objc_free (mutex->backend); | |||||
| mutex->backend = NULL; | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| /* Grab a lock on a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_lock (objc_mutex_t mutex) | |||||
| { | |||||
| if (__gthread_active_p () | |||||
| && __gthrw_(pthread_mutex_lock) ((pthread_mutex_t *) mutex->backend) != 0) | |||||
| { | |||||
| return -1; | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| /* Try to grab a lock on a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_trylock (objc_mutex_t mutex) | |||||
| { | |||||
| if (__gthread_active_p () | |||||
| && __gthrw_(pthread_mutex_trylock) ((pthread_mutex_t *) mutex->backend) != 0) | |||||
| { | |||||
| return -1; | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| /* Unlock the mutex */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_unlock (objc_mutex_t mutex) | |||||
| { | |||||
| if (__gthread_active_p () | |||||
| && __gthrw_(pthread_mutex_unlock) ((pthread_mutex_t *) mutex->backend) != 0) | |||||
| { | |||||
| return -1; | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| /* Backend condition mutex functions */ | |||||
| /* Allocate a condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_allocate (objc_condition_t condition) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| { | |||||
| condition->backend = objc_malloc (sizeof (pthread_cond_t)); | |||||
| if (__gthrw_(pthread_cond_init) ((pthread_cond_t *) condition->backend, NULL)) | |||||
| { | |||||
| objc_free (condition->backend); | |||||
| condition->backend = NULL; | |||||
| return -1; | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| /* Deallocate a condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_deallocate (objc_condition_t condition) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| { | |||||
| if (__gthrw_(pthread_cond_destroy) ((pthread_cond_t *) condition->backend)) | |||||
| return -1; | |||||
| objc_free (condition->backend); | |||||
| condition->backend = NULL; | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| /* Wait on the condition */ | |||||
| static inline int | |||||
| __gthread_objc_condition_wait (objc_condition_t condition, objc_mutex_t mutex) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_cond_wait) ((pthread_cond_t *) condition->backend, | |||||
| (pthread_mutex_t *) mutex->backend); | |||||
| else | |||||
| return 0; | |||||
| } | |||||
| /* Wake up all threads waiting on this condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_broadcast (objc_condition_t condition) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_cond_broadcast) ((pthread_cond_t *) condition->backend); | |||||
| else | |||||
| return 0; | |||||
| } | |||||
| /* Wake up one thread waiting on this condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_signal (objc_condition_t condition) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_cond_signal) ((pthread_cond_t *) condition->backend); | |||||
| else | |||||
| return 0; | |||||
| } | |||||
| #else /* _LIBOBJC */ | |||||
| static inline int | |||||
| __gthread_create (__gthread_t *__threadid, void *(*__func) (void*), | |||||
| void *__args) | |||||
| { | |||||
| return __gthrw_(pthread_create) (__threadid, NULL, __func, __args); | |||||
| } | |||||
| static inline int | |||||
| __gthread_join (__gthread_t __threadid, void **__value_ptr) | |||||
| { | |||||
| return __gthrw_(pthread_join) (__threadid, __value_ptr); | |||||
| } | |||||
| static inline int | |||||
| __gthread_detach (__gthread_t __threadid) | |||||
| { | |||||
| return __gthrw_(pthread_detach) (__threadid); | |||||
| } | |||||
| static inline int | |||||
| __gthread_equal (__gthread_t __t1, __gthread_t __t2) | |||||
| { | |||||
| return __gthrw_(pthread_equal) (__t1, __t2); | |||||
| } | |||||
| static inline __gthread_t | |||||
| __gthread_self (void) | |||||
| { | |||||
| return __gthrw_(pthread_self) (); | |||||
| } | |||||
| static inline int | |||||
| __gthread_yield (void) | |||||
| { | |||||
| return __gthrw_(sched_yield) (); | |||||
| } | |||||
| static inline int | |||||
| __gthread_once (__gthread_once_t *__once, void (*__func) (void)) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_once) (__once, __func); | |||||
| else | |||||
| return -1; | |||||
| } | |||||
| static inline int | |||||
| __gthread_key_create (__gthread_key_t *__key, void (*__dtor) (void *)) | |||||
| { | |||||
| return __gthrw_(pthread_key_create) (__key, __dtor); | |||||
| } | |||||
| static inline int | |||||
| __gthread_key_delete (__gthread_key_t __key) | |||||
| { | |||||
| return __gthrw_(pthread_key_delete) (__key); | |||||
| } | |||||
| static inline void * | |||||
| __gthread_getspecific (__gthread_key_t __key) | |||||
| { | |||||
| return __gthrw_(pthread_getspecific) (__key); | |||||
| } | |||||
| static inline int | |||||
| __gthread_setspecific (__gthread_key_t __key, const void *__ptr) | |||||
| { | |||||
| return __gthrw_(pthread_setspecific) (__key, __ptr); | |||||
| } | |||||
| static inline void | |||||
| __gthread_mutex_init_function (__gthread_mutex_t *__mutex) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| __gthrw_(pthread_mutex_init) (__mutex, NULL); | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_destroy (__gthread_mutex_t *__mutex) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_mutex_destroy) (__mutex); | |||||
| else | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_lock (__gthread_mutex_t *__mutex) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_mutex_lock) (__mutex); | |||||
| else | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_trylock (__gthread_mutex_t *__mutex) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_mutex_trylock) (__mutex); | |||||
| else | |||||
| return 0; | |||||
| } | |||||
| #if _GTHREAD_USE_MUTEX_TIMEDLOCK | |||||
| static inline int | |||||
| __gthread_mutex_timedlock (__gthread_mutex_t *__mutex, | |||||
| const __gthread_time_t *__abs_timeout) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_mutex_timedlock) (__mutex, __abs_timeout); | |||||
| else | |||||
| return 0; | |||||
| } | |||||
| #endif | |||||
| static inline int | |||||
| __gthread_mutex_unlock (__gthread_mutex_t *__mutex) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| return __gthrw_(pthread_mutex_unlock) (__mutex); | |||||
| else | |||||
| return 0; | |||||
| } | |||||
| #if !defined( PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP) \ | |||||
| || defined(_GTHREAD_USE_RECURSIVE_MUTEX_INIT_FUNC) | |||||
| static inline int | |||||
| __gthread_recursive_mutex_init_function (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| { | |||||
| pthread_mutexattr_t __attr; | |||||
| int __r; | |||||
| __r = __gthrw_(pthread_mutexattr_init) (&__attr); | |||||
| if (!__r) | |||||
| __r = __gthrw_(pthread_mutexattr_settype) (&__attr, | |||||
| PTHREAD_MUTEX_RECURSIVE); | |||||
| if (!__r) | |||||
| __r = __gthrw_(pthread_mutex_init) (__mutex, &__attr); | |||||
| if (!__r) | |||||
| __r = __gthrw_(pthread_mutexattr_destroy) (&__attr); | |||||
| return __r; | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| #endif | |||||
| static inline int | |||||
| __gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_lock (__mutex); | |||||
| } | |||||
| static inline int | |||||
| __gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_trylock (__mutex); | |||||
| } | |||||
| #if _GTHREAD_USE_MUTEX_TIMEDLOCK | |||||
| static inline int | |||||
| __gthread_recursive_mutex_timedlock (__gthread_recursive_mutex_t *__mutex, | |||||
| const __gthread_time_t *__abs_timeout) | |||||
| { | |||||
| return __gthread_mutex_timedlock (__mutex, __abs_timeout); | |||||
| } | |||||
| #endif | |||||
| static inline int | |||||
| __gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_unlock (__mutex); | |||||
| } | |||||
| static inline int | |||||
| __gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_destroy (__mutex); | |||||
| } | |||||
| #ifdef _GTHREAD_USE_COND_INIT_FUNC | |||||
| static inline void | |||||
| __gthread_cond_init_function (__gthread_cond_t *__cond) | |||||
| { | |||||
| if (__gthread_active_p ()) | |||||
| __gthrw_(pthread_cond_init) (__cond, NULL); | |||||
| } | |||||
| #endif | |||||
| static inline int | |||||
| __gthread_cond_broadcast (__gthread_cond_t *__cond) | |||||
| { | |||||
| return __gthrw_(pthread_cond_broadcast) (__cond); | |||||
| } | |||||
| static inline int | |||||
| __gthread_cond_signal (__gthread_cond_t *__cond) | |||||
| { | |||||
| return __gthrw_(pthread_cond_signal) (__cond); | |||||
| } | |||||
| static inline int | |||||
| __gthread_cond_wait (__gthread_cond_t *__cond, __gthread_mutex_t *__mutex) | |||||
| { | |||||
| return __gthrw_(pthread_cond_wait) (__cond, __mutex); | |||||
| } | |||||
| static inline int | |||||
| __gthread_cond_timedwait (__gthread_cond_t *__cond, __gthread_mutex_t *__mutex, | |||||
| const __gthread_time_t *__abs_timeout) | |||||
| { | |||||
| return __gthrw_(pthread_cond_timedwait) (__cond, __mutex, __abs_timeout); | |||||
| } | |||||
| static inline int | |||||
| __gthread_cond_wait_recursive (__gthread_cond_t *__cond, | |||||
| __gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_cond_wait (__cond, __mutex); | |||||
| } | |||||
| static inline int | |||||
| __gthread_cond_destroy (__gthread_cond_t* __cond) | |||||
| { | |||||
| return __gthrw_(pthread_cond_destroy) (__cond); | |||||
| } | |||||
| #endif /* _LIBOBJC */ | |||||
| #endif /* ! _GLIBCXX_GCC_GTHR_POSIX_H */ | 
| /* Threads compatibility routines for libgcc2 and libobjc. */ | |||||
| /* Compile this one with gcc. */ | |||||
| /* Copyright (C) 1997-2020 Free Software Foundation, Inc. | |||||
| This file is part of GCC. | |||||
| GCC is free software; you can redistribute it and/or modify it under | |||||
| the terms of the GNU General Public License as published by the Free | |||||
| Software Foundation; either version 3, or (at your option) any later | |||||
| version. | |||||
| GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |||||
| WARRANTY; without even the implied warranty of MERCHANTABILITY or | |||||
| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |||||
| for more details. | |||||
| Under Section 7 of GPL version 3, you are granted additional | |||||
| permissions described in the GCC Runtime Library Exception, version | |||||
| 3.1, as published by the Free Software Foundation. | |||||
| You should have received a copy of the GNU General Public License and | |||||
| a copy of the GCC Runtime Library Exception along with this program; | |||||
| see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| <http://www.gnu.org/licenses/>. */ | |||||
| #ifndef _GLIBCXX_GCC_GTHR_SINGLE_H | |||||
| #define _GLIBCXX_GCC_GTHR_SINGLE_H | |||||
| /* Just provide compatibility for mutex handling. */ | |||||
| typedef int __gthread_key_t; | |||||
| typedef int __gthread_once_t; | |||||
| typedef int __gthread_mutex_t; | |||||
| typedef int __gthread_recursive_mutex_t; | |||||
| #define __GTHREAD_ONCE_INIT 0 | |||||
| #define __GTHREAD_MUTEX_INIT 0 | |||||
| #define __GTHREAD_MUTEX_INIT_FUNCTION(mx) do {} while (0) | |||||
| #define __GTHREAD_RECURSIVE_MUTEX_INIT 0 | |||||
| #define _GLIBCXX_UNUSED __attribute__((__unused__)) | |||||
| #ifdef _LIBOBJC | |||||
| /* Thread local storage for a single thread */ | |||||
| static void *thread_local_storage = NULL; | |||||
| /* Backend initialization functions */ | |||||
| /* Initialize the threads subsystem. */ | |||||
| static inline int | |||||
| __gthread_objc_init_thread_system (void) | |||||
| { | |||||
| /* No thread support available */ | |||||
| return -1; | |||||
| } | |||||
| /* Close the threads subsystem. */ | |||||
| static inline int | |||||
| __gthread_objc_close_thread_system (void) | |||||
| { | |||||
| /* No thread support available */ | |||||
| return -1; | |||||
| } | |||||
| /* Backend thread functions */ | |||||
| /* Create a new thread of execution. */ | |||||
| static inline objc_thread_t | |||||
| __gthread_objc_thread_detach (void (* func)(void *), void * arg _GLIBCXX_UNUSED) | |||||
| { | |||||
| /* No thread support available */ | |||||
| return NULL; | |||||
| } | |||||
| /* Set the current thread's priority. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_set_priority (int priority _GLIBCXX_UNUSED) | |||||
| { | |||||
| /* No thread support available */ | |||||
| return -1; | |||||
| } | |||||
| /* Return the current thread's priority. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_get_priority (void) | |||||
| { | |||||
| return OBJC_THREAD_INTERACTIVE_PRIORITY; | |||||
| } | |||||
| /* Yield our process time to another thread. */ | |||||
| static inline void | |||||
| __gthread_objc_thread_yield (void) | |||||
| { | |||||
| return; | |||||
| } | |||||
| /* Terminate the current thread. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_exit (void) | |||||
| { | |||||
| /* No thread support available */ | |||||
| /* Should we really exit the program */ | |||||
| /* exit (&__objc_thread_exit_status); */ | |||||
| return -1; | |||||
| } | |||||
| /* Returns an integer value which uniquely describes a thread. */ | |||||
| static inline objc_thread_t | |||||
| __gthread_objc_thread_id (void) | |||||
| { | |||||
| /* No thread support, use 1. */ | |||||
| return (objc_thread_t) 1; | |||||
| } | |||||
| /* Sets the thread's local storage pointer. */ | |||||
| static inline int | |||||
| __gthread_objc_thread_set_data (void *value) | |||||
| { | |||||
| thread_local_storage = value; | |||||
| return 0; | |||||
| } | |||||
| /* Returns the thread's local storage pointer. */ | |||||
| static inline void * | |||||
| __gthread_objc_thread_get_data (void) | |||||
| { | |||||
| return thread_local_storage; | |||||
| } | |||||
| /* Backend mutex functions */ | |||||
| /* Allocate a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_allocate (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Deallocate a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_deallocate (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Grab a lock on a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_lock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| /* There can only be one thread, so we always get the lock */ | |||||
| return 0; | |||||
| } | |||||
| /* Try to grab a lock on a mutex. */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_trylock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| /* There can only be one thread, so we always get the lock */ | |||||
| return 0; | |||||
| } | |||||
| /* Unlock the mutex */ | |||||
| static inline int | |||||
| __gthread_objc_mutex_unlock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Backend condition mutex functions */ | |||||
| /* Allocate a condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_allocate (objc_condition_t condition _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Deallocate a condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_deallocate (objc_condition_t condition _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Wait on the condition */ | |||||
| static inline int | |||||
| __gthread_objc_condition_wait (objc_condition_t condition _GLIBCXX_UNUSED, | |||||
| objc_mutex_t mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Wake up all threads waiting on this condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_broadcast (objc_condition_t condition _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| /* Wake up one thread waiting on this condition. */ | |||||
| static inline int | |||||
| __gthread_objc_condition_signal (objc_condition_t condition _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| #else /* _LIBOBJC */ | |||||
| static inline int | |||||
| __gthread_active_p (void) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_once (__gthread_once_t *__once _GLIBCXX_UNUSED, void (*__func) (void) _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int _GLIBCXX_UNUSED | |||||
| __gthread_key_create (__gthread_key_t *__key _GLIBCXX_UNUSED, void (*__func) (void *) _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static int _GLIBCXX_UNUSED | |||||
| __gthread_key_delete (__gthread_key_t __key _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline void * | |||||
| __gthread_getspecific (__gthread_key_t __key _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_setspecific (__gthread_key_t __key _GLIBCXX_UNUSED, const void *__v _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_destroy (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_lock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_trylock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_mutex_unlock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| static inline int | |||||
| __gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_lock (__mutex); | |||||
| } | |||||
| static inline int | |||||
| __gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_trylock (__mutex); | |||||
| } | |||||
| static inline int | |||||
| __gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_unlock (__mutex); | |||||
| } | |||||
| static inline int | |||||
| __gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *__mutex) | |||||
| { | |||||
| return __gthread_mutex_destroy (__mutex); | |||||
| } | |||||
| #endif /* _LIBOBJC */ | |||||
| #undef _GLIBCXX_UNUSED | |||||
| #endif /* ! _GLIBCXX_GCC_GTHR_SINGLE_H */ | 
| /* Threads compatibility routines for libgcc2. */ | |||||
| /* Compile this one with gcc. */ | |||||
| /* Copyright (C) 1997-2020 Free Software Foundation, Inc. | |||||
| This file is part of GCC. | |||||
| GCC is free software; you can redistribute it and/or modify it under | |||||
| the terms of the GNU General Public License as published by the Free | |||||
| Software Foundation; either version 3, or (at your option) any later | |||||
| version. | |||||
| GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |||||
| WARRANTY; without even the implied warranty of MERCHANTABILITY or | |||||
| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |||||
| for more details. | |||||
| Under Section 7 of GPL version 3, you are granted additional | |||||
| permissions described in the GCC Runtime Library Exception, version | |||||
| 3.1, as published by the Free Software Foundation. | |||||
| You should have received a copy of the GNU General Public License and | |||||
| a copy of the GCC Runtime Library Exception along with this program; | |||||
| see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| <http://www.gnu.org/licenses/>. */ | |||||
| #ifndef _GLIBCXX_GCC_GTHR_H | |||||
| #define _GLIBCXX_GCC_GTHR_H | |||||
| #ifndef _GLIBCXX_HIDE_EXPORTS | |||||
| #pragma GCC visibility push(default) | |||||
| #endif | |||||
| /* If this file is compiled with threads support, it must | |||||
| #define __GTHREADS 1 | |||||
| to indicate that threads support is present. Also it has define | |||||
| function | |||||
| int __gthread_active_p () | |||||
| that returns 1 if thread system is active, 0 if not. | |||||
| The threads interface must define the following types: | |||||
| __gthread_key_t | |||||
| __gthread_once_t | |||||
| __gthread_mutex_t | |||||
| __gthread_recursive_mutex_t | |||||
| The threads interface must define the following macros: | |||||
| __GTHREAD_ONCE_INIT | |||||
| to initialize __gthread_once_t | |||||
| __GTHREAD_MUTEX_INIT | |||||
| to initialize __gthread_mutex_t to get a fast | |||||
| non-recursive mutex. | |||||
| __GTHREAD_MUTEX_INIT_FUNCTION | |||||
| to initialize __gthread_mutex_t to get a fast | |||||
| non-recursive mutex. | |||||
| Define this to a function which looks like this: | |||||
| void __GTHREAD_MUTEX_INIT_FUNCTION (__gthread_mutex_t *) | |||||
| Some systems can't initialize a mutex without a | |||||
| function call. Don't define __GTHREAD_MUTEX_INIT in this case. | |||||
| __GTHREAD_RECURSIVE_MUTEX_INIT | |||||
| __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION | |||||
| as above, but for a recursive mutex. | |||||
| The threads interface must define the following static functions: | |||||
| int __gthread_once (__gthread_once_t *once, void (*func) ()) | |||||
| int __gthread_key_create (__gthread_key_t *keyp, void (*dtor) (void *)) | |||||
| int __gthread_key_delete (__gthread_key_t key) | |||||
| void *__gthread_getspecific (__gthread_key_t key) | |||||
| int __gthread_setspecific (__gthread_key_t key, const void *ptr) | |||||
| int __gthread_mutex_destroy (__gthread_mutex_t *mutex); | |||||
| int __gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *mutex); | |||||
| int __gthread_mutex_lock (__gthread_mutex_t *mutex); | |||||
| int __gthread_mutex_trylock (__gthread_mutex_t *mutex); | |||||
| int __gthread_mutex_unlock (__gthread_mutex_t *mutex); | |||||
| int __gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *mutex); | |||||
| int __gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *mutex); | |||||
| int __gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *mutex); | |||||
| The following are supported in POSIX threads only. They are required to | |||||
| fix a deadlock in static initialization inside libsupc++. The header file | |||||
| gthr-posix.h defines a symbol __GTHREAD_HAS_COND to signify that these extra | |||||
| features are supported. | |||||
| Types: | |||||
| __gthread_cond_t | |||||
| Macros: | |||||
| __GTHREAD_COND_INIT | |||||
| __GTHREAD_COND_INIT_FUNCTION | |||||
| Interface: | |||||
| int __gthread_cond_broadcast (__gthread_cond_t *cond); | |||||
| int __gthread_cond_wait (__gthread_cond_t *cond, __gthread_mutex_t *mutex); | |||||
| int __gthread_cond_wait_recursive (__gthread_cond_t *cond, | |||||
| __gthread_recursive_mutex_t *mutex); | |||||
| All functions returning int should return zero on success or the error | |||||
| number. If the operation is not supported, -1 is returned. | |||||
| If the following are also defined, you should | |||||
| #define __GTHREADS_CXX0X 1 | |||||
| to enable the c++0x thread library. | |||||
| Types: | |||||
| __gthread_t | |||||
| __gthread_time_t | |||||
| Interface: | |||||
| int __gthread_create (__gthread_t *thread, void *(*func) (void*), | |||||
| void *args); | |||||
| int __gthread_join (__gthread_t thread, void **value_ptr); | |||||
| int __gthread_detach (__gthread_t thread); | |||||
| int __gthread_equal (__gthread_t t1, __gthread_t t2); | |||||
| __gthread_t __gthread_self (void); | |||||
| int __gthread_yield (void); | |||||
| int __gthread_mutex_timedlock (__gthread_mutex_t *m, | |||||
| const __gthread_time_t *abs_timeout); | |||||
| int __gthread_recursive_mutex_timedlock (__gthread_recursive_mutex_t *m, | |||||
| const __gthread_time_t *abs_time); | |||||
| int __gthread_cond_signal (__gthread_cond_t *cond); | |||||
| int __gthread_cond_timedwait (__gthread_cond_t *cond, | |||||
| __gthread_mutex_t *mutex, | |||||
| const __gthread_time_t *abs_timeout); | |||||
| */ | |||||
| #if __GXX_WEAK__ | |||||
| /* The pe-coff weak support isn't fully compatible to ELF's weak. | |||||
| For static libraries it might would work, but as we need to deal | |||||
| with shared versions too, we disable it for mingw-targets. */ | |||||
| #ifdef __MINGW32__ | |||||
| #undef _GLIBCXX_GTHREAD_USE_WEAK | |||||
| #define _GLIBCXX_GTHREAD_USE_WEAK 0 | |||||
| #endif | |||||
| #ifndef _GLIBCXX_GTHREAD_USE_WEAK | |||||
| #define _GLIBCXX_GTHREAD_USE_WEAK 1 | |||||
| #endif | |||||
| #endif | |||||
| #include <bits/gthr-default.h> | |||||
| #ifndef _GLIBCXX_HIDE_EXPORTS | |||||
| #pragma GCC visibility pop | |||||
| #endif | |||||
| #endif /* ! _GLIBCXX_GCC_GTHR_H */ | 
| // std::messages implementation details, generic version -*- C++ -*- | |||||
| // Copyright (C) 2001-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/messages_members.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{locale} | |||||
| */ | |||||
| // | |||||
| // ISO C++ 14882: 22.2.7.1.2 messages virtual functions | |||||
| // | |||||
| // Written by Benjamin Kosnik <bkoz@redhat.com> | |||||
| namespace std _GLIBCXX_VISIBILITY(default) | |||||
| { | |||||
| _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||||
| // Non-virtual member functions. | |||||
| template<typename _CharT> | |||||
| messages<_CharT>::messages(size_t __refs) | |||||
| : facet(__refs) | |||||
| { _M_c_locale_messages = _S_get_c_locale(); } | |||||
| template<typename _CharT> | |||||
| messages<_CharT>::messages(__c_locale, const char*, size_t __refs) | |||||
| : facet(__refs) | |||||
| { _M_c_locale_messages = _S_get_c_locale(); } | |||||
| template<typename _CharT> | |||||
| typename messages<_CharT>::catalog | |||||
| messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc, | |||||
| const char*) const | |||||
| { return this->do_open(__s, __loc); } | |||||
| // Virtual member functions. | |||||
| template<typename _CharT> | |||||
| messages<_CharT>::~messages() | |||||
| { _S_destroy_c_locale(_M_c_locale_messages); } | |||||
| template<typename _CharT> | |||||
| typename messages<_CharT>::catalog | |||||
| messages<_CharT>::do_open(const basic_string<char>&, const locale&) const | |||||
| { return 0; } | |||||
| template<typename _CharT> | |||||
| typename messages<_CharT>::string_type | |||||
| messages<_CharT>::do_get(catalog, int, int, | |||||
| const string_type& __dfault) const | |||||
| { return __dfault; } | |||||
| template<typename _CharT> | |||||
| void | |||||
| messages<_CharT>::do_close(catalog) const | |||||
| { } | |||||
| // messages_byname | |||||
| template<typename _CharT> | |||||
| messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs) | |||||
| : messages<_CharT>(__refs) | |||||
| { | |||||
| if (__builtin_strcmp(__s, "C") != 0 | |||||
| && __builtin_strcmp(__s, "POSIX") != 0) | |||||
| { | |||||
| this->_S_destroy_c_locale(this->_M_c_locale_messages); | |||||
| this->_S_create_c_locale(this->_M_c_locale_messages, __s); | |||||
| } | |||||
| } | |||||
| _GLIBCXX_END_NAMESPACE_VERSION | |||||
| } // namespace | 
| // Optimizations for random number handling, generic version -*- C++ -*- | |||||
| // Copyright (C) 2012-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/opt_random.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{random} | |||||
| */ | |||||
| #ifndef _BITS_OPT_RANDOM_H | |||||
| #define _BITS_OPT_RANDOM_H 1 | |||||
| #pragma GCC system_header | |||||
| #endif // _BITS_OPT_RANDOM_H | 
| // Specific definitions for newlib -*- C++ -*- | |||||
| // Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/os_defines.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{iosfwd} | |||||
| */ | |||||
| #ifndef _GLIBCXX_OS_DEFINES | |||||
| #define _GLIBCXX_OS_DEFINES 1 | |||||
| // System-specific #define, typedefs, corrections, etc, go here. This | |||||
| // file will come before all others. | |||||
| #ifdef __CYGWIN__ | |||||
| #define _GLIBCXX_GTHREAD_USE_WEAK 0 | |||||
| #if defined (_GLIBCXX_DLL) | |||||
| #define _GLIBCXX_PSEUDO_VISIBILITY_default __attribute__ ((__dllimport__)) | |||||
| #else | |||||
| #define _GLIBCXX_PSEUDO_VISIBILITY_default | |||||
| #endif | |||||
| #define _GLIBCXX_PSEUDO_VISIBILITY_hidden | |||||
| #define _GLIBCXX_PSEUDO_VISIBILITY(V) _GLIBCXX_PSEUDO_VISIBILITY_ ## V | |||||
| // See libstdc++/20806. | |||||
| #define _GLIBCXX_HAVE_DOS_BASED_FILESYSTEM 1 | |||||
| // Enable use of GetModuleHandleEx (requires Windows XP/2003) in | |||||
| // __cxa_thread_atexit to prevent modules from being unloaded before | |||||
| // their dtors are called | |||||
| #define _GLIBCXX_THREAD_ATEXIT_WIN32 1 | |||||
| // See libstdc++/69506 | |||||
| #define _GLIBCXX_USE_WEAK_REF 0 | |||||
| #endif | |||||
| #endif | 
| // C++ includes used for precompiling -*- C++ -*- | |||||
| // Copyright (C) 2003-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file stdc++.h | |||||
| * This is an implementation file for a precompiled header. | |||||
| */ | |||||
| // 17.4.1.2 Headers | |||||
| // C | |||||
| #ifndef _GLIBCXX_NO_ASSERT | |||||
| #include <cassert> | |||||
| #endif | |||||
| #include <cctype> | |||||
| #include <cerrno> | |||||
| #include <cfloat> | |||||
| #include <ciso646> | |||||
| #include <climits> | |||||
| #include <clocale> | |||||
| #include <cmath> | |||||
| #include <csetjmp> | |||||
| #include <csignal> | |||||
| #include <cstdarg> | |||||
| #include <cstddef> | |||||
| #include <cstdio> | |||||
| #include <cstdlib> | |||||
| #include <cstring> | |||||
| #include <ctime> | |||||
| #include <cwchar> | |||||
| #include <cwctype> | |||||
| #if __cplusplus >= 201103L | |||||
| #include <ccomplex> | |||||
| #include <cfenv> | |||||
| #include <cinttypes> | |||||
| #include <cstdalign> | |||||
| #include <cstdbool> | |||||
| #include <cstdint> | |||||
| #include <ctgmath> | |||||
| #include <cuchar> | |||||
| #endif | |||||
| // C++ | |||||
| #include <algorithm> | |||||
| #include <bitset> | |||||
| #include <complex> | |||||
| #include <deque> | |||||
| #include <exception> | |||||
| #include <fstream> | |||||
| #include <functional> | |||||
| #include <iomanip> | |||||
| #include <ios> | |||||
| #include <iosfwd> | |||||
| #include <iostream> | |||||
| #include <istream> | |||||
| #include <iterator> | |||||
| #include <limits> | |||||
| #include <list> | |||||
| #include <locale> | |||||
| #include <map> | |||||
| #include <memory> | |||||
| #include <new> | |||||
| #include <numeric> | |||||
| #include <ostream> | |||||
| #include <queue> | |||||
| #include <set> | |||||
| #include <sstream> | |||||
| #include <stack> | |||||
| #include <stdexcept> | |||||
| #include <streambuf> | |||||
| #include <string> | |||||
| #include <typeinfo> | |||||
| #include <utility> | |||||
| #include <valarray> | |||||
| #include <vector> | |||||
| #if __cplusplus >= 201103L | |||||
| #include <array> | |||||
| #include <atomic> | |||||
| #include <chrono> | |||||
| #include <codecvt> | |||||
| #include <condition_variable> | |||||
| #include <forward_list> | |||||
| #include <future> | |||||
| #include <initializer_list> | |||||
| #include <mutex> | |||||
| #include <random> | |||||
| #include <ratio> | |||||
| #include <regex> | |||||
| #include <scoped_allocator> | |||||
| #include <system_error> | |||||
| #include <thread> | |||||
| #include <tuple> | |||||
| #include <typeindex> | |||||
| #include <type_traits> | |||||
| #include <unordered_map> | |||||
| #include <unordered_set> | |||||
| #endif | |||||
| #if __cplusplus >= 201402L | |||||
| #include <shared_mutex> | |||||
| #endif | |||||
| #if __cplusplus >= 201703L | |||||
| #include <any> | |||||
| #include <charconv> | |||||
| // #include <execution> | |||||
| #include <filesystem> | |||||
| #include <optional> | |||||
| #include <memory_resource> | |||||
| #include <string_view> | |||||
| #include <variant> | |||||
| #endif | |||||
| #if __cplusplus > 201703L | |||||
| #include <bit> | |||||
| #include <compare> | |||||
| #include <concepts> | |||||
| #include <numbers> | |||||
| #include <ranges> | |||||
| #include <span> | |||||
| #include <stop_token> | |||||
| // #include <syncstream> | |||||
| #include <version> | |||||
| #endif | 
| // C++ includes used for precompiling TR1 -*- C++ -*- | |||||
| // Copyright (C) 2006-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file stdtr1c++.h | |||||
| * This is an implementation file for a precompiled header. | |||||
| */ | |||||
| #include <bits/stdc++.h> | |||||
| #include <tr1/array> | |||||
| #include <tr1/cctype> | |||||
| #include <tr1/cfenv> | |||||
| #include <tr1/cfloat> | |||||
| #include <tr1/cinttypes> | |||||
| #include <tr1/climits> | |||||
| #include <tr1/cmath> | |||||
| #include <tr1/complex> | |||||
| #include <tr1/cstdarg> | |||||
| #include <tr1/cstdbool> | |||||
| #include <tr1/cstdint> | |||||
| #include <tr1/cstdio> | |||||
| #include <tr1/cstdlib> | |||||
| #include <tr1/ctgmath> | |||||
| #include <tr1/ctime> | |||||
| #include <tr1/cwchar> | |||||
| #include <tr1/cwctype> | |||||
| #include <tr1/functional> | |||||
| #include <tr1/random> | |||||
| #include <tr1/tuple> | |||||
| #include <tr1/unordered_map> | |||||
| #include <tr1/unordered_set> | |||||
| #include <tr1/utility> | 
| // std::time_get, std::time_put implementation, generic version -*- C++ -*- | |||||
| // Copyright (C) 2001-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/time_members.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{locale} | |||||
| */ | |||||
| // | |||||
| // ISO C++ 14882: 22.2.5.1.2 - time_get functions | |||||
| // ISO C++ 14882: 22.2.5.3.2 - time_put functions | |||||
| // | |||||
| // Written by Benjamin Kosnik <bkoz@redhat.com> | |||||
| namespace std _GLIBCXX_VISIBILITY(default) | |||||
| { | |||||
| _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||||
| template<typename _CharT> | |||||
| __timepunct<_CharT>::__timepunct(size_t __refs) | |||||
| : facet(__refs), _M_data(0) | |||||
| { | |||||
| _M_name_timepunct = _S_get_c_name(); | |||||
| _M_initialize_timepunct(); | |||||
| } | |||||
| template<typename _CharT> | |||||
| __timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs) | |||||
| : facet(__refs), _M_data(__cache) | |||||
| { | |||||
| _M_name_timepunct = _S_get_c_name(); | |||||
| _M_initialize_timepunct(); | |||||
| } | |||||
| template<typename _CharT> | |||||
| __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s, | |||||
| size_t __refs) | |||||
| : facet(__refs), _M_data(0) | |||||
| { | |||||
| if (__builtin_strcmp(__s, _S_get_c_name()) != 0) | |||||
| { | |||||
| const size_t __len = __builtin_strlen(__s) + 1; | |||||
| char* __tmp = new char[__len]; | |||||
| __builtin_memcpy(__tmp, __s, __len); | |||||
| _M_name_timepunct = __tmp; | |||||
| } | |||||
| else | |||||
| _M_name_timepunct = _S_get_c_name(); | |||||
| __try | |||||
| { _M_initialize_timepunct(__cloc); } | |||||
| __catch(...) | |||||
| { | |||||
| if (_M_name_timepunct != _S_get_c_name()) | |||||
| delete [] _M_name_timepunct; | |||||
| __throw_exception_again; | |||||
| } | |||||
| } | |||||
| template<typename _CharT> | |||||
| __timepunct<_CharT>::~__timepunct() | |||||
| { | |||||
| if (_M_name_timepunct != _S_get_c_name()) | |||||
| delete [] _M_name_timepunct; | |||||
| delete _M_data; | |||||
| _S_destroy_c_locale(_M_c_locale_timepunct); | |||||
| } | |||||
| _GLIBCXX_END_NAMESPACE_VERSION | |||||
| } // namespace | 
| // Optimizations for random number extensions, generic version -*- C++ -*- | |||||
| // Copyright (C) 2012-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file ext/opt_random.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{ext/random} | |||||
| */ | |||||
| #ifndef _EXT_OPT_RANDOM_H | |||||
| #define _EXT_OPT_RANDOM_H 1 | |||||
| #pragma GCC system_header | |||||
| #endif // _EXT_OPT_RANDOM_H | 
| // Low-level type for atomic operations -*- C++ -*- | |||||
| // Copyright (C) 2004-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file atomic_word.h | |||||
| * This file is a GNU extension to the Standard C++ Library. | |||||
| */ | |||||
| #ifndef _GLIBCXX_ATOMIC_WORD_H | |||||
| #define _GLIBCXX_ATOMIC_WORD_H 1 | |||||
| typedef int _Atomic_word; | |||||
| // This is a memory order acquire fence. | |||||
| #define _GLIBCXX_READ_MEM_BARRIER __atomic_thread_fence (__ATOMIC_ACQUIRE) | |||||
| // This is a memory order release fence. | |||||
| #define _GLIBCXX_WRITE_MEM_BARRIER __atomic_thread_fence (__ATOMIC_RELEASE) | |||||
| #endif | 
| // Wrapper of C-language FILE struct -*- C++ -*- | |||||
| // Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| // | |||||
| // ISO C++ 14882: 27.8 File-based streams | |||||
| // | |||||
| /** @file bits/basic_file.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{ios} | |||||
| */ | |||||
| #ifndef _GLIBCXX_BASIC_FILE_STDIO_H | |||||
| #define _GLIBCXX_BASIC_FILE_STDIO_H 1 | |||||
| #pragma GCC system_header | |||||
| #include <bits/c++config.h> | |||||
| #include <bits/c++io.h> // for __c_lock and __c_file | |||||
| #include <bits/move.h> // for swap | |||||
| #include <ios> | |||||
| namespace std _GLIBCXX_VISIBILITY(default) | |||||
| { | |||||
| _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||||
| // Generic declaration. | |||||
| template<typename _CharT> | |||||
| class __basic_file; | |||||
| // Specialization. | |||||
| template<> | |||||
| class __basic_file<char> | |||||
| { | |||||
| // Underlying data source/sink. | |||||
| __c_file* _M_cfile; | |||||
| // True iff we opened _M_cfile, and thus must close it ourselves. | |||||
| bool _M_cfile_created; | |||||
| public: | |||||
| __basic_file(__c_lock* __lock = 0) throw (); | |||||
| #if __cplusplus >= 201103L | |||||
| __basic_file(__basic_file&& __rv, __c_lock* = 0) noexcept | |||||
| : _M_cfile(__rv._M_cfile), _M_cfile_created(__rv._M_cfile_created) | |||||
| { | |||||
| __rv._M_cfile = nullptr; | |||||
| __rv._M_cfile_created = false; | |||||
| } | |||||
| __basic_file& operator=(const __basic_file&) = delete; | |||||
| __basic_file& operator=(__basic_file&&) = delete; | |||||
| void | |||||
| swap(__basic_file& __f) noexcept | |||||
| { | |||||
| std::swap(_M_cfile, __f._M_cfile); | |||||
| std::swap(_M_cfile_created, __f._M_cfile_created); | |||||
| } | |||||
| #endif | |||||
| __basic_file* | |||||
| open(const char* __name, ios_base::openmode __mode, int __prot = 0664); | |||||
| #if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T | |||||
| __basic_file* | |||||
| open(const wchar_t* __name, ios_base::openmode __mode); | |||||
| #endif | |||||
| __basic_file* | |||||
| sys_open(__c_file* __file, ios_base::openmode); | |||||
| __basic_file* | |||||
| sys_open(int __fd, ios_base::openmode __mode) throw (); | |||||
| __basic_file* | |||||
| close(); | |||||
| _GLIBCXX_PURE bool | |||||
| is_open() const throw (); | |||||
| _GLIBCXX_PURE int | |||||
| fd() throw (); | |||||
| _GLIBCXX_PURE __c_file* | |||||
| file() throw (); | |||||
| ~__basic_file(); | |||||
| streamsize | |||||
| xsputn(const char* __s, streamsize __n); | |||||
| streamsize | |||||
| xsputn_2(const char* __s1, streamsize __n1, | |||||
| const char* __s2, streamsize __n2); | |||||
| streamsize | |||||
| xsgetn(char* __s, streamsize __n); | |||||
| streamoff | |||||
| seekoff(streamoff __off, ios_base::seekdir __way) throw (); | |||||
| int | |||||
| sync(); | |||||
| streamsize | |||||
| showmanyc(); | |||||
| }; | |||||
| _GLIBCXX_END_NAMESPACE_VERSION | |||||
| } // namespace | |||||
| #endif | 
| // Base to std::allocator -*- C++ -*- | |||||
| // Copyright (C) 2004-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/c++allocator.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{memory} | |||||
| */ | |||||
| #ifndef _GLIBCXX_CXX_ALLOCATOR_H | |||||
| #define _GLIBCXX_CXX_ALLOCATOR_H 1 | |||||
| #include <ext/new_allocator.h> | |||||
| #if __cplusplus >= 201103L | |||||
| namespace std | |||||
| { | |||||
| /** | |||||
| * @brief An alias to the base class for std::allocator. | |||||
| * | |||||
| * Used to set the std::allocator base class to | |||||
| * __gnu_cxx::new_allocator. | |||||
| * | |||||
| * @ingroup allocators | |||||
| * @tparam _Tp Type of allocated object. | |||||
| */ | |||||
| template<typename _Tp> | |||||
| using __allocator_base = __gnu_cxx::new_allocator<_Tp>; | |||||
| } | |||||
| #else | |||||
| // Define new_allocator as the base class to std::allocator. | |||||
| # define __allocator_base __gnu_cxx::new_allocator | |||||
| #endif | |||||
| #if defined(__SANITIZE_ADDRESS__) && !defined(_GLIBCXX_SANITIZE_STD_ALLOCATOR) | |||||
| # define _GLIBCXX_SANITIZE_STD_ALLOCATOR 1 | |||||
| #endif | |||||
| #endif | 
| // Underlying io library details -*- C++ -*- | |||||
| // Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/c++io.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{ios} | |||||
| */ | |||||
| // c_io_stdio.h - Defines for using "C" stdio.h | |||||
| #ifndef _GLIBCXX_CXX_IO_H | |||||
| #define _GLIBCXX_CXX_IO_H 1 | |||||
| #include <cstdio> | |||||
| #include <bits/gthr.h> | |||||
| namespace std _GLIBCXX_VISIBILITY(default) | |||||
| { | |||||
| _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||||
| typedef __gthread_mutex_t __c_lock; | |||||
| // for basic_file.h | |||||
| typedef FILE __c_file; | |||||
| _GLIBCXX_END_NAMESPACE_VERSION | |||||
| } // namespace | |||||
| #endif | 
| // Wrapper for underlying C-language localization -*- C++ -*- | |||||
| // Copyright (C) 2001-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/c++locale.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{locale} | |||||
| */ | |||||
| // | |||||
| // ISO C++ 14882: 22.8 Standard locale categories. | |||||
| // | |||||
| // Written by Benjamin Kosnik <bkoz@redhat.com> | |||||
| #ifndef _GLIBCXX_CXX_LOCALE_H | |||||
| #define _GLIBCXX_CXX_LOCALE_H 1 | |||||
| #pragma GCC system_header | |||||
| #include <clocale> | |||||
| #define _GLIBCXX_NUM_CATEGORIES 0 | |||||
| namespace std _GLIBCXX_VISIBILITY(default) | |||||
| { | |||||
| _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||||
| typedef int* __c_locale; | |||||
| // Convert numeric value of type double and long double to string and | |||||
| // return length of string. If vsnprintf is available use it, otherwise | |||||
| // fall back to the unsafe vsprintf which, in general, can be dangerous | |||||
| // and should be avoided. | |||||
| inline int | |||||
| __convert_from_v(const __c_locale&, char* __out, | |||||
| const int __size __attribute__((__unused__)), | |||||
| const char* __fmt, ...) | |||||
| { | |||||
| char* __old = std::setlocale(LC_NUMERIC, 0); | |||||
| char* __sav = 0; | |||||
| if (__builtin_strcmp(__old, "C")) | |||||
| { | |||||
| const size_t __len = __builtin_strlen(__old) + 1; | |||||
| __sav = new char[__len]; | |||||
| __builtin_memcpy(__sav, __old, __len); | |||||
| std::setlocale(LC_NUMERIC, "C"); | |||||
| } | |||||
| __builtin_va_list __args; | |||||
| __builtin_va_start(__args, __fmt); | |||||
| #if _GLIBCXX_USE_C99_STDIO && !_GLIBCXX_HAVE_BROKEN_VSNPRINTF | |||||
| const int __ret = __builtin_vsnprintf(__out, __size, __fmt, __args); | |||||
| #else | |||||
| const int __ret = __builtin_vsprintf(__out, __fmt, __args); | |||||
| #endif | |||||
| __builtin_va_end(__args); | |||||
| if (__sav) | |||||
| { | |||||
| std::setlocale(LC_NUMERIC, __sav); | |||||
| delete [] __sav; | |||||
| } | |||||
| return __ret; | |||||
| } | |||||
| _GLIBCXX_END_NAMESPACE_VERSION | |||||
| } // namespace | |||||
| #endif | 
| // Specific definitions for generic platforms -*- C++ -*- | |||||
| // Copyright (C) 2015-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/cpu_defines.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{iosfwd} | |||||
| */ | |||||
| #ifndef _GLIBCXX_CPU_DEFINES | |||||
| #define _GLIBCXX_CPU_DEFINES 1 | |||||
| // Integer divide instructions don't trap on ARM. | |||||
| #ifdef __ARM_ARCH_EXT_IDIV__ | |||||
| #define __glibcxx_integral_traps false | |||||
| #else | |||||
| #define __glibcxx_integral_traps true | |||||
| #endif | |||||
| #endif | 
| // Locale support -*- C++ -*- | |||||
| // Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| // | |||||
| // ISO C++ 14882: 22.1 Locales | |||||
| // | |||||
| // Information as gleaned from /usr/include/ctype.h | |||||
| namespace std _GLIBCXX_VISIBILITY(default) | |||||
| { | |||||
| _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||||
| /// @brief Base class for ctype. | |||||
| struct ctype_base | |||||
| { | |||||
| // Non-standard typedefs. | |||||
| typedef const int* __to_type; | |||||
| // NB: Offsets into ctype<char>::_M_table force a particular size | |||||
| // on the mask type. Because of this, we don't use an enum. | |||||
| typedef char mask; | |||||
| static const mask upper = _U; | |||||
| static const mask lower = _L; | |||||
| static const mask alpha = _U | _L; | |||||
| static const mask digit = _N; | |||||
| static const mask xdigit = _X | _N; | |||||
| static const mask space = _S; | |||||
| static const mask print = _P | _U | _L | _N | _B; | |||||
| static const mask graph = _P | _U | _L | _N; | |||||
| static const mask cntrl = _C; | |||||
| static const mask punct = _P; | |||||
| static const mask alnum = _U | _L | _N; | |||||
| #if __cplusplus >= 201103L | |||||
| static const mask blank = space; | |||||
| #endif | |||||
| }; | |||||
| _GLIBCXX_END_NAMESPACE_VERSION | |||||
| } // namespace | 
| // Locale support -*- C++ -*- | |||||
| // Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/ctype_inline.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{locale} | |||||
| */ | |||||
| // | |||||
| // ISO C++ 14882: 22.1 Locales | |||||
| // | |||||
| // ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) | |||||
| // functions go in ctype.cc | |||||
| namespace std _GLIBCXX_VISIBILITY(default) | |||||
| { | |||||
| _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||||
| bool | |||||
| ctype<char>:: | |||||
| is(mask __m, char __c) const | |||||
| { return _M_table[static_cast<unsigned char>(__c)] & __m; } | |||||
| const char* | |||||
| ctype<char>:: | |||||
| is(const char* __low, const char* __high, mask* __vec) const | |||||
| { | |||||
| while (__low < __high) | |||||
| *__vec++ = _M_table[static_cast<unsigned char>(*__low++)]; | |||||
| return __high; | |||||
| } | |||||
| const char* | |||||
| ctype<char>:: | |||||
| scan_is(mask __m, const char* __low, const char* __high) const | |||||
| { | |||||
| while (__low < __high && !this->is(__m, *__low)) | |||||
| ++__low; | |||||
| return __low; | |||||
| } | |||||
| const char* | |||||
| ctype<char>:: | |||||
| scan_not(mask __m, const char* __low, const char* __high) const | |||||
| { | |||||
| while (__low < __high && this->is(__m, *__low) != 0) | |||||
| ++__low; | |||||
| return __low; | |||||
| } | |||||
| _GLIBCXX_END_NAMESPACE_VERSION | |||||
| } // namespace | 
| // Control various target specific ABI tweaks. ARM version. | |||||
| // Copyright (C) 2004-2020 Free Software Foundation, Inc. | |||||
| // | |||||
| // This file is part of the GNU ISO C++ Library. This library is free | |||||
| // software; you can redistribute it and/or modify it under the | |||||
| // terms of the GNU General Public License as published by the | |||||
| // Free Software Foundation; either version 3, or (at your option) | |||||
| // any later version. | |||||
| // This library is distributed in the hope that it will be useful, | |||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| // GNU General Public License for more details. | |||||
| // Under Section 7 of GPL version 3, you are granted additional | |||||
| // permissions described in the GCC Runtime Library Exception, version | |||||
| // 3.1, as published by the Free Software Foundation. | |||||
| // You should have received a copy of the GNU General Public License and | |||||
| // a copy of the GCC Runtime Library Exception along with this program; | |||||
| // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||||
| // <http://www.gnu.org/licenses/>. | |||||
| /** @file bits/cxxabi_tweaks.h | |||||
| * This is an internal header file, included by other library headers. | |||||
| * Do not attempt to use it directly. @headername{cxxabi.h} | |||||
| */ | |||||
| #ifndef _CXXABI_TWEAKS_H | |||||
| #define _CXXABI_TWEAKS_H 1 | |||||
| #ifdef __cplusplus | |||||
| namespace __cxxabiv1 | |||||
| { | |||||
| extern "C" | |||||
| { | |||||
| #endif | |||||
| #ifdef __ARM_EABI__ | |||||
| // The ARM EABI uses the least significant bit of a 32-bit | |||||
| // guard variable. */ | |||||
| #define _GLIBCXX_GUARD_TEST(x) ((*(x) & 1) != 0) | |||||
| #define _GLIBCXX_GUARD_SET(x) *(x) = 1 | |||||
| #define _GLIBCXX_GUARD_BIT 1 | |||||
| #define _GLIBCXX_GUARD_PENDING_BIT __guard_test_bit (1, 1) | |||||
| #define _GLIBCXX_GUARD_WAITING_BIT __guard_test_bit (2, 1) | |||||
| typedef int __guard; | |||||
| // We also want the element size in array cookies. | |||||
| #define _GLIBCXX_ELTSIZE_IN_COOKIE 1 | |||||
| // __cxa_vec_ctor should return a pointer to the array. | |||||
| typedef void * __cxa_vec_ctor_return_type; | |||||
| #define _GLIBCXX_CXA_VEC_CTOR_RETURN(x) return x | |||||
| // Constructors and destructors return the "this" pointer. | |||||
| typedef void * __cxa_cdtor_return_type; | |||||
| #else // __ARM_EABI__ | |||||
| // The generic ABI uses the first byte of a 64-bit guard variable. | |||||
| #define _GLIBCXX_GUARD_TEST(x) (*(char *) (x) != 0) | |||||
| #define _GLIBCXX_GUARD_SET(x) *(char *) (x) = 1 | |||||
| #define _GLIBCXX_GUARD_BIT __guard_test_bit (0, 1) | |||||
| #define _GLIBCXX_GUARD_PENDING_BIT __guard_test_bit (1, 1) | |||||
| #define _GLIBCXX_GUARD_WAITING_BIT __guard_test_bit (2, 1) | |||||
| __extension__ typedef int __guard __attribute__((mode (__DI__))); | |||||
| // __cxa_vec_ctor has void return type. | |||||
| typedef void __cxa_vec_ctor_return_type; | |||||
| #define _GLIBCXX_CXA_VEC_CTOR_RETURN(x) return | |||||
| // Constructors and destructors do not return a value. | |||||
| typedef void __cxa_cdtor_return_type; | |||||
| #endif //!__ARM_EABI__ | |||||
| #ifdef __cplusplus | |||||
| } | |||||
| } // namespace __cxxabiv1 | |||||
| #endif | |||||
| #endif |