mirror of git://gcc.gnu.org/git/gcc.git
re PR libstdc++/26875 (Array allocator use count is shared between array_allocator instances)
2006-04-26 Benjamin Kosnik <bkoz@redhat.com> PR libstdc++/26875 * include/ext/array_allocator.h (array_allocator): _M_used, new data member. * testsuite/ext/array_allocator/26875.cc: New. From-SVN: r113283
This commit is contained in:
parent
0c3f35451c
commit
0c092147be
|
@ -1,3 +1,10 @@
|
|||
2006-04-26 Benjamin Kosnik <bkoz@redhat.com>
|
||||
|
||||
PR libstdc++/26875
|
||||
* include/ext/array_allocator.h (array_allocator): _M_used, new
|
||||
data member.
|
||||
* testsuite/ext/array_allocator/26875.cc: New.
|
||||
|
||||
2006-04-26 Shantonu Sen <ssen@opendarwin.org>
|
||||
|
||||
PR libstdc++/26513
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// array allocator -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2004, 2005 Free Software Foundation, Inc.
|
||||
// Copyright (C) 2004, 2005, 2006 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
|
||||
|
@ -49,13 +49,13 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
|
|||
class array_allocator_base
|
||||
{
|
||||
public:
|
||||
typedef size_t size_type;
|
||||
typedef ptrdiff_t difference_type;
|
||||
typedef _Tp* pointer;
|
||||
typedef const _Tp* const_pointer;
|
||||
typedef _Tp& reference;
|
||||
typedef const _Tp& const_reference;
|
||||
typedef _Tp value_type;
|
||||
typedef size_t size_type;
|
||||
typedef ptrdiff_t difference_type;
|
||||
typedef _Tp* pointer;
|
||||
typedef const _Tp* const_pointer;
|
||||
typedef _Tp& reference;
|
||||
typedef const _Tp& const_reference;
|
||||
typedef _Tp value_type;
|
||||
|
||||
pointer
|
||||
address(reference __x) const { return &__x; }
|
||||
|
@ -91,43 +91,43 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
|
|||
class array_allocator : public array_allocator_base<_Tp>
|
||||
{
|
||||
public:
|
||||
typedef size_t size_type;
|
||||
typedef ptrdiff_t difference_type;
|
||||
typedef _Tp* pointer;
|
||||
typedef const _Tp* const_pointer;
|
||||
typedef _Tp& reference;
|
||||
typedef const _Tp& const_reference;
|
||||
typedef _Tp value_type;
|
||||
typedef size_t size_type;
|
||||
typedef ptrdiff_t difference_type;
|
||||
typedef _Tp* pointer;
|
||||
typedef const _Tp* const_pointer;
|
||||
typedef _Tp& reference;
|
||||
typedef const _Tp& const_reference;
|
||||
typedef _Tp value_type;
|
||||
typedef _Array array_type;
|
||||
|
||||
typedef _Array array_type;
|
||||
private:
|
||||
array_type* _M_array;
|
||||
size_type _M_used;
|
||||
|
||||
array_type* _M_array;
|
||||
|
||||
public:
|
||||
template<typename _Tp1, typename _Array1 = _Array>
|
||||
struct rebind
|
||||
{ typedef array_allocator<_Tp1, _Array1> other; };
|
||||
|
||||
array_allocator(array_type* __array = NULL) throw()
|
||||
: _M_array(__array)
|
||||
{ }
|
||||
: _M_array(__array), _M_used(size_type()) { }
|
||||
|
||||
array_allocator(const array_allocator& __o) throw()
|
||||
: _M_array(__o._M_array) { }
|
||||
: _M_array(__o._M_array), _M_used(__o._M_used) { }
|
||||
|
||||
template<typename _Tp1, typename _Array1>
|
||||
array_allocator(const array_allocator<_Tp1, _Array1>&) throw()
|
||||
: _M_array(NULL) { }
|
||||
: _M_array(NULL), _M_used(size_type()) { }
|
||||
|
||||
~array_allocator() throw() { }
|
||||
|
||||
pointer
|
||||
allocate(size_type __n, const void* = 0)
|
||||
{
|
||||
static size_type __array_used;
|
||||
if (_M_array == 0 || __array_used + __n > _M_array->size())
|
||||
if (_M_array == 0 || _M_used + __n > _M_array->size())
|
||||
std::__throw_bad_alloc();
|
||||
pointer __ret = _M_array->begin() + __array_used;
|
||||
__array_used += __n;
|
||||
pointer __ret = _M_array->begin() + _M_used;
|
||||
_M_used += __n;
|
||||
return __ret;
|
||||
}
|
||||
};
|
||||
|
|
|
@ -0,0 +1,46 @@
|
|||
//
|
||||
// Copyright (C) 2006 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 2, 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.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
// USA.
|
||||
|
||||
#include <ext/array_allocator.h>
|
||||
|
||||
// libstdc++/26875
|
||||
int main()
|
||||
{
|
||||
typedef std::tr1::array<int, 1> array_type;
|
||||
array_type Array1;
|
||||
array_type Array2;
|
||||
|
||||
typedef __gnu_cxx::array_allocator<int> allocator_type;
|
||||
allocator_type Allocator1(&Array1);
|
||||
allocator_type Allocator2(&Array2);
|
||||
|
||||
try
|
||||
{
|
||||
Allocator1.allocate(1);
|
||||
Allocator2.allocate(1);
|
||||
}
|
||||
catch (std::bad_alloc& ex)
|
||||
{
|
||||
// fail, rethrow
|
||||
throw;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue