diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4 index 71321055de72f1f193b6a4d453b9d65b5dc7f88f..6d9a8875e3186380075ad6a0f302ee8df5f8c833 100644 --- a/libstdc++-v3/acinclude.m4 +++ b/libstdc++-v3/acinclude.m4 @@ -2599,7 +2599,7 @@ AC_DEFUN([GLIBCXX_ENABLE_ALLOCATOR], [ AC_MSG_CHECKING([for std::allocator base class]) GLIBCXX_ENABLE(libstdcxx-allocator,auto,[[[=KIND]]], [use KIND for target std::allocator base], - [permit new|malloc|mt|bitmap|pool|yes|no|auto]) + [permit new|malloc|yes|no|auto]) # If they didn't use this option switch, or if they specified --enable # with no specific model, we'll have to look for one. If they @@ -2631,26 +2631,14 @@ AC_DEFUN([GLIBCXX_ENABLE_ALLOCATOR], [ # Set configure bits for specified locale package case ${enable_libstdcxx_allocator_flag} in - bitmap) - ALLOCATOR_H=config/allocator/bitmap_allocator_base.h - ALLOCATOR_NAME=__gnu_cxx::bitmap_allocator - ;; malloc) ALLOCATOR_H=config/allocator/malloc_allocator_base.h ALLOCATOR_NAME=__gnu_cxx::malloc_allocator ;; - mt) - ALLOCATOR_H=config/allocator/mt_allocator_base.h - ALLOCATOR_NAME=__gnu_cxx::__mt_alloc - ;; new) ALLOCATOR_H=config/allocator/new_allocator_base.h ALLOCATOR_NAME=__gnu_cxx::new_allocator ;; - pool) - ALLOCATOR_H=config/allocator/pool_allocator_base.h - ALLOCATOR_NAME=__gnu_cxx::__pool_alloc - ;; esac GLIBCXX_CONDITIONAL(ENABLE_ALLOCATOR_NEW, diff --git a/libstdc++-v3/config/allocator/bitmap_allocator_base.h b/libstdc++-v3/config/allocator/bitmap_allocator_base.h deleted file mode 100644 index 40ccbf03449a86a733bd4c50a53198cafa5c3ad8..0000000000000000000000000000000000000000 --- a/libstdc++-v3/config/allocator/bitmap_allocator_base.h +++ /dev/null @@ -1,55 +0,0 @@ -// Base to std::allocator -*- C++ -*- - -// Copyright (C) 2004-2021 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/bitmap_allocator.h> - -#if __cplusplus >= 201103L -namespace std -{ - /** - * @brief An alias to the base class for std::allocator. - * @ingroup allocators - * - * Used to set the std::allocator base class to - * __gnu_cxx::bitmap_allocator. - * - * @tparam _Tp Type of allocated object. - */ - template<typename _Tp> - using __allocator_base = __gnu_cxx::bitmap_allocator<_Tp>; -} -#else -// Define bitmap_allocator as the base class to std::allocator. -# define __allocator_base __gnu_cxx::bitmap_allocator -#endif - -#endif diff --git a/libstdc++-v3/config/allocator/mt_allocator_base.h b/libstdc++-v3/config/allocator/mt_allocator_base.h deleted file mode 100644 index eb45b8dea6da4ed46950ed6d6fbe9e6659a659b4..0000000000000000000000000000000000000000 --- a/libstdc++-v3/config/allocator/mt_allocator_base.h +++ /dev/null @@ -1,55 +0,0 @@ -// Base to std::allocator -*- C++ -*- - -// Copyright (C) 2004-2021 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/mt_allocator.h> - -#if __cplusplus >= 201103L -namespace std -{ - /** - * @brief An alias to the base class for std::allocator. - * @ingroup allocators - * - * Used to set the std::allocator base class to - * __gnu_cxx::__mt_alloc. - * - * @tparam _Tp Type of allocated object. - */ - template<typename _Tp> - using __allocator_base = __gnu_cxx::__mt_alloc<_Tp>; -} -#else -// Define __mt_alloc as the base class to std::allocator. -# define __allocator_base __gnu_cxx::__mt_alloc -#endif - -#endif diff --git a/libstdc++-v3/config/allocator/pool_allocator_base.h b/libstdc++-v3/config/allocator/pool_allocator_base.h deleted file mode 100644 index c3ec8ecce8d240b6c264890009d091fac77097b1..0000000000000000000000000000000000000000 --- a/libstdc++-v3/config/allocator/pool_allocator_base.h +++ /dev/null @@ -1,55 +0,0 @@ -// Base to std::allocator -*- C++ -*- - -// Copyright (C) 2004-2021 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/pool_allocator.h> - -#if __cplusplus >= 201103L -namespace std -{ - /** - * @brief An alias to the base class for std::allocator. - * @ingroup allocators - * - * Used to set the std::allocator base class to - * __gnu_cxx::__pool_alloc. - * - * @tparam _Tp Type of allocated object. - */ - template<typename _Tp> - using __allocator_base = __gnu_cxx::__pool_alloc<_Tp>; -} -#else -// Define __pool_alloc as the base class to std::allocator. -# define __allocator_base __gnu_cxx::__pool_alloc -#endif - -#endif diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure index 9049e4b9864bb963e424925ba9301f8db3ac6dca..61a14a2cb3b9f5ff8e3b73d49c7173e070c477a1 100755 --- a/libstdc++-v3/configure +++ b/libstdc++-v3/configure @@ -16848,7 +16848,7 @@ $as_echo_n "checking for std::allocator base class... " >&6; } if test "${enable_libstdcxx_allocator+set}" = set; then : enableval=$enable_libstdcxx_allocator; case "$enableval" in - new|malloc|mt|bitmap|pool|yes|no|auto) ;; + new|malloc|yes|no|auto) ;; *) as_fn_error $? "Unknown argument to enable/disable libstdcxx-allocator" "$LINENO" 5 ;; esac @@ -16889,26 +16889,14 @@ $as_echo "$enable_libstdcxx_allocator_flag" >&6; } # Set configure bits for specified locale package case ${enable_libstdcxx_allocator_flag} in - bitmap) - ALLOCATOR_H=config/allocator/bitmap_allocator_base.h - ALLOCATOR_NAME=__gnu_cxx::bitmap_allocator - ;; malloc) ALLOCATOR_H=config/allocator/malloc_allocator_base.h ALLOCATOR_NAME=__gnu_cxx::malloc_allocator ;; - mt) - ALLOCATOR_H=config/allocator/mt_allocator_base.h - ALLOCATOR_NAME=__gnu_cxx::__mt_alloc - ;; new) ALLOCATOR_H=config/allocator/new_allocator_base.h ALLOCATOR_NAME=__gnu_cxx::new_allocator ;; - pool) - ALLOCATOR_H=config/allocator/pool_allocator_base.h - ALLOCATOR_NAME=__gnu_cxx::__pool_alloc - ;; esac diff --git a/libstdc++-v3/doc/html/manual/api.html b/libstdc++-v3/doc/html/manual/api.html index 32810788bf22012b25a1f1e057e88cb74972b199..2cc44aed4e36aa504b9e9d1aaf0b5f25f4bd2532 100644 --- a/libstdc++-v3/doc/html/manual/api.html +++ b/libstdc++-v3/doc/html/manual/api.html @@ -444,4 +444,7 @@ can be used instead. The <code class="function">std::unexpected</code> function and related typedef and accessors for the unexpected handler are deprecated for C++11 and later. Dynamic exception specifications should be replaced with <code class="code">noexcept</code>. +</p><p> +The <code class="literal">bitmap</code>, <code class="literal">mt</code>, and <code class="literal">pool</code> +options for <code class="option">--enable-libstdcxx-allocator</code> were removed. </p></div></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="abi.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="appendix_porting.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="backwards.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">ABI Policy and Guidelines </td><td width="20%" align="center"><a accesskey="h" href="../index.html">Home</a></td><td width="40%" align="right" valign="top"> Backwards Compatibility</td></tr></table></div></body></html> \ No newline at end of file diff --git a/libstdc++-v3/doc/html/manual/configure.html b/libstdc++-v3/doc/html/manual/configure.html index 9e2e9dcb18ec9fa272a01445068639f0b134fc3b..31c4da8a5e3a1ca8697a0719152dc1e752f007e3 100644 --- a/libstdc++-v3/doc/html/manual/configure.html +++ b/libstdc++-v3/doc/html/manual/configure.html @@ -64,12 +64,10 @@ <code class="code">'--enable-libstdcxx-allocator=auto'</code> (described next). </p></dd><dt><span class="term"><code class="code">--enable-libstdcxx-allocator=OPTION </code></span></dt><dd><p>Select a target-specific underlying std::allocator. The - choices are 'new' to specify a wrapper for new, 'malloc' to - specify a wrapper for malloc, 'mt' for a fixed power of two allocator, - 'pool' for the SGI pooled allocator or 'bitmap' for a bitmap allocator. - See this page for more information on allocator - <a class="link" href="memory.html#allocator.ext" title="Extension Allocators">extensions</a>. This option - can change the library ABI. + choices are 'new' to specify a wrapper for new, and 'malloc' to + specify a wrapper for malloc. + See <a class="xref" href="memory.html#allocator.ext" title="Extension Allocators">the section called “Extension Allocatorsâ€</a> for more information. + This option can change the library ABI. </p></dd><dt><span class="term"><code class="code">--enable-cheaders=OPTION</code></span></dt><dd><p>This allows the user to define the approach taken for C header compatibility with C++. Options are c, c_std, and c_global. These correspond to the source directory's include/c, diff --git a/libstdc++-v3/doc/html/manual/memory.html b/libstdc++-v3/doc/html/manual/memory.html index 5b28a5a9763702010f4864bea99a866eb424a2d9..1681d9853b0fb042f9c0e3e059f8d3ddc35d9085 100644 --- a/libstdc++-v3/doc/html/manual/memory.html +++ b/libstdc++-v3/doc/html/manual/memory.html @@ -103,8 +103,9 @@ high-speed extension allocators, covered below. Thus, all allocation and deallocation depends on the base class. </p><p> - The base class that <code class="classname">allocator</code> is derived from - may not be user-configurable. + The choice of base class that <code class="classname">allocator</code> + is derived from is fixed at the time when GCC is built, + and the different choices are not ABI compatible. </p></div><div class="section"><div class="titlepage"><div><div><h5 class="title"><a id="allocator.default"></a>Selecting Default Allocation Policy</h5></div></div></div><p> It's difficult to pick an allocation strategy that will provide maximum utility, without excessively penalizing some behavior. In @@ -198,6 +199,10 @@ Probably the best place to start would be to copy one of the extension allocators: say a simple one like <code class="classname">new_allocator</code>. + </p><p> + Since C++11 the minimal interface require for an allocator is + much smaller, as <code class="classname">std::allocator_traits</code> + can provide default for much of the interface. </p></div><div class="section"><div class="titlepage"><div><div><h4 class="title"><a id="allocator.ext"></a>Extension Allocators</h4></div></div></div><p> Several other allocators are provided as part of this implementation. The location of the extension allocators and their @@ -224,9 +229,10 @@ </p></li><li class="listitem"><p> <code class="classname">debug_allocator</code> </p><p> - A wrapper around an arbitrary allocator A. It passes on - slightly increased size requests to A, and uses the extra - memory to store size information. When a pointer is passed + A wrapper around an arbitrary allocator <code class="classname">A</code>. + It passes on slightly increased size requests to <code class="classname">A</code>, + and uses the extra memory to store size information. + When a pointer is passed to <code class="function">deallocate()</code>, the stored size is checked, and <code class="function">assert()</code> is used to guarantee they match. @@ -248,41 +254,14 @@ request is passed to <code class="function">::operator new</code> directly. </p><p> - Older versions of this class take a boolean template - parameter, called <code class="varname">thr</code>, and an integer template - parameter, called <code class="varname">inst</code>. + For thread-enabled configurations, the pool is locked with a + single big lock. In some situations, this implementation detail + may result in severe performance degradation. </p><p> - The <code class="varname">inst</code> number is used to track additional memory - pools. The point of the number is to allow multiple - instantiations of the classes without changing the semantics at - all. All three of - </p><pre class="programlisting"> - typedef __pool_alloc<true,0> normal; - typedef __pool_alloc<true,1> private; - typedef __pool_alloc<true,42> also_private; - </pre><p> - behave exactly the same way. However, the memory pool for each type - (and remember that different instantiations result in different types) - remains separate. - </p><p> - The library uses <span class="emphasis"><em>0</em></span> in all its instantiations. If you - wish to keep separate free lists for a particular purpose, use a - different number. - </p><p>The <code class="varname">thr</code> boolean determines whether the - pool should be manipulated atomically or not. When - <code class="varname">thr</code> = <code class="constant">true</code>, the allocator - is thread-safe, while <code class="varname">thr</code> = - <code class="constant">false</code>, is slightly faster but unsafe for - multiple threads. - </p><p> - For thread-enabled configurations, the pool is locked with a - single big lock. In some situations, this implementation detail - may result in severe performance degradation. - </p><p> - (Note that the GCC thread abstraction layer allows us to provide - safe zero-overhead stubs for the threading routines, if threads - were disabled at configuration time.) - </p></li><li class="listitem"><p> + (Note that the GCC thread abstraction layer allows us to provide + safe zero-overhead stubs for the threading routines, if threads + were disabled at configuration time.) + </p></li><li class="listitem"><p> <code class="classname">__mt_alloc</code> </p><p> A high-performance fixed-size allocator with diff --git a/libstdc++-v3/doc/html/manual/mt_allocator.html b/libstdc++-v3/doc/html/manual/mt_allocator.html index c7786f02844502d3340fee056e063ea43943b7a4..68e7dccde78e37aefcbdf7e7bf8709278e126edd 100644 --- a/libstdc++-v3/doc/html/manual/mt_allocator.html +++ b/libstdc++-v3/doc/html/manual/mt_allocator.html @@ -6,12 +6,12 @@ </p><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="allocator.mt.intro"></a>Intro</h2></div></div></div><p> The mt allocator [hereinafter referred to simply as "the allocator"] is a fixed size (power of two) allocator that was initially - developed specifically to suit the needs of multi threaded + developed specifically to suit the needs of multi-threaded applications [hereinafter referred to as an MT application]. Over time the allocator has evolved and been improved in many ways, in - particular it now also does a good job in single threaded - applications [hereinafter referred to as a ST application]. (Note: - In this document, when referring to single threaded applications + particular it now also does a good job in single-threaded + applications [hereinafter referred to as an ST application]. (Note: + In this document, when referring to single-threaded applications this also includes applications that are compiled with gcc without thread support enabled. This is accomplished using ifdef's on __GTHREADS). This allocator is tunable, very flexible, and capable diff --git a/libstdc++-v3/doc/xml/manual/allocator.xml b/libstdc++-v3/doc/xml/manual/allocator.xml index 1f429410eb0e20e369941e14655db9a296b62aeb..aaab4e29aa75deb07e38090a9755af7d6e9fbb6f 100644 --- a/libstdc++-v3/doc/xml/manual/allocator.xml +++ b/libstdc++-v3/doc/xml/manual/allocator.xml @@ -154,8 +154,9 @@ </para> <para> - The base class that <classname>allocator</classname> is derived from - may not be user-configurable. + The choice of base class that <classname>allocator</classname> + is derived from is fixed at the time when GCC is built, + and the different choices are not ABI compatible. </para> </section> @@ -314,6 +315,13 @@ <classname>new_allocator</classname>. </para> + <para> + Since C++11 the minimal interface require for an allocator is + much smaller, as <classname>std::allocator_traits</classname> + can provide default for much of the interface. + </para> + + </section> <section xml:id="allocator.ext"><info><title>Extension Allocators</title></info> @@ -359,9 +367,10 @@ <classname>debug_allocator</classname> </para> <para> - A wrapper around an arbitrary allocator A. It passes on - slightly increased size requests to A, and uses the extra - memory to store size information. When a pointer is passed + A wrapper around an arbitrary allocator <classname>A</classname>. + It passes on slightly increased size requests to <classname>A</classname>, + and uses the extra memory to store size information. + When a pointer is passed to <function>deallocate()</function>, the stored size is checked, and <function>assert()</function> is used to guarantee they match. @@ -393,52 +402,16 @@ </para> <para> - Older versions of this class take a boolean template - parameter, called <varname>thr</varname>, and an integer template - parameter, called <varname>inst</varname>. + For thread-enabled configurations, the pool is locked with a + single big lock. In some situations, this implementation detail + may result in severe performance degradation. </para> <para> - The <varname>inst</varname> number is used to track additional memory - pools. The point of the number is to allow multiple - instantiations of the classes without changing the semantics at - all. All three of + (Note that the GCC thread abstraction layer allows us to provide + safe zero-overhead stubs for the threading routines, if threads + were disabled at configuration time.) </para> - - <programlisting> - typedef __pool_alloc<true,0> normal; - typedef __pool_alloc<true,1> private; - typedef __pool_alloc<true,42> also_private; - </programlisting> - <para> - behave exactly the same way. However, the memory pool for each type - (and remember that different instantiations result in different types) - remains separate. - </para> - <para> - The library uses <emphasis>0</emphasis> in all its instantiations. If you - wish to keep separate free lists for a particular purpose, use a - different number. - </para> - <para>The <varname>thr</varname> boolean determines whether the - pool should be manipulated atomically or not. When - <varname>thr</varname> = <constant>true</constant>, the allocator - is thread-safe, while <varname>thr</varname> = - <constant>false</constant>, is slightly faster but unsafe for - multiple threads. - </para> - - <para> - For thread-enabled configurations, the pool is locked with a - single big lock. In some situations, this implementation detail - may result in severe performance degradation. - </para> - - <para> - (Note that the GCC thread abstraction layer allows us to provide - safe zero-overhead stubs for the threading routines, if threads - were disabled at configuration time.) - </para> </listitem> <listitem> diff --git a/libstdc++-v3/doc/xml/manual/configure.xml b/libstdc++-v3/doc/xml/manual/configure.xml index cc9c8554c6cdef0b6cd9d5093dfe17ed11bdffc2..8c26acc95a798db7d98e50c2238713e6ecf14447 100644 --- a/libstdc++-v3/doc/xml/manual/configure.xml +++ b/libstdc++-v3/doc/xml/manual/configure.xml @@ -118,12 +118,10 @@ <varlistentry><term><code>--enable-libstdcxx-allocator=OPTION </code></term> <listitem><para>Select a target-specific underlying std::allocator. The - choices are 'new' to specify a wrapper for new, 'malloc' to - specify a wrapper for malloc, 'mt' for a fixed power of two allocator, - 'pool' for the SGI pooled allocator or 'bitmap' for a bitmap allocator. - See this page for more information on allocator - <link linkend="allocator.ext">extensions</link>. This option - can change the library ABI. + choices are 'new' to specify a wrapper for new, and 'malloc' to + specify a wrapper for malloc. + See <xref linkend="allocator.ext"/> for more information. + This option can change the library ABI. </para> </listitem></varlistentry> diff --git a/libstdc++-v3/doc/xml/manual/evolution.xml b/libstdc++-v3/doc/xml/manual/evolution.xml index 9aef84a09334a1812bcdff562531ac1be043fcf8..271d2225c3a2cfa9385eb127e981373fee648c00 100644 --- a/libstdc++-v3/doc/xml/manual/evolution.xml +++ b/libstdc++-v3/doc/xml/manual/evolution.xml @@ -1033,6 +1033,11 @@ accessors for the unexpected handler are deprecated for C++11 and later. Dynamic exception specifications should be replaced with <code>noexcept</code>. </para> +<para> +The <literal>bitmap</literal>, <literal>mt</literal>, and <literal>pool</literal> +options for <option>--enable-libstdcxx-allocator</option> were removed. +</para> + </section> </section> diff --git a/libstdc++-v3/doc/xml/manual/mt_allocator.xml b/libstdc++-v3/doc/xml/manual/mt_allocator.xml index 93504a7d711ae8696363df50a00c1e8f1e85423d..f1c09b3bd8f730bd8747b675ecbf67348a3d1c90 100644 --- a/libstdc++-v3/doc/xml/manual/mt_allocator.xml +++ b/libstdc++-v3/doc/xml/manual/mt_allocator.xml @@ -20,12 +20,12 @@ <para> The mt allocator [hereinafter referred to simply as "the allocator"] is a fixed size (power of two) allocator that was initially - developed specifically to suit the needs of multi threaded + developed specifically to suit the needs of multi-threaded applications [hereinafter referred to as an MT application]. Over time the allocator has evolved and been improved in many ways, in - particular it now also does a good job in single threaded - applications [hereinafter referred to as a ST application]. (Note: - In this document, when referring to single threaded applications + particular it now also does a good job in single-threaded + applications [hereinafter referred to as an ST application]. (Note: + In this document, when referring to single-threaded applications this also includes applications that are compiled with gcc without thread support enabled. This is accomplished using ifdef's on __GTHREADS). This allocator is tunable, very flexible, and capable