OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [gcc-4.5.1/] [libstdc++-v3/] [src/] [bitmap_allocator.cc] - Diff between revs 816 and 826

Only display areas with differences | Details | Blame | View Log

Rev 816 Rev 826
// Bitmap Allocator. Out of line function definitions. -*- C++ -*-
// Bitmap Allocator. Out of line function definitions. -*- C++ -*-
 
 
// Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009
// Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009
// Free Software Foundation, Inc.
// 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
// terms of the GNU General Public License as published by the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// Free Software Foundation; either version 3, or (at your option)
// any later version.
// any later version.
 
 
// This library is distributed in the hope that it will be useful,
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// GNU General Public License for more details.
 
 
// Under Section 7 of GPL version 3, you are granted additional
// Under Section 7 of GPL version 3, you are granted additional
// permissions described in the GCC Runtime Library Exception, version
// permissions described in the GCC Runtime Library Exception, version
// 3.1, as published by the Free Software Foundation.
// 3.1, as published by the Free Software Foundation.
 
 
// You should have received a copy of the GNU General Public License and
// 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;
// a copy of the GCC Runtime Library Exception along with this program;
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
// <http://www.gnu.org/licenses/>.
// <http://www.gnu.org/licenses/>.
 
 
#include <ext/bitmap_allocator.h>
#include <ext/bitmap_allocator.h>
 
 
_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
 
 
  namespace __detail
  namespace __detail
  {
  {
    template class __mini_vector<
    template class __mini_vector<
      std::pair<bitmap_allocator<char>::_Alloc_block*,
      std::pair<bitmap_allocator<char>::_Alloc_block*,
                bitmap_allocator<char>::_Alloc_block*> >;
                bitmap_allocator<char>::_Alloc_block*> >;
 
 
    template class __mini_vector<
    template class __mini_vector<
      std::pair<bitmap_allocator<wchar_t>::_Alloc_block*,
      std::pair<bitmap_allocator<wchar_t>::_Alloc_block*,
                bitmap_allocator<wchar_t>::_Alloc_block*> >;
                bitmap_allocator<wchar_t>::_Alloc_block*> >;
 
 
    template class __mini_vector<size_t*>;
    template class __mini_vector<size_t*>;
 
 
    template size_t** __lower_bound(size_t**, size_t**, size_t const&,
    template size_t** __lower_bound(size_t**, size_t**, size_t const&,
                                    free_list::_LT_pointer_compare);
                                    free_list::_LT_pointer_compare);
  }
  }
 
 
  size_t*
  size_t*
  free_list::
  free_list::
  _M_get(size_t __sz) throw(std::bad_alloc)
  _M_get(size_t __sz) throw(std::bad_alloc)
  {
  {
#if defined __GTHREADS
#if defined __GTHREADS
    __mutex_type& __bfl_mutex = _M_get_mutex();
    __mutex_type& __bfl_mutex = _M_get_mutex();
#endif
#endif
    const vector_type& __free_list = _M_get_free_list();
    const vector_type& __free_list = _M_get_free_list();
    using __gnu_cxx::__detail::__lower_bound;
    using __gnu_cxx::__detail::__lower_bound;
    iterator __tmp = __lower_bound(__free_list.begin(), __free_list.end(),
    iterator __tmp = __lower_bound(__free_list.begin(), __free_list.end(),
                                   __sz, _LT_pointer_compare());
                                   __sz, _LT_pointer_compare());
 
 
    if (__tmp == __free_list.end() || !_M_should_i_give(**__tmp, __sz))
    if (__tmp == __free_list.end() || !_M_should_i_give(**__tmp, __sz))
      {
      {
        // We release the lock here, because operator new is
        // We release the lock here, because operator new is
        // guaranteed to be thread-safe by the underlying
        // guaranteed to be thread-safe by the underlying
        // implementation.
        // implementation.
#if defined __GTHREADS
#if defined __GTHREADS
        __bfl_mutex.unlock();
        __bfl_mutex.unlock();
#endif
#endif
        // Try twice to get the memory: once directly, and the 2nd
        // Try twice to get the memory: once directly, and the 2nd
        // time after clearing the free list. If both fail, then throw
        // time after clearing the free list. If both fail, then throw
        // std::bad_alloc().
        // std::bad_alloc().
        int __ctr = 2;
        int __ctr = 2;
        while (__ctr)
        while (__ctr)
          {
          {
            size_t* __ret = 0;
            size_t* __ret = 0;
            --__ctr;
            --__ctr;
            __try
            __try
              {
              {
                __ret = reinterpret_cast<size_t*>
                __ret = reinterpret_cast<size_t*>
                  (::operator new(__sz + sizeof(size_t)));
                  (::operator new(__sz + sizeof(size_t)));
              }
              }
            __catch(const std::bad_alloc&)
            __catch(const std::bad_alloc&)
              {
              {
                this->_M_clear();
                this->_M_clear();
              }
              }
            if (!__ret)
            if (!__ret)
              continue;
              continue;
            *__ret = __sz;
            *__ret = __sz;
            return __ret + 1;
            return __ret + 1;
          }
          }
        std::__throw_bad_alloc();
        std::__throw_bad_alloc();
      }
      }
    else
    else
      {
      {
        size_t* __ret = *__tmp;
        size_t* __ret = *__tmp;
        _M_get_free_list().erase(__tmp);
        _M_get_free_list().erase(__tmp);
#if defined __GTHREADS
#if defined __GTHREADS
        __bfl_mutex.unlock();
        __bfl_mutex.unlock();
#endif
#endif
        return __ret + 1;
        return __ret + 1;
      }
      }
  }
  }
 
 
  void
  void
  free_list::
  free_list::
  _M_clear()
  _M_clear()
  {
  {
#if defined __GTHREADS
#if defined __GTHREADS
    __gnu_cxx::__scoped_lock __bfl_lock(_M_get_mutex());
    __gnu_cxx::__scoped_lock __bfl_lock(_M_get_mutex());
#endif
#endif
    vector_type& __free_list = _M_get_free_list();
    vector_type& __free_list = _M_get_free_list();
    iterator __iter = __free_list.begin();
    iterator __iter = __free_list.begin();
    while (__iter != __free_list.end())
    while (__iter != __free_list.end())
      {
      {
        ::operator delete((void*)*__iter);
        ::operator delete((void*)*__iter);
        ++__iter;
        ++__iter;
      }
      }
    __free_list.clear();
    __free_list.clear();
  }
  }
 
 
  // Instantiations.
  // Instantiations.
  template class bitmap_allocator<char>;
  template class bitmap_allocator<char>;
  template class bitmap_allocator<wchar_t>;
  template class bitmap_allocator<wchar_t>;
 
 
_GLIBCXX_END_NAMESPACE
_GLIBCXX_END_NAMESPACE
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.