File: xsi_shared_memory_mapping_test.cpp

package info (click to toggle)
boost1.74 1.74.0%2Bds1-21
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 463,588 kB
  • sloc: cpp: 3,338,117; xml: 131,293; python: 33,088; ansic: 14,292; asm: 4,038; sh: 3,353; makefile: 1,193; perl: 1,036; yacc: 478; php: 212; ruby: 102; lisp: 24; sql: 13; csh: 6
file content (136 lines) | stat: -rw-r--r-- 3,992 bytes parent folder | download | duplicates (2)
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
//////////////////////////////////////////////////////////////////////////////
//
// (C) Copyright Ion Gaztanaga 2004-2012. 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/detail/workaround.hpp>

#if defined(BOOST_INTERPROCESS_XSI_SHARED_MEMORY_OBJECTS)

#include <fstream>
#include <iostream>
#include <boost/interprocess/xsi_shared_memory.hpp>
#include <boost/interprocess/mapped_region.hpp>
#include <boost/interprocess/file_mapping.hpp>
#include <boost/interprocess/detail/file_wrapper.hpp>
#include <string>
#include <iostream>
#include "get_process_id_name.hpp"

using namespace boost::interprocess;

void remove_shared_memory(const xsi_key &key)
{
   try{
      xsi_shared_memory xsi(open_only, key);
      xsi_shared_memory::remove(xsi.get_shmid());
   }
   catch(interprocess_exception &e){
      if(e.get_error_code() != not_found_error)
         throw;
   }
}

class xsi_shared_memory_remover
{
   public:
   xsi_shared_memory_remover(xsi_shared_memory &xsi_shm)
      : xsi_shm_(xsi_shm)
   {}

   ~xsi_shared_memory_remover()
   {  xsi_shared_memory::remove(xsi_shm_.get_shmid());  }
   private:
   xsi_shared_memory & xsi_shm_;
};

inline std::string get_filename()
{
   std::string ret (ipcdetail::get_temporary_path());
   ret += "/";
   ret += test::get_process_id_name();
   return ret;
}

int main ()
{
   std::string filename(get_filename());
   const char *names[2] = { filename.c_str(), 0 };

   file_mapping::remove(names[0]);
   {  ipcdetail::file_wrapper(create_only, names[0], read_write); }
   xsi_key key(names[0], 1);
   file_mapping::remove(names[0]);
   remove_shared_memory(key);

   unsigned int i;
   try{
      for(i = 0; i < sizeof(names)/sizeof(names[0]); ++i)
      {
         const std::size_t FileSize = 99999*2;
         //Create a file mapping
         xsi_shared_memory mapping (create_only, names[i] ? key : xsi_key(), FileSize);
         xsi_shared_memory_remover rem(mapping);
         try{
            {
               //Partial mapping should fail fox XSI shared memory
               bool thrown = false;
               try{
                  mapped_region region2(mapping, read_write, FileSize/2, FileSize - FileSize/2, 0);
               }
               catch(...){
                  thrown = true;
               }
               if(thrown == false){
                  return 1;
               }
               //Create a mapped region
               mapped_region region (mapping, read_write, 0, FileSize, 0);

               //Fill two regions with a pattern
               unsigned char *filler = static_cast<unsigned char*>(region.get_address());
               for(std::size_t i = 0; i < FileSize; ++i){
                  *filler++ = static_cast<unsigned char>(i);
               }
            }

            //Now check the pattern mapping a single read only mapped_region
            {
               //Create a single region, mapping all the file
               mapped_region region (mapping, read_only);

               //Check pattern
               unsigned char *pattern = static_cast<unsigned char*>(region.get_address());
               for(std::size_t i = 0; i < FileSize; ++i, ++pattern){
                  if(*pattern != static_cast<unsigned char>(i)){
                     return 1;
                  }
               }
            }
         }
         catch(std::exception &exc){
            std::cout << "Unhandled exception: " << exc.what() << std::endl;
            return 1;
         }
      }
   }
   catch(std::exception &exc){
      std::cout << "Unhandled exception: " << exc.what() << std::endl;
      return 1;
   }
   return 0;
}

#else

int main()
{
   return 0;
}

#endif   //BOOST_INTERPROCESS_XSI_SHARED_MEMORY_OBJECTS