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
|