File: multiprocess_managed_shared_memory_test.cpp

package info (click to toggle)
boost1.83 1.83.0-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 545,632 kB
  • sloc: cpp: 3,857,086; xml: 125,552; ansic: 34,414; python: 25,887; asm: 5,276; sh: 4,799; ada: 1,681; makefile: 1,629; perl: 1,212; pascal: 1,139; sql: 810; yacc: 478; ruby: 102; lisp: 24; csh: 6
file content (114 lines) | stat: -rw-r--r-- 3,523 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
//////////////////////////////////////////////////////////////////////////////
//
// (C) Copyright Ion Gaztanaga 2021-2021. Distributed under the Boost
// Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
// See http://www.boost.org/libs/interprocess for documentation.
//
//////////////////////////////////////////////////////////////////////////////

#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/sync/interprocess_semaphore.hpp>
#include <boost/interprocess/containers/list.hpp>
#include <cstring>
#include <cstdlib>
#include <string>
#include <iostream>
#include <cstdlib>
#include "../test/get_process_id_name.hpp"

using namespace boost::interprocess;

//Remove shared memory on construction and destruction
struct shm_remove
{
   shm_remove() { shared_memory_object::remove(test::get_process_id_name()); }
   ~shm_remove(){ shared_memory_object::remove(test::get_process_id_name()); }
};

const std::size_t MemSize = 64u*1024u;

typedef list<int, allocator<int, managed_shared_memory::segment_manager> >
   MyList;

int main(int argc, char *argv[])
{
   std::string p_or_c = argc == 1 ? "parent" : "child";
   BOOST_TRY {
      if(argc == 1){  //Parent process
         shm_remove remover; (void)remover;
         shared_memory_object::remove(test::get_process_id_name());
         shared_memory_object::remove(test::get_process_id_name());

         //Create a shared memory object.
         managed_shared_memory shm (create_only, test::get_process_id_name(), MemSize);

         interprocess_semaphore *my_sem = shm.construct<interprocess_semaphore>("MySem")(0U);

         //Launch child process
         std::string s;
         #ifdef BOOST_INTERPROCESS_WINDOWS
         s += "START /B ";
         #endif
         s += argv[0];
         s += " child ";
         s += test::get_process_id_name();
         #ifndef BOOST_INTERPROCESS_WINDOWS
         s += " &";
         #endif
         if(0 != std::system(s.c_str()))
            return 1;

         //Wait for the other process
         my_sem->wait();

         for (unsigned i = 0; i != 10000; ++i) {
            MyList *mylist = shm.construct<MyList>("MyList", std::nothrow)
                                 (shm.get_segment_manager());
            if(mylist){
               shm.destroy_ptr(mylist);
            }
         }

         //Wait for the other process
         my_sem->wait();
      }
      else{
         managed_shared_memory shm (open_only, argv[2]);

         interprocess_semaphore *my_sem = shm.find<interprocess_semaphore>("MySem").first;
         if (!my_sem)
            return 1;

         my_sem->post();

         for (unsigned i = 0; i != 10000; ++i) {
            MyList *mylist = shm.construct<MyList>("MyList", std::nothrow)
                                 (shm.get_segment_manager());

            if(mylist){
               shm.destroy_ptr(mylist);
            }
         }

         my_sem->post();
      }
   }
   BOOST_CATCH(interprocess_exception &e){
      std::cerr << p_or_c << " -> interprocess_exception::what(): " << e.what()
                << " native error: " << e.get_native_error()
                << " error code: " << e.get_error_code() << '\n';
      return 2;
   }
   BOOST_CATCH(std::exception &e){
      std::cerr << p_or_c << " -> std::exception::what(): " << e.what() << '\n';
      return 3;
   }
   BOOST_CATCH_END

   std::cerr << p_or_c << " -> Normal termination\n";

   return 0;
}