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:
Benjamin Kosnik 2006-04-26 19:52:31 +00:00 committed by Benjamin Kosnik
parent 0c3f35451c
commit 0c092147be
3 changed files with 79 additions and 26 deletions

View File

@ -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

View File

@ -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;
}
};

View File

@ -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;
}