[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: branches/KDE/3.5/kdepim/indexlib
From: Luís Pedro Coelho <luis () luispedro ! org>
Date: 2005-08-11 12:51:43
Message-ID: 1123764703.686027.2833.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 445630 by luis_pedro:
Lift limits to index growth (should growth without limit, now)
Other little fixes chipped in too
M +1 -0 Makefile.am
M +4 -4 configure.in.in
M +17 -2 mempool.h
M +13 -10 mempool.tcc
M +10 -0 memreference.h
M +2 -0 quotes.cpp
--- branches/KDE/3.5/kdepim/indexlib/Makefile.am #445629:445630
@@ -1,4 +1,5 @@
KDE_CXXFLAGS=$(USE_EXCEPTIONS)
+INCLUDES = $(all_includes)
lib_LTLIBRARIES = libindex.la
--- branches/KDE/3.5/kdepim/indexlib/configure.in.in #445629:445630
@@ -11,11 +11,11 @@
CXXFLAGS="-I$boost_includedir $CXXFLAGS"
fi
-AC_CHECK_HEADER(boost/format.hpp, have_boost=yes,have_boost=no)
+KDE_CHECK_HEADER(boost/format.hpp, have_boost=yes,have_boost=no)
AC_LANG_POP
-#if test "x$have_boost" = "xno"; then
-# CXXFLAGS="-DHAVE_BOOST $CXXFLAGS"
-#fi
+if test "x$have_boost" = "xyes"; then
+ CXXFLAGS="-DHAVE_BOOST $CXXFLAGS"
+fi
--- branches/KDE/3.5/kdepim/indexlib/mempool.h #445629:445630
@@ -42,7 +42,13 @@
#include <algorithm>
#include <ostream>
-
+/**
+ * @short implement memory management for things
+ *
+ * This class implements memory management for pools of things.
+ * It uses a simple linked list memory management algorithm and
+ * it depends on being supplied the right trait for the type held.
+ */
template <typename Traits>
struct mempool /* : boost::noncopyable */ {
public:
@@ -58,6 +64,9 @@
unsigned size() const { return manager_->size(); }
private:
+ /**
+ * Basically int( log_2( min( x + 1, min_size() ) ) )
+ */
static unsigned order_of( unsigned x ) {
assert( x > 0 );
if ( x < traits_type::min_size() ) x = traits_type::min_size();
@@ -69,6 +78,9 @@
}
return res;
}
+ /**
+ * @returns order^2
+ */
static unsigned order_to_size( unsigned order ) {
return 1 << order;
}
@@ -101,6 +113,9 @@
END_THING( list_node )
list_nodeptr get_node( uint32_t p ) const;
+ /**
+ * Get the free list header for a given order
+ */
memory_reference<uint32_t> free_list( unsigned order );
uint32_t free_list( unsigned order ) const {
return const_cast<mempool*>( this )->free_list( order );
@@ -116,7 +131,7 @@
void deallocate( data_typeptr, unsigned order );
std::auto_ptr<memory_manager> manager_;
- unsigned max_order_;
+ memory_reference<uint32_t> max_order_;
};
#include "mempool.tcc"
--- branches/KDE/3.5/kdepim/indexlib/mempool.tcc #445629:445630
@@ -5,16 +5,20 @@
template <typename Traits>
mempool<Traits>::mempool( std::auto_ptr<memory_manager> source ):
manager_( source ),
- max_order_( order_of( traits_type::max_size() ) )
+ max_order_( 0 )
{
if ( !manager_->size() ) init_memory();
+ max_order_.assign( memory_reference<uint32_t>( manager_->rw_base( 0 ) ) );
+ if ( !max_order_ ) {
+ max_order_ = order_of( traits_type::max_size() );
+ }
traits_type::set_manager( manager_.get() );
}
template <typename Traits>
typename mempool<Traits>::data_typeptr mempool<Traits>::allocate( unsigned size ) {
if ( size < traits_type::min_size() ) size = traits_type::min_size();
- assert( size <= traits_type::max_size() );
+ max_order_ = std::max<uint32_t>( order_of( size ), max_order_ );
const unsigned order = std::max<unsigned>( order_of( size ), \
min_order_for_free_node ); if ( uint32_t res = free_list( order ) ) {
free_list( order ) = get_node( res )->next();
@@ -22,6 +26,7 @@
logfile() << format( "%s( %s ): (order %s) Returning %s\n" ) % __PRETTY_FUNCTION__ \
% size % order % res; return data_typeptr::cast_from_uint32( res );
} else {
+ std::cerr << "For size " << size << " going up to " << ( unsigned )max_order_ << \
std::endl; for ( unsigned bigger = order + 1; bigger <= max_order_; ++bigger ) {
if ( uint32_t res = free_list( bigger ) ) {
while ( bigger > order ) {
@@ -32,8 +37,9 @@
return allocate( size );
}
}
- unsigned old_size = manager_->size();
+ const unsigned old_size = manager_->size();
manager_->resize( manager_->size() + order_to_size( order ) );
+ max_order_.assign( memory_reference<uint32_t>( manager_->rw_base( 0 ) ) );
fill_into_list( old_size, order );
return allocate( size );
}
@@ -63,11 +69,7 @@
template <typename Traits>
void mempool<Traits>::init_memory() {
- //const unsigned needed = ( 1 << order_of( max_order_ ) ); // round to the next \
power of 2
- manager_->resize( 4096 ); // FIXME;
- //uint32_t next_block = std::max( traits_type::max_size(), needed );
- //manager_->resize( next_block );
- //fill_into_list( next_block );
+ manager_->resize( 4096 );
}
template <typename Traits>
@@ -80,7 +82,7 @@
}
out << '\n';
- iterator = std::max( traits_type::max_size(), order_to_size( max_order_ ) );
+ iterator = order_to_size( max_order_ );
while ( iterator < end ) {
data_typeptr p = data_typeptr::cast_from_uint32( iterator );
@@ -102,6 +104,7 @@
template <typename Traits>
memory_reference<uint32_t> mempool<Traits>::free_list( unsigned order ) {
+ assert( order );
return memory_reference<uint32_t>( manager_->rw_base( order * \
byte_io::byte_lenght<uint32_t>() ) ); }
@@ -190,7 +193,7 @@
template <typename Traits>
typename mempool<Traits>::data_typeptr mempool<Traits>::reallocate( data_typeptr \
data, unsigned size ) { logfile() << format( "%s( %s, %s)\n" ) % __PRETTY_FUNCTION__ \
% data % size;
- assert( size <= traits_type::max_size() );
+ max_order_ = std::max<uint32_t>( max_order_, order_of( max_order_ ) );
const unsigned original_size = size_of( data );
unsigned char* temporary = static_cast<unsigned char*>( operator new( original_size \
) ); std::memmove( temporary, data.raw_pointer(), original_size );
--- branches/KDE/3.5/kdepim/indexlib/memreference.h #445629:445630
@@ -34,6 +34,10 @@
#include "bitio.h"
+/**
+ * Works like a reference to a memory location
+ * which is written and read in our byte-format.
+ */
template <typename T>
struct memory_reference {
public:
@@ -57,6 +61,12 @@
data_( other.data_ )
{
}
+ /**
+ * This is a sneaky method to change pointers
+ */
+ void assign( const memory_reference& other ) {
+ data_ = other.data_;
+ }
private:
unsigned char* data_;
};
--- branches/KDE/3.5/kdepim/indexlib/quotes.cpp #445629:445630
@@ -47,6 +47,8 @@
}
void quotes::add( const char * str, const char* doc ) {
+ assert( str );
+ assert( doc );
try {
impl_.add( str, doc );
docs_.add( str );
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic