• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //////////////////////////////////////////////////////////////////////////////
2 //
3 // (C) Copyright Ion Gaztanaga 2007-2012. Distributed under the Boost
4 // Software License, Version 1.0. (See accompanying file
5 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 //
7 // See http://www.boost.org/libs/interprocess for documentation.
8 //
9 //////////////////////////////////////////////////////////////////////////////
10 
11 #include <boost/interprocess/managed_shared_memory.hpp>
12 #include <boost/interprocess/allocators/allocator.hpp>
13 #include "get_process_id_name.hpp"
14 
15 //<-
16 //Shield against external warnings
17 #include <boost/interprocess/detail/config_external_begin.hpp>
18 //->
19 
20 #include <boost/unordered_map.hpp>
21 #include <boost/unordered_set.hpp>
22 
23 //<-
24 #include <boost/interprocess/detail/config_external_end.hpp>
25 //->
26 
27 #include <functional> //std::equal_to
28 #include <boost/functional/hash.hpp> //boost::hash
29 
30 namespace bip = boost::interprocess;
31 
32 typedef bip::allocator<int, bip::managed_shared_memory::segment_manager> ShmemAllocator;
33 typedef boost::unordered_set<int, boost::hash<int>, std::equal_to<int>, ShmemAllocator> MyUnorderedSet;
34 typedef boost::unordered_multiset<int, boost::hash<int>, std::equal_to<int>, ShmemAllocator> MyUnorderedMultiSet;
35 
main()36 int main()
37 {
38    //Remove any other old shared memory from the system
39    bip::shared_memory_object::remove(bip::test::get_process_id_name());
40    try {
41       bip::managed_shared_memory shm(bip::create_only, bip::test::get_process_id_name(), 65536);
42 
43       //Elements to be inserted in unordered containers
44       const int elements[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
45       const int elements_size = sizeof(elements)/sizeof(elements[0]);
46 
47       MyUnorderedSet *myset  =
48          shm.construct<MyUnorderedSet>(bip::anonymous_instance)
49             ( elements_size
50             , MyUnorderedSet::hasher()
51             , MyUnorderedSet::key_equal()
52             , shm.get_allocator<int>());
53       MyUnorderedMultiSet *mymset =
54          shm.construct<MyUnorderedMultiSet>(bip::anonymous_instance)
55             ( elements_size
56             , MyUnorderedSet::hasher()
57             , MyUnorderedSet::key_equal()
58             , shm.get_allocator<int>());
59 
60       //Insert elements and check sizes
61       myset->insert((&elements[0]), (&elements[elements_size]));
62       myset->insert((&elements[0]), (&elements[elements_size]));
63       mymset->insert((&elements[0]), (&elements[elements_size]));
64       mymset->insert((&elements[0]), (&elements[elements_size]));
65 
66       if(myset->size() != (unsigned int)elements_size)
67          return 1;
68       if(mymset->size() != (unsigned int)elements_size*2)
69          return 1;
70 
71       //Destroy elements and check sizes
72       myset->clear();
73       mymset->clear();
74 
75       if(!myset->empty())
76          return 1;
77       if(!mymset->empty())
78          return 1;
79 
80       //Destroy elements and check if memory has been deallocated
81       shm.destroy_ptr(myset);
82       shm.destroy_ptr(mymset);
83 
84       shm.shrink_to_fit_indexes();
85       if(!shm.all_memory_deallocated())
86          return 1;
87 
88    }
89    catch(...){
90       //Remove shared memory from the system
91       bip::shared_memory_object::remove(bip::test::get_process_id_name());
92       throw;
93    }
94    //Remove shared memory from the system
95    bip::shared_memory_object::remove(bip::test::get_process_id_name());
96    return 0;
97 }
98