From a48d0c7c9938b8eeb758c2692ecaad8cb86d5ef5 Mon Sep 17 00:00:00 2001 From: Markus Blatt <mblatt@dune-project.org> Date: Fri, 29 Apr 2005 13:03:14 +0000 Subject: [PATCH] Added test for pool allocator. [[Imported from SVN: r1988]] --- common/test/.gitignore | 1 + common/test/Makefile.am | 5 +- common/test/poolallocatortest.cc | 143 +++++++++++++++++++++++++++++++ 3 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 common/test/poolallocatortest.cc diff --git a/common/test/.gitignore b/common/test/.gitignore index bccf541a3..e0bd3a4f2 100644 --- a/common/test/.gitignore +++ b/common/test/.gitignore @@ -12,6 +12,7 @@ sllisttest tuplestest settest fmatrixtest +poolallocatertest *.gcda *.gcno gmon.out \ No newline at end of file diff --git a/common/test/Makefile.am b/common/test/Makefile.am index 7cfdb9532..eba4f66b7 100644 --- a/common/test/Makefile.am +++ b/common/test/Makefile.am @@ -1,7 +1,8 @@ # $Id$ TESTPROGS = parsetest test-stack arraylisttest smartpointertest \ - sllisttest iteratorfacadetest tuplestest fmatrixtest + sllisttest iteratorfacadetest tuplestest fmatrixtest \ + poolallocatortest # which tests to run TESTS = $(TESTPROGS) @@ -31,3 +32,5 @@ iteratorfacadetest_SOURCES = iteratorfacadetest.cc iteratorfacadetest.hh \ iteratortest.hh fmatrixtest_SOURCES = fmatrixtest.cc + +poolallocatortest_SOURCES = poolallocatortest.cc diff --git a/common/test/poolallocatortest.cc b/common/test/poolallocatortest.cc new file mode 100644 index 000000000..915f9451f --- /dev/null +++ b/common/test/poolallocatortest.cc @@ -0,0 +1,143 @@ +// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- +// vi: set et ts=4 sw=2 sts=2: +#include <dune/common/poolallocator.hh> +#include <dune/common/alignment.hh> +#include <dune/common/fmatrix.hh> + +using namespace Dune; + +struct UnAligned +{ + char t; + char s; + char k; +}; + + + +template<std::size_t size, typename T> +int testPool() +{ + int ret=0; + + Pool<T,size> pool; + + int elements = Pool<T,size>::elements; + //int poolSize = Pool<T,size>::size; + //int chunkSize = Pool<T,size>::chunkSize; + //int alignedSize = Pool<T,size>::alignedSize; + + char** fields= new char*[10]; + unsigned long* oelements = new unsigned long[10*elements]; + + typedef typename Pool<T,size>::Chunk Chunk; + + //Fill 10 chunks + for(int chunk=0; chunk < 10; ++chunk) { + //std::cout<< std::endl<<"Chunk "<<chunk<<" "; + //fields[chunk] = new char[333]; + unsigned long element = reinterpret_cast<unsigned long>(pool.allocate()); + void* celement = reinterpret_cast<void*>(element); + //std::cout << element<<" "<< celement<<", "<<std::endl; + + Chunk* currentChunk = pool.chunks_; + + assert(element==reinterpret_cast<unsigned long>(currentChunk->memory_)); + unsigned long end = reinterpret_cast<unsigned long>(currentChunk->chunk_)+Pool<T,size>::chunkSize; + + if(element< reinterpret_cast<unsigned long>(currentChunk->chunk_)) + { + std::cerr <<" buffer overflow during first alloc: "<<reinterpret_cast<unsigned long>(currentChunk->chunk_) + <<">"<<element<<"+"<<sizeof(T)<<std::endl; + return ++ret; + } + + if(end < element + sizeof(T)) { + std::cerr <<" buffer overflow during first alloc: "<<end<<"<"<<element<<"+"<<sizeof(T)<<std::endl; + return ++ret; + } + + oelements[chunk*elements]=element; + + for(int i=1; i < elements; i++) + { + element = reinterpret_cast<unsigned long>(pool.allocate()); + celement = reinterpret_cast<void*>(element); + + // std::cout << element<<" "<<celement<<", "<<std::endl; + + if(element< reinterpret_cast<unsigned long>(currentChunk->chunk_)) { + std::cerr <<" buffer overflow during first alloc: "<<reinterpret_cast<unsigned long>(currentChunk->chunk_) + <<">"<<element<<"+"<<sizeof(T)<<std::endl; + return ++ret; + } + + if(end < element + sizeof(T)) { + std::cerr <<" buffer overflow during "<<i<<" alloc: "<<end<<"<"<<element+sizeof(T)<<std::endl; + return ++ret; + + } + + if(oelements[chunk*elements+i-1]+sizeof(T)>element) { + std::cerr<<"allocated elements overlap!"<<std::endl; + return ++ret; + } + + oelements[chunk*elements+i]=element; + } + } + + //for(int chunk=0; chunk < 10; ++chunk) + //delete[] fields[chunk]; + + delete[] fields; + delete[] oelements; + + return ret; +} + +template<typename T> +int testPool() +{ + const std::size_t size = sizeof(T)>=2 ? sizeof(T)-2 : 0; + + int ret=0; + + std::cout<<"Checking "<<typeid(T).name()<<" sizeof="<<sizeof(T)<<" with size "<< size<< + " alignment="<<AlignmentOf<T>::value<<std::endl; + + std::cout<<"size="<<0<<std::endl; + ret += testPool<0,T>(); + std::cout<<"size="<<size<<std::endl; + ret += testPool<size,T>(); + std::cout<<"size="<<5*size<<std::endl; + ret += testPool<5*size,T>(); + std::cout<<"size="<<11*size<<std::endl; + ret += testPool<11*size,T>(); + std::cout<<"size="<<size<<std::endl; + ret += testPool<33*size,T>(); + std::cout<<"size="<<33*size<<std::endl; + + + + return ret; +} +int main(int argc, char **argv) +{ + int ret=0; + /* + ret += testPool<int>(); + + ret+= testPool<double>(); + + ret+= testPool<char>(); + + ret += testPool<Dune::FieldMatrix<double,10,10> >(); + */ + + std::cout<<AlignmentOf<UnAligned>::value<<" "<<sizeof(UnAligned)<<std::endl; + + ret += testPool<UnAligned>(); + + return ret; +} -- GitLab