1 //  Copyright (C) 2011 Tim Blechmann
2 //
3 //  Distributed under the Boost Software License, Version 1.0. (See
4 //  accompanying file LICENSE_1_0.txt or copy at
5 //  http://www.boost.org/LICENSE_1_0.txt)
6 
7 #include <cstdlib> //std::system
8 #include <sstream>
9 
10 #include <boost/interprocess/managed_shared_memory.hpp>
11 #include <boost/lockfree/stack.hpp>
12 #include <boost/thread/thread.hpp>
13 
14 using namespace boost::interprocess;
15 typedef allocator<int, managed_shared_memory::segment_manager>  ShmemAllocator;
16 typedef boost::lockfree::stack<int,
17                                boost::lockfree::allocator<ShmemAllocator>,
18                                boost::lockfree::capacity<2048>
19                               > stack;
20 
main(int argc,char * argv[])21 int main (int argc, char *argv[])
22 {
23    if(argc == 1){
24         struct shm_remove
25         {
26             shm_remove() {  shared_memory_object::remove("MySharedMemory"); }
27             ~shm_remove(){  shared_memory_object::remove("MySharedMemory"); }
28         } remover;
29 
30         managed_shared_memory segment(create_only, "MySharedMemory", 65536);
31         ShmemAllocator alloc_inst (segment.get_segment_manager());
32 
33         stack * queue = segment.construct<stack>("stack")(alloc_inst);
34         for (int i = 0; i != 1024; ++i)
35             queue->push(i);
36 
37         std::string s(argv[0]); s += " child ";
38         if(0 != std::system(s.c_str()))
39             return 1;
40 
41         while (!queue->empty())
42             boost::thread::yield();
43         return 0;
44     } else {
45         managed_shared_memory segment(open_only, "MySharedMemory");
46         stack * queue = segment.find<stack>("stack").first;
47 
48         int from_queue;
49         for (int i = 0; i != 1024; ++i) {
50             bool success = queue->pop(from_queue);
51             assert (success);
52             assert (from_queue == 1023 - i);
53         }
54         segment.destroy<stack>("stack");
55     }
56     return 0;
57 }
58