named_allocation_test_template.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 498 行

HPP
498
字号
////////////////////////////////////////////////////////////////////////////////// (C) Copyright Ion Gaztanaga 2006. Distributed under the Boost// Software License, Version 1.0. (See accompanying file// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)//// See http://www.boost.org/libs/interprocess for documentation.////////////////////////////////////////////////////////////////////////////////#ifndef BOOST_INTERPROCESS_NAMED_ALLOCATION_TEST_TEMPLATE_HEADER#define BOOST_INTERPROCESS_NAMED_ALLOCATION_TEST_TEMPLATE_HEADER#include <boost/interprocess/detail/config_begin.hpp>#include <boost/interprocess/managed_shared_memory.hpp>#include <boost/interprocess/mem_algo/rbtree_best_fit.hpp>#include <boost/interprocess/sync/mutex_family.hpp>#include <boost/interprocess/streams/bufferstream.hpp>#include <vector>#include <iostream>#include <cstdio>#include <new>#include <utility>#include <iterator>#include <set>#include <string>#include "get_process_id_name.hpp"namespace boost { namespace interprocess { namespace test {namespace {   const wchar_t *get_prefix(wchar_t)   {  return L"prefix_name_"; }   const char *get_prefix(char)   {  return "prefix_name_"; }}//This test allocates until there is no more memory//and after that deallocates all in the same ordertemplate<class ManagedMemory>bool test_names_and_types(ManagedMemory &m){   typedef typename ManagedMemory::char_type char_type;   typedef std::char_traits<char_type> char_traits_type;   std::vector<char*> buffers;   const int BufferLen = 100;   char_type name[BufferLen];   basic_bufferstream<char_type> formatter(name, BufferLen);   for(int i = 0; true; ++i){      formatter.seekp(0);      formatter << get_prefix(char_type()) << i << std::ends;      char *ptr = m.template construct<char>(name, std::nothrow)(i);      if(!ptr)         break;      std::size_t namelen = char_traits_type::length(m.get_instance_name(ptr));      if(namelen != char_traits_type::length(name)){         return 1;      }      if(char_traits_type::compare(m.get_instance_name(ptr), name, namelen) != 0){         return 1;      }      if(m.template find<char>(name).first == 0)         return false;      if(m.get_instance_type(ptr) != named_type)         return false;      buffers.push_back(ptr);   }   if(m.get_num_named_objects() != buffers.size() || !m.check_sanity())      return false;   for(int j = 0, max = (int)buffers.size()      ;j < max      ;++j){      m.destroy_ptr(buffers[j]);   }   if(m.get_num_named_objects() != 0 || !m.check_sanity())      return false;   m.shrink_to_fit_indexes();   if(!m.all_memory_deallocated())      return false;   return true;}//This test allocates until there is no more memory//and after that deallocates all in the same ordertemplate<class ManagedMemory>bool test_named_iterators(ManagedMemory &m){   typedef typename ManagedMemory::char_type char_type;   typedef std::char_traits<char_type> char_traits_type;   std::vector<char*> buffers;   const int BufferLen = 100;   char_type name[BufferLen];   typedef std::basic_string<char_type> string_type;   std::set<string_type> names;   basic_bufferstream<char_type> formatter(name, BufferLen);   string_type aux_str;   for(int i = 0; true; ++i){      formatter.seekp(0);      formatter << get_prefix(char_type()) << i << std::ends;      char *ptr = m.template construct<char>(name, std::nothrow)(i);      if(!ptr)         break;      aux_str = name;      names.insert(aux_str);      buffers.push_back(ptr);   }   if(m.get_num_named_objects() != buffers.size() || !m.check_sanity())      return false;   typedef typename ManagedMemory::const_named_iterator const_named_iterator;   const_named_iterator named_beg = m.named_begin();   const_named_iterator named_end = m.named_end();   if(std::distance(named_beg, named_end) != (int)buffers.size()){      return 1;   }   for(; named_beg != named_end; ++named_beg){      const char_type *name = named_beg->name();      aux_str = name;      if(names.find(aux_str) == names.end()){         return 1;      }      if(aux_str.size() != named_beg->name_length()){         return 1;      }      const void *found_value = m.template find<char>(name).first;      if(found_value == 0)         return false;      if(found_value != named_beg->value())         return false;   }   for(int j = 0, max = (int)buffers.size()      ;j < max      ;++j){      m.destroy_ptr(buffers[j]);   }   if(m.get_num_named_objects() != 0 || !m.check_sanity())      return false;   m.shrink_to_fit_indexes();   if(!m.all_memory_deallocated())      return false;   return true;}//This test allocates until there is no more memory//and after that deallocates all in the same ordertemplate<class ManagedMemory>bool test_shrink_to_fit(ManagedMemory &m){   typedef typename ManagedMemory::char_type char_type;   typedef std::char_traits<char_type> char_traits_type;   std::vector<char*> buffers;   const int BufferLen = 100;   char_type name[BufferLen];   basic_bufferstream<char_type> formatter(name, BufferLen);   std::size_t free_memory_before = m.get_free_memory();   for(int i = 0; true; ++i){      formatter.seekp(0);      formatter << get_prefix(char_type()) << i << std::ends;      char *ptr = m.template construct<char>(name, std::nothrow)(i);      if(!ptr)         break;      buffers.push_back(ptr);   }   for(int j = 0, max = (int)buffers.size()      ;j < max      ;++j){      m.destroy_ptr(buffers[j]);   }   std::size_t free_memory_after = m.get_free_memory();   if(free_memory_before != free_memory_after){      m.shrink_to_fit_indexes();      if(free_memory_before != free_memory_after)         return false;   }   return true;}//This test allocates until there is no more memory//and after that deallocates all in the same ordertemplate<class ManagedMemory>bool test_direct_named_allocation_destruction(ManagedMemory &m){   typedef typename ManagedMemory::char_type char_type;   typedef std::char_traits<char_type> char_traits_type;   std::vector<char*> buffers;   const int BufferLen = 100;   char_type name[BufferLen];   basic_bufferstream<char_type> formatter(name, BufferLen);   for(int i = 0; true; ++i){      formatter.seekp(0);      formatter << get_prefix(char_type()) << i << std::ends;      char *ptr = m.template construct<char>(name, std::nothrow)(i);      if(!ptr)         break;      if(m.template find<char>(name).first == 0)         return false;      buffers.push_back(ptr);   }   if(m.get_num_named_objects() != buffers.size() || !m.check_sanity())      return false;   for(int j = 0, max = (int)buffers.size()      ;j < max      ;++j){      m.destroy_ptr(buffers[j]);   }   if(m.get_num_named_objects() != 0 || !m.check_sanity())      return false;   m.shrink_to_fit_indexes();   if(!m.all_memory_deallocated())      return false;   return true;}//This test allocates until there is no more memory//and after that deallocates all in the inverse ordertemplate<class ManagedMemory>bool test_named_allocation_inverse_destruction(ManagedMemory &m){   typedef typename ManagedMemory::char_type char_type;   typedef std::char_traits<char_type> char_traits_type;   std::vector<char*> buffers;   const int BufferLen = 100;   char_type name[BufferLen];   basic_bufferstream<char_type> formatter(name, BufferLen);   for(int i = 0; true; ++i){      formatter.seekp(0);      formatter << get_prefix(char_type()) << i << std::ends;      char *ptr = m.template construct<char>(name, std::nothrow)(i);      if(!ptr)         break;      buffers.push_back(ptr);   }   if(m.get_num_named_objects() != buffers.size() || !m.check_sanity())      return false;   for(int j = (int)buffers.size()      ;j--      ;){      m.destroy_ptr(buffers[j]);   }   if(m.get_num_named_objects() != 0 || !m.check_sanity())      return false;   m.shrink_to_fit_indexes();   if(!m.all_memory_deallocated())      return false;   return true;}//This test allocates until there is no more memory//and after that deallocates all following a patterntemplate<class ManagedMemory>bool test_named_allocation_mixed_destruction(ManagedMemory &m){   typedef typename ManagedMemory::char_type char_type;   typedef std::char_traits<char_type> char_traits_type;   std::vector<char*> buffers;   const int BufferLen = 100;   char_type name[BufferLen];   basic_bufferstream<char_type> formatter(name, BufferLen);   for(int i = 0; true; ++i){      formatter.seekp(0);      formatter << get_prefix(char_type()) << i << std::ends;      char *ptr = m.template construct<char>(name, std::nothrow)(i);      if(!ptr)         break;      buffers.push_back(ptr);   }   if(m.get_num_named_objects() != buffers.size() || !m.check_sanity())      return false;   for(int j = 0, max = (int)buffers.size()      ;j < max      ;++j){      int pos = (j%4)*((int)buffers.size())/4;      m.destroy_ptr(buffers[pos]);      buffers.erase(buffers.begin()+pos);   }   if(m.get_num_named_objects() != 0 || !m.check_sanity())      return false;   m.shrink_to_fit_indexes();   if(!m.all_memory_deallocated())      return false;   return true;}//This test allocates until there is no more memory//and after that deallocates all in the same ordertemplate<class ManagedMemory>bool test_inverse_named_allocation_destruction(ManagedMemory &m){   typedef typename ManagedMemory::char_type char_type;   typedef std::char_traits<char_type> char_traits_type;   std::vector<char*> buffers;   const int BufferLen = 100;   char_type name[BufferLen];   basic_bufferstream<char_type> formatter(name, BufferLen);   for(unsigned int i = 0; true; ++i){      formatter.seekp(0);      formatter << get_prefix(char_type()) << i << std::ends;      char *ptr = m.template construct<char>(name, std::nothrow)(i);      if(!ptr)         break;      buffers.push_back(ptr);   }   if(m.get_num_named_objects() != buffers.size() || !m.check_sanity())      return false;   for(unsigned int j = 0, max = (unsigned int)buffers.size()      ;j < max      ;++j){      m.destroy_ptr(buffers[j]);   }   if(m.get_num_named_objects() != 0 || !m.check_sanity())      return false;   m.shrink_to_fit_indexes();   if(!m.all_memory_deallocated())      return false;   return true;}///This function calls all teststemplate<class ManagedMemory>bool test_all_named_allocation(ManagedMemory &m){   std::cout << "Starting test_names_and_types. Class: "             << typeid(m).name() << std::endl;   if(!test_names_and_types(m)){      std::cout << "test_names_and_types failed. Class: "                << typeid(m).name() << std::endl;      return false;   }   std::cout << "Starting test_direct_named_allocation_destruction. Class: "             << typeid(m).name() << std::endl;   if(!test_direct_named_allocation_destruction(m)){      std::cout << "test_direct_named_allocation_destruction failed. Class: "                << typeid(m).name() << std::endl;      return false;   }   std::cout << "Starting test_named_allocation_inverse_destruction. Class: "             << typeid(m).name() << std::endl;   if(!test_named_allocation_inverse_destruction(m)){      std::cout << "test_named_allocation_inverse_destruction failed. Class: "                << typeid(m).name() << std::endl;      return false;   }   std::cout << "Starting test_named_allocation_mixed_destruction. Class: "             << typeid(m).name() << std::endl;   if(!test_named_allocation_mixed_destruction(m)){      std::cout << "test_named_allocation_mixed_destruction failed. Class: "                << typeid(m).name() << std::endl;      return false;   }   std::cout << "Starting test_inverse_named_allocation_destruction. Class: "             << typeid(m).name() << std::endl;   if(!test_inverse_named_allocation_destruction(m)){      std::cout << "test_inverse_named_allocation_destruction failed. Class: "                << typeid(m).name() << std::endl;      return false;   }   if(!test_named_iterators(m)){      std::cout << "test_named_iterators failed. Class: "                << typeid(m).name() << std::endl;      return false;   }   return true;}//This function calls all teststemplate<template <class IndexConfig> class Index>bool test_named_allocation(){   using namespace boost::interprocess;   const int memsize = 163840;   const char *const shMemName = test::get_process_id_name();   try   {      //A shared memory with rbtree best fit algorithm      typedef basic_managed_shared_memory         <char         ,rbtree_best_fit<mutex_family>         ,Index         > my_managed_shared_memory;      //Create shared memory      shared_memory_object::remove(shMemName);      my_managed_shared_memory segment(create_only, shMemName, memsize);      //Now take the segment manager and launch memory test      if(!test::test_all_named_allocation(*segment.get_segment_manager())){         return false;      }   }   catch(...){      shared_memory_object::remove(shMemName);      throw;   }   shared_memory_object::remove(shMemName);   //Now test it with wchar_t   try   {      //A shared memory with simple sequential fit algorithm      typedef basic_managed_shared_memory         <wchar_t         ,rbtree_best_fit<mutex_family>         ,Index         > my_managed_shared_memory;      //Create shared memory      shared_memory_object::remove(shMemName);      my_managed_shared_memory segment(create_only, shMemName, memsize);      //Now take the segment manager and launch memory test      if(!test::test_all_named_allocation(*segment.get_segment_manager())){         return false;      }   }   catch(...){      shared_memory_object::remove(shMemName);      throw;   }   shared_memory_object::remove(shMemName);   return true;}}}}   //namespace boost { namespace interprocess { namespace test {#include <boost/interprocess/detail/config_end.hpp>#endif   //BOOST_INTERPROCESS_NAMED_ALLOCATION_TEST_TEMPLATE_HEADER

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?