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