{ | |||||
"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 |