summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/pool/test/test_bug_2696.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/pool/test/test_bug_2696.cpp')
-rw-r--r--src/boost/libs/pool/test/test_bug_2696.cpp66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/boost/libs/pool/test/test_bug_2696.cpp b/src/boost/libs/pool/test/test_bug_2696.cpp
new file mode 100644
index 00000000..9b72b3d6
--- /dev/null
+++ b/src/boost/libs/pool/test/test_bug_2696.cpp
@@ -0,0 +1,66 @@
+/* Copyright (C) 2011 John Maddock
+*
+* Use, modification and distribution is subject to the
+* Boost Software License, Version 1.0. (See accompanying
+* file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+// Test of bug #2696 (https://svn.boost.org/trac/boost/ticket/2696)
+
+#include <boost/pool/pool.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+struct limited_allocator_new_delete
+{
+ typedef std::size_t size_type;
+ typedef std::ptrdiff_t difference_type;
+
+ static char * malloc BOOST_PREVENT_MACRO_SUBSTITUTION(const size_type bytes)
+ {
+#ifndef BOOST_POOL_VALGRIND
+ static const unsigned max_size = sizeof(void*) * 40 + boost::integer::static_lcm<sizeof(size_type), sizeof(void *)>::value + sizeof(size_type);
+#else
+ static const unsigned max_size = sizeof(void*) * 40;
+#endif
+ if(bytes > max_size)
+ return 0;
+ return new (std::nothrow) char[bytes];
+ }
+ static void free BOOST_PREVENT_MACRO_SUBSTITUTION(char * const block)
+ {
+ delete [] block;
+ }
+};
+
+int main()
+{
+ static const unsigned alloc_size = sizeof(void*);
+ boost::pool<limited_allocator_new_delete> p1(alloc_size, 10, 40);
+ for(int i = 1; i <= 40; ++i)
+ BOOST_TEST((p1.ordered_malloc)(i));
+ BOOST_TEST(p1.ordered_malloc(42) == 0);
+ //
+ // If the largest block is 40, and we start with 10, we get 10+20+40 elements before
+ // we actually run out of memory:
+ //
+ boost::pool<limited_allocator_new_delete> p2(alloc_size, 10, 40);
+ for(int i = 1; i <= 70; ++i)
+ BOOST_TEST((p2.malloc)());
+ boost::pool<limited_allocator_new_delete> p2b(alloc_size, 10, 40);
+ for(int i = 1; i <= 100; ++i)
+ BOOST_TEST((p2b.ordered_malloc)());
+ //
+ // Try again with no explicit upper limit:
+ //
+ boost::pool<limited_allocator_new_delete> p3(alloc_size);
+ for(int i = 1; i <= 40; ++i)
+ BOOST_TEST((p3.ordered_malloc)(i));
+ BOOST_TEST(p3.ordered_malloc(42) == 0);
+ boost::pool<limited_allocator_new_delete> p4(alloc_size, 10);
+ for(int i = 1; i <= 100; ++i)
+ BOOST_TEST((p4.ordered_malloc)());
+ boost::pool<limited_allocator_new_delete> p5(alloc_size, 10);
+ for(int i = 1; i <= 100; ++i)
+ BOOST_TEST((p5.malloc)());
+ return boost::report_errors();
+}