|
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