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>
|
2006-04-26 Shantonu Sen <ssen@opendarwin.org>
|
||||||
|
|
||||||
PR libstdc++/26513
|
PR libstdc++/26513
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// array allocator -*- C++ -*-
|
// 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
|
// 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
|
// software; you can redistribute it and/or modify it under the
|
||||||
|
@ -49,13 +49,13 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
|
||||||
class array_allocator_base
|
class array_allocator_base
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef size_t size_type;
|
typedef size_t size_type;
|
||||||
typedef ptrdiff_t difference_type;
|
typedef ptrdiff_t difference_type;
|
||||||
typedef _Tp* pointer;
|
typedef _Tp* pointer;
|
||||||
typedef const _Tp* const_pointer;
|
typedef const _Tp* const_pointer;
|
||||||
typedef _Tp& reference;
|
typedef _Tp& reference;
|
||||||
typedef const _Tp& const_reference;
|
typedef const _Tp& const_reference;
|
||||||
typedef _Tp value_type;
|
typedef _Tp value_type;
|
||||||
|
|
||||||
pointer
|
pointer
|
||||||
address(reference __x) const { return &__x; }
|
address(reference __x) const { return &__x; }
|
||||||
|
@ -91,43 +91,43 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
|
||||||
class array_allocator : public array_allocator_base<_Tp>
|
class array_allocator : public array_allocator_base<_Tp>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef size_t size_type;
|
typedef size_t size_type;
|
||||||
typedef ptrdiff_t difference_type;
|
typedef ptrdiff_t difference_type;
|
||||||
typedef _Tp* pointer;
|
typedef _Tp* pointer;
|
||||||
typedef const _Tp* const_pointer;
|
typedef const _Tp* const_pointer;
|
||||||
typedef _Tp& reference;
|
typedef _Tp& reference;
|
||||||
typedef const _Tp& const_reference;
|
typedef const _Tp& const_reference;
|
||||||
typedef _Tp value_type;
|
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>
|
template<typename _Tp1, typename _Array1 = _Array>
|
||||||
struct rebind
|
struct rebind
|
||||||
{ typedef array_allocator<_Tp1, _Array1> other; };
|
{ typedef array_allocator<_Tp1, _Array1> other; };
|
||||||
|
|
||||||
array_allocator(array_type* __array = NULL) throw()
|
array_allocator(array_type* __array = NULL) throw()
|
||||||
: _M_array(__array)
|
: _M_array(__array), _M_used(size_type()) { }
|
||||||
{ }
|
|
||||||
|
|
||||||
array_allocator(const array_allocator& __o) throw()
|
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>
|
template<typename _Tp1, typename _Array1>
|
||||||
array_allocator(const array_allocator<_Tp1, _Array1>&) throw()
|
array_allocator(const array_allocator<_Tp1, _Array1>&) throw()
|
||||||
: _M_array(NULL) { }
|
: _M_array(NULL), _M_used(size_type()) { }
|
||||||
|
|
||||||
~array_allocator() throw() { }
|
~array_allocator() throw() { }
|
||||||
|
|
||||||
pointer
|
pointer
|
||||||
allocate(size_type __n, const void* = 0)
|
allocate(size_type __n, const void* = 0)
|
||||||
{
|
{
|
||||||
static size_type __array_used;
|
if (_M_array == 0 || _M_used + __n > _M_array->size())
|
||||||
if (_M_array == 0 || __array_used + __n > _M_array->size())
|
|
||||||
std::__throw_bad_alloc();
|
std::__throw_bad_alloc();
|
||||||
pointer __ret = _M_array->begin() + __array_used;
|
pointer __ret = _M_array->begin() + _M_used;
|
||||||
__array_used += __n;
|
_M_used += __n;
|
||||||
return __ret;
|
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