Guest User

testPushBackVector.cc

a guest
Jul 19th, 2012
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.07 KB | None | 0 0
  1. /**
  2.  ********************************************************************************
  3.  *  @file   testPushBackVector.cc
  4.  *  @brief  A brief description of the content of the file.
  5.  ********************************************************************************
  6.  *
  7.  *  A potentially lengthy description of the content of the file.
  8.  *  You can use list :
  9.  *  \li first elem,
  10.  *  \li second elen,
  11.  *  \li last elem.\n
  12.  *
  13.  *  You can use HTML tags <b>bold</b>, <i>italic</i>
  14.  *  And doxygen tags ex :
  15.  *  \code int resultI = anIntI + anotherIntI \encode
  16.  *  
  17.  *  @date   Jul 18, 2012
  18.  *  @author gg01347
  19.  *
  20.  ********************************************************************************
  21.  **/
  22.  
  23. #include <boost/interprocess/shared_memory_object.hpp>
  24. #include <boost/interprocess/managed_shared_memory.hpp>
  25. #include <boost/interprocess/offset_ptr.hpp>
  26. #include <boost/interprocess/smart_ptr/shared_ptr.hpp>
  27. #include <boost/interprocess/smart_ptr/weak_ptr.hpp>
  28. #include <boost/interprocess/allocators/allocator.hpp>
  29. #include <boost/interprocess/sync/interprocess_upgradable_mutex.hpp>
  30. #include <boost/interprocess/containers/map.hpp>
  31. #include <boost/interprocess/containers/vector.hpp>
  32. #include <boost/multi_index_container.hpp>
  33. #include <boost/multi_index/ordered_index.hpp>
  34. #include <boost/multi_index/hashed_index.hpp>
  35. #include <boost/multi_index/member.hpp>
  36. #include <boost/multi_index/mem_fun.hpp>
  37.  
  38. using boost::interprocess::managed_shared_memory;
  39. using boost::interprocess::allocator;
  40. using boost::interprocess::managed_shared_ptr;
  41. using boost::interprocess::managed_weak_ptr;
  42. using boost::interprocess::anonymous_instance;
  43. using boost::interprocess::make_managed_shared_ptr;
  44.  
  45. typedef managed_shared_memory::segment_manager  segment_manager_t;
  46. typedef allocator<void, segment_manager_t> void_allocator;
  47. typedef long long  idType;
  48. typedef unsigned long long  releaseType;
  49.  
  50. // Define a template SharableDataTypes
  51. template<class T, class Key=int> struct SharableDataTypes {
  52.     typedef typename managed_shared_ptr<T, managed_shared_memory>::type         SharedPtrType;
  53.     typedef typename managed_weak_ptr  <T, managed_shared_memory>::type         WeakPtrType;
  54.  
  55.     typedef allocator<WeakPtrType, segment_manager_t>                           WeakPtrAllocatorType;
  56.  
  57.     typedef boost::interprocess::vector<WeakPtrType , WeakPtrAllocatorType>     WeakPtrVectorType;
  58. };
  59.  
  60. class Data{
  61. private:
  62.     idType id;
  63.     releaseType creationRelease;
  64. public:
  65.     Data(idType i, releaseType r){ id=i; creationRelease=r;}
  66.     const idType getObjectId() const {return id;}
  67.     const releaseType getCreationRelease() const {return creationRelease;}
  68.  
  69.     // Define type of container storing this kind of data
  70.     typedef boost::multi_index_container<
  71.             SharableDataTypes<Data>::SharedPtrType,
  72.             boost::multi_index::indexed_by<
  73.             boost::multi_index::hashed_unique<BOOST_MULTI_INDEX_CONST_MEM_FUN(Data, const idType, getObjectId)>
  74.     ,boost::multi_index::ordered_non_unique< boost::multi_index::tag<releaseType>, BOOST_MULTI_INDEX_CONST_MEM_FUN(Data, const releaseType,  getCreationRelease)>
  75.  
  76.     >,
  77.     boost::interprocess::allocator<SharableDataTypes<Data>::SharedPtrType, segment_manager_t>
  78.     > DataContainerType;
  79.  
  80. };
  81.  
  82. class DataVectorContainer{
  83. private:
  84.     SharableDataTypes<Data>::WeakPtrVectorType dataWPVector;
  85. public:
  86.     DataVectorContainer(void_allocator * alloc) : dataWPVector(*alloc){};
  87.  
  88.     void addData (const SharableDataTypes<Data>::SharedPtrType & PData){
  89.  
  90.         unsigned int sizeBefore = dataWPVector.size();
  91.         unsigned int capacityBefore = dataWPVector.capacity();
  92.         dataWPVector.push_back(PData);
  93. //      std::cerr << "adddataWPVectorElem called with PData.id =" << PData->getObjectId() << " from thread " <<  getpid() << ":" << pthread_self() << std::endl;
  94.  
  95.         unsigned int sizeAfter = dataWPVector.size();
  96.         unsigned int capacityAfter = dataWPVector.capacity();
  97.  
  98.         if (dataWPVector.rbegin()->lock()->getObjectId() != PData->getObjectId()){
  99.             std::cerr << "After pushback in dataWPVector vector last elem Id=" <<  dataWPVector.rbegin()->lock()->getObjectId() << " added cable Id =" << PData->getObjectId() << std::endl;
  100.             std::cerr << "--> sizeBefore=" << sizeBefore  << ", capacityBefore=" << capacityBefore << ", sizeAfter=" << sizeAfter<< ", capacityAfter=" << capacityAfter << std::endl;
  101.             printData();
  102.             exit(1);
  103.         }else{
  104.  
  105.             if (capacityBefore != capacityAfter){
  106.                 std::cerr << "After pushback in dataWPVector capacity changed from  " << capacityBefore << " to " << capacityAfter << " without any damage." << std::endl;
  107.                 // printData();
  108.             }
  109.         }
  110.     }
  111.  
  112.     void printData(){
  113.         std::ostringstream oss;
  114.         oss << "dataWPVector[" << std::endl;
  115.         for (SharableDataTypes<Data>::WeakPtrVectorType::iterator cableIt = dataWPVector.begin(); cableIt != dataWPVector.end(); ++cableIt){
  116.             oss << cableIt->lock()->getObjectId() << ", ";
  117.         }
  118.         oss << "]" << std::endl;
  119.         std::cerr << oss.str();
  120.     }
  121. };
  122.  
  123. int main(int argc, char **argv) {
  124.     boost::interprocess::shared_memory_object::remove("testPushBackVector");
  125.     managed_shared_memory * managedSharedMemorySegment = new managed_shared_memory(boost::interprocess::open_or_create, "testPushBackVector", 1024*1024*10);
  126.     void_allocator * managedSharedMemoryAllocator = new void_allocator(managedSharedMemorySegment->get_segment_manager());
  127.  
  128.     Data::DataContainerType * dataContainer = managedSharedMemorySegment->construct<Data::DataContainerType >
  129.     (anonymous_instance)(
  130.             Data::DataContainerType::ctor_args_list(),
  131.             Data::DataContainerType::allocator_type(managedSharedMemorySegment->get_segment_manager())
  132.     );
  133.  
  134.     SharableDataTypes<DataVectorContainer>::SharedPtrType myDataVectorContainer = make_managed_shared_ptr(managedSharedMemorySegment->
  135.             construct<DataVectorContainer>(anonymous_instance)(managedSharedMemoryAllocator), *managedSharedMemorySegment);
  136.  
  137.  
  138.     for (unsigned int i = 1; i <= 10000; ++i){
  139.         SharableDataTypes<Data>::SharedPtrType myData = make_managed_shared_ptr(managedSharedMemorySegment->
  140.                 construct<Data>(anonymous_instance)(2*i, i), *managedSharedMemorySegment);
  141.  
  142.         dataContainer->insert(myData);
  143.         myDataVectorContainer->addData(myData);
  144.     }
  145.  
  146. //  myDataVectorContainer->printData();
  147.     return 0;
  148. }
Advertisement
Add Comment
Please, Sign In to add comment