summaryrefslogtreecommitdiff
path: root/libs/interprocess/test/windows_shared_memory_mapping_test.cpp
blob: 5dd9024d5dbabaa9182faf66894ce40469bb9b80 (plain)
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
//////////////////////////////////////////////////////////////////////////////
//
// (C) Copyright Ion Gaztanaga 2004-2011. 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/config_begin.hpp>

#ifdef BOOST_INTERPROCESS_WINDOWS

#include <fstream>
#include <iostream>
#include <boost/interprocess/windows_shared_memory.hpp>
#include <boost/interprocess/mapped_region.hpp>
#include <string>
#include "get_process_id_name.hpp"

using namespace boost::interprocess;

int main ()
{
   try{
      const char *names[2] = { test::get_process_id_name(), 0 };
      for(unsigned int i = 0; i < sizeof(names)/sizeof(names[0]); ++i)
      {
         const std::size_t FileSize = 99999*2;
         //Create a file mapping
         windows_shared_memory mapping
            (create_only, names[i], read_write, FileSize);

         {

            //Create two mapped regions, one half of the file each
            mapped_region region (mapping
                                 ,read_write
                                 ,0
                                 ,FileSize/2
                                 ,0);

            mapped_region region2(mapping
                                 ,read_write
                                 ,FileSize/2
                                 ,FileSize - FileSize/2
                                 ,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/2
               ;++i){
               *filler++ = static_cast<unsigned char>(i);
            }

            filler = static_cast<unsigned char*>(region2.get_address());
            for(std::size_t i = FileSize/2
               ;i < FileSize
               ;++i){
               *filler++ = static_cast<unsigned char>(i);
            }
         }

         //See if the pattern is correct in the file using two mapped regions
         {
            mapped_region region (mapping, read_only, 0, FileSize/2, 0);
            mapped_region region2(mapping, read_only, FileSize/2, FileSize - FileSize/2, 0);

            unsigned char *checker = static_cast<unsigned char*>(region.get_address());
            //Check pattern
            for(std::size_t i = 0
               ;i < FileSize/2
               ;++i){
               if(*checker++ != static_cast<unsigned char>(i)){
                  return 1;
               }
            }

            //Check second half
            checker = static_cast<unsigned char *>(region2.get_address());

            //Check pattern
            for(std::size_t i = FileSize/2
               ;i < FileSize
               ;++i){
               if(*checker++ != static_cast<unsigned char>(i)){
                  return 1;
               }
            }
         }

         //Now check the pattern mapping a single read only mapped_region
         {
            //Create a single regions, 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){
      //shared_memory_object::remove(test::get_process_id_name());
      std::cout << "Unhandled exception: " << exc.what() << std::endl;
      return 1;
   }

   return 0;
}

#else

int main()
{
   return 0;
}

#endif

#include <boost/interprocess/detail/config_end.hpp>