summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/interprocess/test/file_mapping_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/interprocess/test/file_mapping_test.cpp')
-rw-r--r--src/boost/libs/interprocess/test/file_mapping_test.cpp164
1 files changed, 164 insertions, 0 deletions
diff --git a/src/boost/libs/interprocess/test/file_mapping_test.cpp b/src/boost/libs/interprocess/test/file_mapping_test.cpp
new file mode 100644
index 00000000..c3ce1614
--- /dev/null
+++ b/src/boost/libs/interprocess/test/file_mapping_test.cpp
@@ -0,0 +1,164 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (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/config_begin.hpp>
+#include <ios> //std::streamoff
+#include <fstream> //std::ofstream, std::ifstream
+#include <iostream>
+#include <boost/interprocess/file_mapping.hpp>
+#include <boost/interprocess/mapped_region.hpp>
+#include <boost/container/vector.hpp>
+#include <stdexcept> //std::exception
+#include <cstddef> //std::size_t
+#include "get_process_id_name.hpp"
+
+using namespace boost::interprocess;
+
+inline std::string get_filename()
+{
+ std::string ret (ipcdetail::get_temporary_path());
+ ret += "/";
+ ret += test::get_process_id_name();
+ return ret;
+}
+
+file_mapping get_file_mapping()
+{
+ file_mapping f;
+ return file_mapping(boost::move(f));
+}
+
+int main ()
+{
+ try{
+ const std::size_t FileSize = 99999*2;
+ {
+ //Create file with given size
+ std::ofstream file(get_filename().c_str(), std::ios::binary | std::ios::trunc);
+ file.seekp(static_cast<std::streamoff>(FileSize-1));
+ file.write("", 1);
+ }
+
+ {
+ //Create a file mapping
+ file_mapping mapping(get_filename().c_str(), read_write);
+ //Create two mapped regions, one half of the file each
+ mapped_region region (mapping
+ ,read_write
+ ,0
+ ,FileSize/2
+ );
+
+ mapped_region region2(mapping
+ ,read_write
+ ,FileSize/2
+ ,FileSize - FileSize/2
+ );
+
+ //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);
+ }
+ if(!region.flush(0, 0, false)){
+ return 1;
+ }
+
+ if(!region2.flush(0, 0, true)){
+ return 1;
+ }
+ }
+
+ //See if the pattern is correct in the file
+ {
+ //Open the file
+ std::ifstream file(get_filename().c_str(), std::ios::binary);
+
+ //Create a memory buffer
+ boost::container::vector<unsigned char> memory(FileSize/2 +1);
+
+ //Fill buffer
+ file.read(static_cast<char*>(static_cast<void*>(memory.data()))
+ , FileSize/2);
+
+ unsigned char *checker = memory.data();
+ //Check pattern
+ for(std::size_t i = 0
+ ;i < FileSize/2
+ ;++i){
+ if(*checker++ != static_cast<unsigned char>(i)){
+ return 1;
+ }
+ }
+
+ //Fill buffer
+ file.read(static_cast<char*>(static_cast<void*>(memory.data()))
+ , FileSize - FileSize/2);
+
+ checker = memory.data();
+ //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 file mapping
+ file_mapping mapping(get_filename().c_str(), read_only);
+
+ //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;
+ }
+ }
+ }
+ {
+ //Now test move semantics
+ file_mapping mapping(get_filename().c_str(), read_only);
+ file_mapping move_ctor(boost::move(mapping));
+ file_mapping move_assign;
+ move_assign = boost::move(move_ctor);
+ mapping.swap(move_assign);
+ file_mapping ret(get_file_mapping());
+ }
+ }
+ catch(std::exception &exc){
+ file_mapping::remove(get_filename().c_str());
+ std::cout << "Unhandled exception: " << exc.what() << std::endl;
+ throw;
+ }
+ file_mapping::remove(get_filename().c_str());
+ return 0;
+}
+
+#include <boost/interprocess/detail/config_end.hpp>