[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