Boost logo

Boost Users :

From: Stefan Felkel (stefan.felkel_at_[hidden])
Date: 2007-02-21 05:56:44


Hi,

is there a way to access pool::get_next_size, pool::set_next_size from my
own fast_pool_allocator without modifying the boost source (1.33.1).
This my_fast_pool_allocator is a copy of fast_pool_allocator that tries to
allocate the requested memory with next_size divided by 2 if malloc returns
NULL.

I added static member functions get_next_size/set_next_size to singleton_pool
which works, but is there a way without modifying the boost source.
If not, would it make sense to add these two methods in a future boost release.

This is the allocate method of my_fast_pool_alloctor:

template <typename T,
    typename UserAllocator,
    typename Mutex,
    unsigned NextSize>
class my_fast_pool_allocator
{

        ...
        
    static pointer allocate(const size_type n)
    {
      typedef boost::singleton_pool<boost::fast_pool_allocator_tag, sizeof(T),
                                UserAllocator, Mutex, NextSize> mypool;
      pointer ret = NULL;
      for( ; !ret; )
      {
        if (n == 1 )
        {
                ret = static_cast<pointer>( mypool::malloc() );
        }
        else
        {
                ret = static_cast<pointer>( mypool::ordered_malloc(n) );
        }

        size_t nsize = mypool::get_next_size();
        if( !ret ) // not enough memory available
        {
                if( nsize <= n ) // even less than we really need
                        break;

                nsize >>= 1; // request half the size

                nsize = std::max( nsize, n ); // at least as much as we really need

        }
        mypool::set_next_size(nsize);
      }
      if (ret == 0)
        throw std::bad_alloc();
      return ret;
    }
    
        ...
        
};

Regards,
        Stefan


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net