1 //////////////////////////////////////////////////////////////////////////////
2 //
3 // (C) Copyright Ion Gaztanaga 2004-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/config.hpp>
12 
13 #ifdef BOOST_WINDOWS
14 
15 #include <fstream>
16 #include <iostream>
17 #include <boost/interprocess/windows_shared_memory.hpp>
18 #include <boost/interprocess/mapped_region.hpp>
19 #include <string>
20 #include "get_process_id_name.hpp"
21 
22 using namespace boost::interprocess;
23 
main()24 int main ()
25 {
26    try{
27       const char *names[2] = { test::get_process_id_name(), 0 };
28       for(unsigned int i_name = 0; i_name < sizeof(names)/sizeof(names[0]); ++i_name)
29       {
30          const std::size_t FileSize = 99999*2;
31          //Create a file mapping
32          windows_shared_memory mapping
33             (create_only, names[i_name], read_write, FileSize);
34          if(static_cast<std::size_t>(mapping.get_size()) < FileSize)
35             return 1;
36          {
37 
38             //Create two mapped regions, one half of the file each
39             mapped_region region (mapping
40                                  ,read_write
41                                  ,0
42                                  ,FileSize/2
43                                  ,0);
44 
45             mapped_region region2(mapping
46                                  ,read_write
47                                  ,FileSize/2
48                                  ,FileSize - FileSize/2
49                                  ,0);
50 
51             //Fill two regions with a pattern
52             unsigned char *filler = static_cast<unsigned char*>(region.get_address());
53             for(std::size_t i = 0
54                ;i < FileSize/2
55                ;++i){
56                *filler++ = static_cast<unsigned char>(i);
57             }
58 
59             filler = static_cast<unsigned char*>(region2.get_address());
60             for(std::size_t i = FileSize/2
61                ;i < FileSize
62                ;++i){
63                *filler++ = static_cast<unsigned char>(i);
64             }
65             if(!region.flush(0, 0, false)){
66                return 1;
67             }
68 
69             if(!region2.flush(0, 0, true)){
70                return 1;
71             }
72          }
73 
74          //See if the pattern is correct in the file using two mapped regions
75          {
76             mapped_region region (mapping, read_only, 0, FileSize/2, 0);
77             mapped_region region2(mapping, read_only, FileSize/2, FileSize - FileSize/2, 0);
78 
79             unsigned char *checker = static_cast<unsigned char*>(region.get_address());
80             //Check pattern
81             for(std::size_t i = 0
82                ;i < FileSize/2
83                ;++i){
84                if(*checker++ != static_cast<unsigned char>(i)){
85                   return 1;
86                }
87             }
88 
89             //Check second half
90             checker = static_cast<unsigned char *>(region2.get_address());
91 
92             //Check pattern
93             for(std::size_t i = FileSize/2
94                ;i < FileSize
95                ;++i){
96                if(*checker++ != static_cast<unsigned char>(i)){
97                   return 1;
98                }
99             }
100          }
101 
102          //Now check the pattern mapping a single read only mapped_region
103          {
104             //Create a single regions, mapping all the file
105             mapped_region region (mapping, read_only);
106 
107             //Check pattern
108             unsigned char *pattern = static_cast<unsigned char*>(region.get_address());
109             for(std::size_t i = 0
110                ;i < FileSize
111                ;++i, ++pattern){
112                if(*pattern != static_cast<unsigned char>(i)){
113                   return 1;
114                }
115             }
116          }
117       }
118    }
119    catch(std::exception &exc){
120       //shared_memory_object::remove(test::get_process_id_name());
121       std::cout << "Unhandled exception: " << exc.what() << std::endl;
122       return 1;
123    }
124 
125    return 0;
126 }
127 
128 #else
129 
main()130 int main()
131 {
132    return 0;
133 }
134 
135 #endif
136 
137