• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //////////////////////////////////////////////////////////////////////////////
2 //
3 // (C) Copyright Ion Gaztanaga 2006-2012.
4 // Distributed under the Boost Software License, Version 1.0.
5 // (See accompanying file LICENSE_1_0.txt or copy at
6 // http://www.boost.org/LICENSE_1_0.txt)
7 //
8 // See http://www.boost.org/libs/interprocess for documentation.
9 //
10 //////////////////////////////////////////////////////////////////////////////
11 #include <boost/interprocess/detail/config_begin.hpp>
12 #include <boost/interprocess/detail/workaround.hpp>
13 
14 //[doc_shared_ptr_explicit
15 #include <boost/interprocess/managed_shared_memory.hpp>
16 #include <boost/interprocess/smart_ptr/shared_ptr.hpp>
17 #include <boost/interprocess/allocators/allocator.hpp>
18 #include <boost/interprocess/smart_ptr/deleter.hpp>
19 #include <cassert>
20 //<-
21 #include "../test/get_process_id_name.hpp"
22 //->
23 
24 using namespace boost::interprocess;
25 
26 //This is type of the object we want to share
27 class MyType
28 {};
29 
30 typedef managed_shared_memory::segment_manager segment_manager_type;
31 typedef allocator<void, segment_manager_type>  void_allocator_type;
32 typedef deleter<MyType, segment_manager_type>  deleter_type;
33 typedef shared_ptr<MyType, void_allocator_type, deleter_type> my_shared_ptr;
34 
main()35 int main ()
36 {
37    //Remove shared memory on construction and destruction
38    struct shm_remove
39    {
40    //<-
41    #if 1
42       shm_remove() { shared_memory_object::remove(test::get_process_id_name()); }
43       ~shm_remove(){ shared_memory_object::remove(test::get_process_id_name()); }
44    #else
45    //->
46       shm_remove() { shared_memory_object::remove("MySharedMemory"); }
47       ~shm_remove(){ shared_memory_object::remove("MySharedMemory"); }
48    //<-
49    #endif
50    //->
51    } remover;
52    //<-
53    (void)remover;
54    //->
55 
56    //<-
57    #if 1
58    managed_shared_memory segment(create_only, test::get_process_id_name(), 4096);
59    #else
60    //->
61    managed_shared_memory segment(create_only, "MySharedMemory", 4096);
62    //<-
63    #endif
64    //->
65 
66    //Create a shared pointer in shared memory
67    //pointing to a newly created object in the segment
68    my_shared_ptr &shared_ptr_instance =
69       *segment.construct<my_shared_ptr>("shared ptr")
70          //Arguments to construct the shared pointer
71          ( segment.construct<MyType>("object to share")()      //object to own
72          , void_allocator_type(segment.get_segment_manager())  //allocator
73          , deleter_type(segment.get_segment_manager())         //deleter
74          );
75    assert(shared_ptr_instance.use_count() == 1);
76 
77    //Destroy "shared ptr". "object to share" will be automatically destroyed
78    segment.destroy_ptr(&shared_ptr_instance);
79 
80    return 0;
81 }
82 //]
83 #include <boost/interprocess/detail/config_end.hpp>
84