|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r74115 - in sandbox/mmap/boost/mmap: . detail handles mappble_objects/file mappble_objects/file/posix mappble_objects/file/win32 mappble_objects/shared_memory/posix mappble_objects/shared_memory/win32 mapping mapping/nt mapping/posix mapping/win32
From: dsaritz_at_[hidden]
Date: 2011-08-28 20:17:58
Author: psiha
Date: 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
New Revision: 74115
URL: http://svn.boost.org/trac/boost/changeset/74115
Log:
Extracted remaining mapping flags from the mapped_view module into appropriate impl headers in mappable_objects/file/* and mappable_objects/shared_memory/* directoris.
Split file flags structure(s) into file open and file mapping flags.
Extracted create_mapping() functions from the mapped_view_reference<>::map() member function(s) into appropriate impl modules.
Various other cleanups and restructuring.
Added:
sandbox/mmap/boost/mmap/detail/posix.hpp (contents, props changed)
sandbox/mmap/boost/mmap/detail/windows.hpp (contents, props changed)
sandbox/mmap/boost/mmap/mappble_objects/file/posix/mapping_flags.hpp
- copied, changed from r74074, /sandbox/mmap/boost/mmap/mapped_view.hpp
sandbox/mmap/boost/mmap/mappble_objects/file/posix/mapping_flags.inl
- copied, changed from r74074, /sandbox/mmap/boost/mmap/mapped_view.inl
sandbox/mmap/boost/mmap/mappble_objects/file/posix/open_flags.hpp
- copied, changed from r74074, /sandbox/mmap/boost/mmap/mappble_objects/file/posix/flags.hpp
sandbox/mmap/boost/mmap/mappble_objects/file/posix/open_flags.inl
- copied, changed from r74074, /sandbox/mmap/boost/mmap/mappble_objects/file/posix/flags.inl
sandbox/mmap/boost/mmap/mappble_objects/file/win32/mapping_flags.hpp
- copied, changed from r74074, /sandbox/mmap/boost/mmap/mapped_view.hpp
sandbox/mmap/boost/mmap/mappble_objects/file/win32/mapping_flags.inl
- copied, changed from r74074, /sandbox/mmap/boost/mmap/mapped_view.inl
sandbox/mmap/boost/mmap/mappble_objects/file/win32/open_flags.hpp
- copied, changed from r74074, /sandbox/mmap/boost/mmap/mappble_objects/file/win32/flags.hpp
sandbox/mmap/boost/mmap/mappble_objects/file/win32/open_flags.inl
- copied, changed from r74074, /sandbox/mmap/boost/mmap/mappble_objects/file/win32/flags.inl
sandbox/mmap/boost/mmap/mappble_objects/shared_memory/posix/flags.hpp
- copied, changed from r74074, /sandbox/mmap/boost/mmap/mapped_view.hpp
sandbox/mmap/boost/mmap/mappble_objects/shared_memory/posix/flags.inl
- copied, changed from r74074, /sandbox/mmap/boost/mmap/mapped_view.inl
sandbox/mmap/boost/mmap/mappble_objects/shared_memory/win32/flags.hpp
- copied, changed from r74074, /sandbox/mmap/boost/mmap/mapped_view.hpp
sandbox/mmap/boost/mmap/mappble_objects/shared_memory/win32/flags.inl
- copied, changed from r74074, /sandbox/mmap/boost/mmap/mapped_view.inl
sandbox/mmap/boost/mmap/mapping/ (props changed)
sandbox/mmap/boost/mmap/mapping/mapping.hpp
- copied, changed from r74074, /sandbox/mmap/boost/mmap/handles/mapping_handle.hpp
sandbox/mmap/boost/mmap/mapping/nt/ (props changed)
sandbox/mmap/boost/mmap/mapping/posix/ (props changed)
sandbox/mmap/boost/mmap/mapping/posix/mapping.hpp
- copied, changed from r74074, /sandbox/mmap/boost/mmap/handles/mapping_handle.hpp
sandbox/mmap/boost/mmap/mapping/posix/mapping.inl
- copied, changed from r74074, /sandbox/mmap/boost/mmap/handles/win32/handle.inl
sandbox/mmap/boost/mmap/mapping/win32/ (props changed)
sandbox/mmap/boost/mmap/mapping/win32/mapping.hpp
- copied, changed from r74074, /sandbox/mmap/boost/mmap/handles/mapping_handle.hpp
sandbox/mmap/boost/mmap/mapping/win32/mapping.inl
- copied, changed from r74074, /sandbox/mmap/boost/mmap/handles/win32/handle.inl
Removed:
sandbox/mmap/boost/mmap/handles/mapping_handle.hpp
sandbox/mmap/boost/mmap/mappble_objects/file/posix/flags.hpp
sandbox/mmap/boost/mmap/mappble_objects/file/posix/flags.inl
sandbox/mmap/boost/mmap/mappble_objects/file/win32/flags.hpp
sandbox/mmap/boost/mmap/mappble_objects/file/win32/flags.inl
Text files modified:
sandbox/mmap/boost/mmap/mappble_objects/file/file.hpp | 4
sandbox/mmap/boost/mmap/mappble_objects/file/flags.hpp | 3
sandbox/mmap/boost/mmap/mappble_objects/file/handle.hpp | 6
sandbox/mmap/boost/mmap/mappble_objects/file/posix/file.hpp | 12 +
sandbox/mmap/boost/mmap/mappble_objects/file/posix/file.inl | 14 +
sandbox/mmap/boost/mmap/mappble_objects/file/posix/mapping_flags.hpp | 309 ++++-----------------------------------
sandbox/mmap/boost/mmap/mappble_objects/file/posix/mapping_flags.inl | 248 -------------------------------
sandbox/mmap/boost/mmap/mappble_objects/file/posix/open_flags.hpp | 79 ++++-----
sandbox/mmap/boost/mmap/mappble_objects/file/posix/open_flags.inl | 71 ++------
sandbox/mmap/boost/mmap/mappble_objects/file/win32/file.hpp | 20 +
sandbox/mmap/boost/mmap/mappble_objects/file/win32/file.inl | 50 ++++--
sandbox/mmap/boost/mmap/mappble_objects/file/win32/mapping_flags.hpp | 308 +++-----------------------------------
sandbox/mmap/boost/mmap/mappble_objects/file/win32/mapping_flags.inl | 247 ++-----------------------------
sandbox/mmap/boost/mmap/mappble_objects/file/win32/open_flags.hpp | 79 +++++-----
sandbox/mmap/boost/mmap/mappble_objects/file/win32/open_flags.inl | 67 +++----
sandbox/mmap/boost/mmap/mappble_objects/shared_memory/posix/flags.hpp | 306 ++------------------------------------
sandbox/mmap/boost/mmap/mappble_objects/shared_memory/posix/flags.inl | 254 +-------------------------------
sandbox/mmap/boost/mmap/mappble_objects/shared_memory/win32/flags.hpp | 305 ++------------------------------------
sandbox/mmap/boost/mmap/mappble_objects/shared_memory/win32/flags.inl | 254 +-------------------------------
sandbox/mmap/boost/mmap/mapped_view.hpp | 207 ++++++++------------------
sandbox/mmap/boost/mmap/mapped_view.inl | 227 ++++-------------------------
sandbox/mmap/boost/mmap/mapping/mapping.hpp | 23 +-
sandbox/mmap/boost/mmap/mapping/posix/mapping.hpp | 42 +++-
sandbox/mmap/boost/mmap/mapping/posix/mapping.inl | 74 ++++----
sandbox/mmap/boost/mmap/mapping/win32/mapping.hpp | 42 +++-
sandbox/mmap/boost/mmap/mapping/win32/mapping.inl | 83 ++++++----
26 files changed, 598 insertions(+), 2736 deletions(-)
Added: sandbox/mmap/boost/mmap/detail/posix.hpp
==============================================================================
--- (empty file)
+++ sandbox/mmap/boost/mmap/detail/posix.hpp 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
@@ -0,0 +1,50 @@
+////////////////////////////////////////////////////////////////////////////////
+///
+/// \file posix.hpp
+/// ---------------
+///
+/// Copyright (c) 2011 Domagoj Saric
+///
+/// Use, modification and distribution is subject to 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)
+///
+/// For more information, see http://www.boost.org
+///
+////////////////////////////////////////////////////////////////////////////////
+//------------------------------------------------------------------------------
+#ifndef posix_hpp__8FC3F669_80D4_4455_829D_F72E8ABDE9D0
+#define posix_hpp__8FC3F669_80D4_4455_829D_F72E8ABDE9D0
+#pragma once
+//------------------------------------------------------------------------------
+#include "boost/config.hpp"
+
+#if defined( BOOST_HAS_UNISTD_H )
+ #include "boost/config/posix_features.hpp"
+#elif defined( BOOST_MSVC )
+ #pragma warning ( disable : 4996 ) // "The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name."
+ #include "io.h"
+ #include "wchar.h"
+#else
+ #error no suitable POSIX implementation found
+#endif // BOOST_MSVC
+
+#if defined( BOOST_MSVC )
+ #define BOOST_MMAP_POSIX_STANDARD_LINUX_OSX_MSVC( standard, linux, osx, msvc ) msvc
+#elif defined( __APPLE__ )
+ #define BOOST_MMAP_POSIX_STANDARD_LINUX_OSX_MSVC( standard, linux, osx, msvc ) osx
+#elif defined( _GNU_SOURCE )
+ #define BOOST_MMAP_POSIX_STANDARD_LINUX_OSX_MSVC( standard, linux, osx, msvc ) linux
+#else
+ #define BOOST_MMAP_POSIX_STANDARD_LINUX_OSX_MSVC( standard, linux, osx, msvc ) standard
+#endif // POSIX impl
+//------------------------------------------------------------------------------
+namespace boost
+{
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+} // namespace boost
+//------------------------------------------------------------------------------
+#endif // posix_hpp
Added: sandbox/mmap/boost/mmap/detail/windows.hpp
==============================================================================
--- (empty file)
+++ sandbox/mmap/boost/mmap/detail/windows.hpp 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
@@ -0,0 +1,38 @@
+////////////////////////////////////////////////////////////////////////////////
+///
+/// \file windows.hpp
+/// ------------------
+///
+/// Copyright (c) 2011 Domagoj Saric
+///
+/// Use, modification and distribution is subject to 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)
+///
+/// For more information, see http://www.boost.org
+///
+////////////////////////////////////////////////////////////////////////////////
+//------------------------------------------------------------------------------
+#ifndef windows_hpp__886EAB51_B4AD_4246_9BE3_D5272EA7D59F
+#define windows_hpp__886EAB51_B4AD_4246_9BE3_D5272EA7D59F
+#pragma once
+//------------------------------------------------------------------------------
+#ifndef BOOST_MMAP_HEADER_ONLY
+ #ifndef WIN32_LEAN_AND_MEAN
+ #define WIN32_LEAN_AND_MEAN
+ #endif // WIN32_LEAN_AND_MEAN
+ #ifndef NOMINMAX
+ #define NOMINMAX
+ #endif // NOMINMAX
+#endif // BOOST_MMAP_HEADER_ONLY
+#include "windows.h"
+//------------------------------------------------------------------------------
+namespace boost
+{
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+} // namespace boost
+//------------------------------------------------------------------------------
+#endif // windows_hpp
Deleted: sandbox/mmap/boost/mmap/handles/mapping_handle.hpp
==============================================================================
--- sandbox/mmap/boost/mmap/handles/mapping_handle.hpp 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
+++ (empty file)
@@ -1,44 +0,0 @@
-////////////////////////////////////////////////////////////////////////////////
-///
-/// \file mapping_handle.hpp
-/// ------------------------
-///
-/// Copyright (c) 2011 Domagoj Saric
-///
-/// Use, modification and distribution is subject to 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)
-///
-/// For more information, see http://www.boost.org
-///
-////////////////////////////////////////////////////////////////////////////////
-//------------------------------------------------------------------------------
-#ifndef mapping_handle_hpp__D42BC724_FD9A_4C7B_B521_CF3C29C948B3
-#define mapping_handle_hpp__D42BC724_FD9A_4C7B_B521_CF3C29C948B3
-#pragma once
-//------------------------------------------------------------------------------
-#include "handle.hpp"
-//------------------------------------------------------------------------------
-namespace boost
-{
-//------------------------------------------------------------------------------
-namespace mmap
-{
-//------------------------------------------------------------------------------
-
-template <typename Impl> class handle;
-
-template <typename Impl>
-class mapping_handle : handle<Impl>
-{
-public:
- mapping_handle( typename handle<Impl>::handle_t const native_handle )
- : handle<Impl>( native_handle ) {}
-};
-
-//------------------------------------------------------------------------------
-} // namespace mmap
-//------------------------------------------------------------------------------
-} // namespace boost
-//------------------------------------------------------------------------------
-#endif // handle_hpp
Modified: sandbox/mmap/boost/mmap/mappble_objects/file/file.hpp
==============================================================================
--- sandbox/mmap/boost/mmap/mappble_objects/file/file.hpp (original)
+++ sandbox/mmap/boost/mmap/mappble_objects/file/file.hpp 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
@@ -20,7 +20,7 @@
#include "../../detail/impl_selection.hpp"
#include BOOST_MMAP_IMPL_INCLUDE( BOOST_PP_EMPTY, BOOST_PP_IDENTITY( /file.hpp ) )
-#include BOOST_MMAP_IMPL_INCLUDE( BOOST_PP_EMPTY, BOOST_PP_IDENTITY( /flags.hpp ) )
+#include "flags.hpp"
//------------------------------------------------------------------------------
namespace boost
{
@@ -29,7 +29,7 @@
{
//------------------------------------------------------------------------------
-typedef file_flags<BOOST_MMAP_IMPL()> native_file_flags;
+typedef file_open_flags<BOOST_MMAP_IMPL()> native_file_open_flags;
inline bool delete_file( char const * const file_name ) { return delete_file( file_name, BOOST_MMAP_IMPL() () ); }
inline bool delete_file( wchar_t const * const file_name ) { return delete_file( file_name, BOOST_MMAP_IMPL() () ); }
Modified: sandbox/mmap/boost/mmap/mappble_objects/file/flags.hpp
==============================================================================
--- sandbox/mmap/boost/mmap/mappble_objects/file/flags.hpp (original)
+++ sandbox/mmap/boost/mmap/mappble_objects/file/flags.hpp 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
@@ -19,6 +19,7 @@
//------------------------------------------------------------------------------
#include "../../detail/impl_selection.hpp"
-#include BOOST_MMAP_IMPL_INCLUDE( BOOST_PP_EMPTY, BOOST_PP_IDENTITY( /flags.hpp ) )
+#include BOOST_MMAP_IMPL_INCLUDE( BOOST_PP_EMPTY, BOOST_PP_IDENTITY( /mapping_flags.hpp ) )
+#include BOOST_MMAP_IMPL_INCLUDE( BOOST_PP_EMPTY, BOOST_PP_IDENTITY( /open_flags.hpp ) )
//------------------------------------------------------------------------------
#endif // flags_hpp
Modified: sandbox/mmap/boost/mmap/mappble_objects/file/handle.hpp
==============================================================================
--- sandbox/mmap/boost/mmap/mappble_objects/file/handle.hpp (original)
+++ sandbox/mmap/boost/mmap/mappble_objects/file/handle.hpp 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////////////////////////
///
-/// \file mapping_handle.hpp
-/// ------------------------
+/// \file handle.hpp
+/// ----------------
///
/// Copyright (c) 2011 Domagoj Saric
///
@@ -34,6 +34,8 @@
: handle<Impl>( native_handle ) {}
typedef handle_ref< file_handle<Impl> > reference;
+
+ operator reference () const { return reference( get() ); }
};
//------------------------------------------------------------------------------
Modified: sandbox/mmap/boost/mmap/mappble_objects/file/posix/file.hpp
==============================================================================
--- sandbox/mmap/boost/mmap/mappble_objects/file/posix/file.hpp (original)
+++ sandbox/mmap/boost/mmap/mappble_objects/file/posix/file.hpp 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
@@ -18,6 +18,7 @@
#pragma once
//------------------------------------------------------------------------------
#include "../handle.hpp"
+#include "../../../detail/posix.hpp"
#include "../../../implementations.hpp"
#include <cstddef>
@@ -29,7 +30,8 @@
{
//------------------------------------------------------------------------------
-template <typename Impl > struct file_flags;
+template <typename Impl > struct file_open_flags;
+template <typename Impl > struct file_mapping_flags;
template <class Handle> struct is_resizable;
#ifdef BOOST_HAS_UNISTD_H
@@ -39,9 +41,9 @@
#endif // BOOST_HAS_UNISTD_H
-file_handle<posix> create_file( char const * file_name, file_flags<posix> const & );
+file_handle<posix> create_file( char const * file_name, file_open_flags<posix> const & );
#ifdef BOOST_MSVC
-file_handle<posix> create_file( wchar_t const * file_name, file_flags<posix> const & );
+file_handle<posix> create_file( wchar_t const * file_name, file_open_flags<posix> const & );
#endif // BOOST_MSVC
bool delete_file( char const * file_name, posix );
@@ -53,6 +55,10 @@
#endif // BOOST_HAS_UNISTD_H
std::size_t get_size( file_handle<posix>::reference );
+#ifdef BOOST_HAS_UNISTD_H
+mapping<posix> create_mapping( file_handle<posix>::reference, file_mapping_flags<posix> const & );
+#endif // BOOST_HAS_UNISTD_H
+
//------------------------------------------------------------------------------
} // namespace mmap
//------------------------------------------------------------------------------
Modified: sandbox/mmap/boost/mmap/mappble_objects/file/posix/file.inl
==============================================================================
--- sandbox/mmap/boost/mmap/mappble_objects/file/posix/file.inl (original)
+++ sandbox/mmap/boost/mmap/mappble_objects/file/posix/file.inl 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
@@ -41,7 +41,7 @@
//------------------------------------------------------------------------------
BOOST_IMPL_INLINE
-file_handle<posix> create_file( char const * const file_name, file_flags<posix> const & flags )
+file_handle<posix> create_file( char const * const file_name, file_open_flags<posix> const & flags )
{
typedef file_handle<posix> posix_file_handle;
@@ -57,7 +57,7 @@
#ifdef BOOST_MSVC
BOOST_IMPL_INLINE
-file_handle<posix> create_file( wchar_t const * const file_name, file_flags<posix> const & flags )
+file_handle<posix> create_file( wchar_t const * const file_name, file_open_flags<posix> const & flags )
{
BOOST_ASSERT( file_name );
@@ -102,6 +102,16 @@
return file_info.st_size;
}
+
+#ifdef BOOST_HAS_UNISTD_H
+// Apple guidelines http://developer.apple.com/library/mac/#documentation/Performance/Conceptual/FileSystem/Articles/MappingFiles.html
+BOOST_IMPL_INLINE
+mapping<posix> create_mapping( file_handle<posix>::reference const file, file_mapping_flags<posix> const & flags )
+{
+ return mapping<posix>( file, flags );
+}
+#endif // BOOST_HAS_UNISTD_H
+
//------------------------------------------------------------------------------
} // mmap
//------------------------------------------------------------------------------
Deleted: sandbox/mmap/boost/mmap/mappble_objects/file/posix/flags.hpp
==============================================================================
--- sandbox/mmap/boost/mmap/mappble_objects/file/posix/flags.hpp 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
+++ (empty file)
@@ -1,120 +0,0 @@
-////////////////////////////////////////////////////////////////////////////////
-///
-/// \file flags.hpp
-/// ---------------
-///
-/// Copyright (c) Domagoj Saric 2010.-2011.
-///
-/// Use, modification and distribution is subject to 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)
-///
-/// For more information, see http://www.boost.org
-///
-////////////////////////////////////////////////////////////////////////////////
-//------------------------------------------------------------------------------
-#ifndef flags_hpp__0F422517_D9AA_4E3F_B3E4_B139021D068E
-#define flags_hpp__0F422517_D9AA_4E3F_B3E4_B139021D068E
-#pragma once
-//------------------------------------------------------------------------------
-#include "boost/assert.hpp"
-#include "boost/noncopyable.hpp"
-
-#include "fcntl.h"
-//------------------------------------------------------------------------------
-namespace boost
-{
-//------------------------------------------------------------------------------
-namespace mmap
-{
-//------------------------------------------------------------------------------
-
-template <typename Impl> struct file_flags;
-
-// Implementation note:
-// Using structs with public members and factory functions to enable (almost)
-// zero-overhead 'link-time' conversion to native flag formats and to allow the
-// user to modify the created flags or create fully custom ones so that specific
-// platform-dependent use-cases, not otherwise covered through the generic
-// interface, can also be covered.
-// (10.10.2010.) (Domagoj Saric)
-
-template <>
-struct file_flags<posix>
-{
- struct handle_access_rights
- {
- static unsigned int const read ;
- static unsigned int const write ;
- static unsigned int const execute;
- };
-
- struct share_mode
- {
- static unsigned int const none ;
- static unsigned int const read ;
- static unsigned int const write ;
- static unsigned int const remove;
- };
-
- struct open_policy
- {
- enum value_type
- {
- create_new = O_CREAT | O_EXCL ,
- create_new_or_truncate_existing = O_CREAT | O_TRUNC,
- open_existing = 0 ,
- open_or_create = O_CREAT ,
- open_and_truncate_existing = O_TRUNC
- };
- };
- typedef open_policy::value_type open_policy_t;
-
- struct system_hints
- {
- static unsigned int const random_access ;
- static unsigned int const sequential_access;
- static unsigned int const non_cached ;
- static unsigned int const delete_on_close ;
- static unsigned int const temporary ;
- };
-
- struct on_construction_rights
- {
- static unsigned int const read ;
- static unsigned int const write ;
- static unsigned int const execute;
- };
-
- static file_flags<posix> create
- (
- unsigned int handle_access_flags ,
- unsigned int share_mode ,
- open_policy_t ,
- unsigned int system_hints ,
- unsigned int on_construction_rights
- );
-
- static file_flags<posix> create_for_opening_existing_files
- (
- unsigned int handle_access_flags,
- unsigned int share_mode ,
- bool truncate ,
- unsigned int system_hints
- );
-
- int oflag;
- int pmode;
-};
-
-//------------------------------------------------------------------------------
-} // namespace mmap
-//------------------------------------------------------------------------------
-} // namespace boost
-//------------------------------------------------------------------------------
-
-#ifdef BOOST_MMAP_HEADER_ONLY
- #include "flags.inl"
-#endif // BOOST_MMAP_HEADER_ONLY
-
-#endif // flags_hpp
Deleted: sandbox/mmap/boost/mmap/mappble_objects/file/posix/flags.inl
==============================================================================
--- sandbox/mmap/boost/mmap/mappble_objects/file/posix/flags.inl 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
+++ (empty file)
@@ -1,122 +0,0 @@
-////////////////////////////////////////////////////////////////////////////////
-///
-/// \file flags.inl
-/// ---------------
-///
-/// Copyright (c) Domagoj Saric 2010.-2011.
-///
-/// Use, modification and distribution is subject to 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)
-///
-/// For more information, see http://www.boost.org
-///
-////////////////////////////////////////////////////////////////////////////////
-//------------------------------------------------------------------------------
-#include "flags.hpp"
-
-#include "../../../detail/impl_inline.hpp"
-
-#include "boost/assert.hpp"
-
-#ifdef _WIN32
- #define BOOST_AUX_IO_WIN32_OR_POSIX( win32, posix ) win32
- #pragma warning ( disable : 4996 ) // "The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name."
- #include "io.h"
- #include "sys/stat.h"
-#else
- #define BOOST_AUX_IO_WIN32_OR_POSIX( win32, posix ) posix
- #include "sys/mman.h" // mmap, munmap.
- #include "sys/stat.h"
- #include "sys/types.h" // struct stat.
- #include "unistd.h" // sysconf.
-#endif // _WIN32
-#include "errno.h"
-#include "fcntl.h"
-
-#ifndef _WIN32
- #ifdef __APPLE__
- #define BOOST_AUX_MMAP_POSIX_OR_OSX( posix, osx ) osx
- #else
- #define BOOST_AUX_MMAP_POSIX_OR_OSX( posix, osx ) posix
- #endif
-#endif
-//------------------------------------------------------------------------------
-namespace boost
-{
-//------------------------------------------------------------------------------
-namespace mmap
-{
-//------------------------------------------------------------------------------
-
-unsigned int const file_flags<posix>::handle_access_rights::read = O_RDONLY;
-unsigned int const file_flags<posix>::handle_access_rights::write = O_WRONLY;
-unsigned int const file_flags<posix>::handle_access_rights::execute = O_RDONLY;
-
-unsigned int const file_flags<posix>::share_mode::none = 0;
-unsigned int const file_flags<posix>::share_mode::read = 0;
-unsigned int const file_flags<posix>::share_mode::write = 0;
-unsigned int const file_flags<posix>::share_mode::remove = 0;
-
-unsigned int const file_flags<posix>::system_hints::random_access = BOOST_AUX_IO_WIN32_OR_POSIX( O_RANDOM , 0 );
-unsigned int const file_flags<posix>::system_hints::sequential_access = BOOST_AUX_IO_WIN32_OR_POSIX( O_SEQUENTIAL , 0 );
-// http://stackoverflow.com/questions/2299402/how-does-one-do-raw-io-on-mac-os-x-ie-equivalent-to-linuxs-o-direct-flag
-unsigned int const file_flags<posix>::system_hints::non_cached = BOOST_AUX_IO_WIN32_OR_POSIX( 0 , BOOST_AUX_MMAP_POSIX_OR_OSX( O_DIRECT, 0 ) );
-unsigned int const file_flags<posix>::system_hints::delete_on_close = BOOST_AUX_IO_WIN32_OR_POSIX( O_TEMPORARY , 0 );
-unsigned int const file_flags<posix>::system_hints::temporary = BOOST_AUX_IO_WIN32_OR_POSIX( _O_SHORT_LIVED, 0 );
-
-unsigned int const file_flags<posix>::on_construction_rights::read = BOOST_AUX_IO_WIN32_OR_POSIX( _S_IREAD , S_IRUSR );
-unsigned int const file_flags<posix>::on_construction_rights::write = BOOST_AUX_IO_WIN32_OR_POSIX( _S_IWRITE, S_IWUSR );
-unsigned int const file_flags<posix>::on_construction_rights::execute = BOOST_AUX_IO_WIN32_OR_POSIX( _S_IEXEC , S_IXUSR );
-
-BOOST_IMPL_INLINE
-file_flags<posix> file_flags<posix>::create
-(
- unsigned int const handle_access_flags ,
- unsigned int const /*share_mode*/ ,
- open_policy_t const open_flags ,
- unsigned int const system_hints ,
- unsigned int const on_construction_rights
-)
-{
- unsigned int const oflag
- (
- ( ( handle_access_flags == ( O_RDONLY | O_WRONLY ) ) ? O_RDWR : handle_access_flags )
- |
- open_flags
- |
- system_hints
- );
-
- unsigned int const pmode( on_construction_rights );
-
- file_flags<posix> const flags =
- {
- static_cast<int>( oflag ),
- static_cast<int>( pmode )
- };
- return flags;
-}
-
-
-BOOST_IMPL_INLINE
-file_flags<posix> file_flags<posix>::create_for_opening_existing_files( unsigned int const handle_access_flags, unsigned int const share_mode , bool const truncate, unsigned int const system_hints )
-{
- return create
- (
- handle_access_flags,
- share_mode,
- truncate
- ? open_policy::open_and_truncate_existing
- : open_policy::open_existing,
- system_hints,
- 0
- );
-}
-
-
-//------------------------------------------------------------------------------
-} // mmap
-//------------------------------------------------------------------------------
-} // boost
-//------------------------------------------------------------------------------
Copied: sandbox/mmap/boost/mmap/mappble_objects/file/posix/mapping_flags.hpp (from r74074, /sandbox/mmap/boost/mmap/mapped_view.hpp)
==============================================================================
--- /sandbox/mmap/boost/mmap/mapped_view.hpp (original)
+++ sandbox/mmap/boost/mmap/mappble_objects/file/posix/mapping_flags.hpp 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////////////////////////
///
-/// \file mapped_view.hpp
-/// ---------------------
+/// \file mapping_flags.hpp
+/// -----------------------
///
/// Copyright (c) Domagoj Saric 2010.-2011.
///
@@ -13,31 +13,13 @@
///
////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
-#ifndef mapped_view_hpp__D9C84FF5_E506_4ECB_9778_61E036048D28
-#define mapped_view_hpp__D9C84FF5_E506_4ECB_9778_61E036048D28
+#ifndef mapping_flags_hpp__79CF82B8_F71B_4C75_BE77_98F4FB8A7FFA
+#define mapping_flags_hpp__79CF82B8_F71B_4C75_BE77_98F4FB8A7FFA
#pragma once
//------------------------------------------------------------------------------
-#include "handles/handle.hpp"
-//...zzz...
-#include "mappble_objects/file/file.hpp"
-#include "mappble_objects/file/posix/file.hpp"
-#ifdef _WIN32
-#include "mappble_objects/file/win32/file.hpp"
-#endif // _WIN32
-
-#include "boost/assert.hpp"
-#include "boost/noncopyable.hpp"
-#include "boost/range/iterator_range.hpp"
-
-#ifndef _WIN32
- #include "fcntl.h"
-#endif // _WIN32
-
-#ifdef _WIN32
- #define BOOST_AUX_IO_WIN32_OR_POSIX( win32, posix ) win32
-#else
- #define BOOST_AUX_IO_WIN32_OR_POSIX( win32, posix ) posix
-#endif
+#include "../../../detail/posix.hpp"
+
+#include "sys/mman.h"
//------------------------------------------------------------------------------
namespace boost
{
@@ -46,274 +28,47 @@
{
//------------------------------------------------------------------------------
-// Implementation note:
-// Using structs with public members and factory functions to enable (almost)
-// zero-overhead 'link-time' conversion to native flag formats and to allow the
-// user to modify the created flags or create fully custom ones so that specific
-// platform-dependent use-cases, not otherwise covered through the generic
-// interface, can also be covered.
-// (10.10.2010.) (Domagoj Saric)
+template <typename Impl> struct file_mapping_flags;
+
+struct posix;
+
+typedef unsigned flags_t;
-struct mapping_flags
+template <>
+struct file_mapping_flags<posix>
{
struct handle_access_rights
{
- static unsigned int const read ;
- static unsigned int const write ;
- static unsigned int const execute;
+ enum values
+ {
+ read = PROT_READ ,
+ write = PROT_WRITE,
+ execute = PROT_EXEC ,
+ all = read | write | execute
+ };
};
struct share_mode
{
- static unsigned int const shared;
- static unsigned int const hidden;
- };
-
- struct system_hint
- {
- static unsigned int const lock_to_ram ;
- static unsigned int const reserve_page_file_space;
- static unsigned int const precommit ;
- static unsigned int const uninitialized ;
+ enum value_type
+ {
+ shared = MAP_SHARED,
+ hidden = MAP_PRIVATE
+ }
};
- static mapping_flags create
+ static file_mapping_flags<posix> create
(
- unsigned int handle_access_rights,
- unsigned int share_mode ,
- unsigned int system_hints
+ flags_t combined_handle_access_rights,
+ share_mode::value_type share_mode
);
-#ifdef _WIN32
- unsigned int create_mapping_flags;
- unsigned int map_view_flags;
-#else
+
int protection;
int flags ;
-#endif // _WIN32
};
-typedef iterator_range<unsigned char *> basic_memory_range_t;
-typedef iterator_range<unsigned char const *> basic_read_only_memory_range_t;
-
-template <typename Element>
-class mapped_view_reference;
-
-typedef mapped_view_reference<unsigned char > basic_mapped_view_ref;
-typedef mapped_view_reference<unsigned char const> basic_mapped_read_only_view_ref;
-
-namespace detail
-{
- template <typename Element>
- class mapped_view_base : public iterator_range<Element *>
- {
- public:
- typedef iterator_range<Element *> memory_range_t;
-
- public: // Factory methods.
- static void unmap( mapped_view_base const & );
-
- protected:
- mapped_view_base( iterator_range<Element *> const & mapped_range ) : iterator_range<Element *>( mapped_range ) {}
- mapped_view_base( Element * const p_begin, Element * const p_end ) : iterator_range<Element *>( p_begin, p_end ) {}
-
- static mapped_view_reference<unsigned char const>
- #ifdef BOOST_MSVC
- const &
- #endif
- make_basic_view( mapped_view_base<Element> const & );
-
- static mapped_view_reference<Element>
- #ifdef BOOST_MSVC
- const &
- #endif
- make_typed_range( mapped_view_base<unsigned char> const & );
-
- private: // Hide mutable members
- void advance_begin();
- void advance_end ();
-
- void pop_front();
- void pop_back ();
- };
-
-
- template <typename Element>
- void mapped_view_base<Element>::unmap( mapped_view_base<Element> const & mapped_range )
- {
- mapped_view_base<unsigned char const>::unmap( make_basic_view( mapped_range ) );
- }
-
- template <>
- void mapped_view_base<unsigned char const>::unmap( mapped_view_base<unsigned char const> const & );
-} // namespace detail
-
-template <typename Element>
-class mapped_view_reference : public detail::mapped_view_base<Element>
-{
-public:
- basic_memory_range_t basic_range() const
- {
- return basic_memory_range_t
- (
- static_cast<unsigned char *>( static_cast<void *>( this->begin() ) ),
- static_cast<unsigned char *>( static_cast<void *>( this->end () ) )
- );
- }
-
-public: // Factory methods.
- static mapped_view_reference map
- (
- native_handle::reference,
- mapping_flags const &,
- std::size_t desired_size = 0,
- std::size_t offset = 0
- );
-
-private:
- template <typename T> friend class detail::mapped_view_base;
-
- mapped_view_reference( iterator_range<Element *> const & mapped_range ) : detail::mapped_view_base<Element>( mapped_range ) {}
- mapped_view_reference( Element * const p_begin, Element * const p_end ) : detail::mapped_view_base<Element>( p_begin, p_end ) {}
-};
-
-template <typename Element>
-class mapped_view_reference<Element const> : public detail::mapped_view_base<Element const>
-{
-public:
- basic_memory_range_t basic_range() const
- {
- return basic_memory_range_t
- (
- static_cast<unsigned char const *>( static_cast<void const *>( this->begin() ) ),
- static_cast<unsigned char const *>( static_cast<void const *>( this->end () ) )
- );
- }
-
-public: // Factory methods.
- static mapped_view_reference map
- (
- native_handle::reference object_handle,
- std::size_t desired_size = 0,
- std::size_t offset = 0,
- bool map_for_code_execution = false
- );
-
-private:
- template <typename T> friend class detail::mapped_view_base;
-
- mapped_view_reference( iterator_range<Element const *> const & mapped_range ) : detail::mapped_view_base<Element const>( mapped_range ) {}
- mapped_view_reference( Element const * const p_begin, Element const * const p_end ) : detail::mapped_view_base<Element const>( p_begin, p_end ) {}
- mapped_view_reference( mapped_view_reference<Element> const & mutable_view ) : detail::mapped_view_base<Element const>( mutable_view ) {}
-};
-
-
-namespace detail
-{
- // Implementation note:
- // These have to be defined after mapped_view_reference for eager
- // compilers (e.g. GCC and Clang).
- // (14.07.2011.) (Domagoj Saric)
-
- template <typename Element>
- mapped_view_reference<unsigned char const>
- #ifdef BOOST_MSVC
- const &
- #endif
- mapped_view_base<Element>::make_basic_view( mapped_view_base<Element> const & range )
- {
- return
- #ifdef BOOST_MSVC
- reinterpret_cast<mapped_view_reference<unsigned char const> const &>( range );
- #else // compiler might care about strict aliasing rules
- mapped_view_reference<unsigned char const>
- (
- static_cast<unsigned char const *>( static_cast<void const *>( range.begin() ) ),
- static_cast<unsigned char const *>( static_cast<void const *>( range.end () ) )
- );
- #endif // compiler
- }
-
-
- template <typename Element>
- mapped_view_reference<Element>
- #ifdef BOOST_MSVC
- const &
- #endif
- mapped_view_base<Element>::make_typed_range( mapped_view_base<unsigned char> const & range )
- {
- BOOST_ASSERT( reinterpret_cast<std::size_t>( range.begin() ) % sizeof( Element ) == 0 );
- BOOST_ASSERT( reinterpret_cast<std::size_t>( range.end () ) % sizeof( Element ) == 0 );
- BOOST_ASSERT( range.size () % sizeof( Element ) == 0 );
- return
- #ifdef BOOST_MSVC
- reinterpret_cast<mapped_view_reference<Element> const &>( range );
- #else // compiler might care about strict aliasing rules
- mapped_view_reference<unsigned char const>
- (
- static_cast<Element *>( static_cast<void *>( range.begin() ) ),
- static_cast<Element *>( static_cast<void *>( range.end () ) )
- );
- #endif // compiler
- }
-} // namespace detail
-
-
-template <typename Handle>
-struct is_mappable : mpl::false_ {};
-
-template <> struct is_mappable<char *> : mpl::true_ {};
-template <> struct is_mappable<char const *> : mpl::true_ {};
-template <> struct is_mappable<FILE *> : mpl::true_ {};
-template <> struct is_mappable<handle<posix>::native_handle_t > : mpl::true_ {};
-#ifdef _WIN32
-template <> struct is_mappable<wchar_t *> : mpl::true_ {};
-template <> struct is_mappable<wchar_t const *> : mpl::true_ {};
-template <> struct is_mappable<handle<win32>::native_handle_t > : mpl::true_ {};
-#endif // _WIN32
-
-
-template <>
-mapped_view_reference<unsigned char> mapped_view_reference<unsigned char>::map
-(
- native_handle::reference,
- mapping_flags const &,
- std::size_t desired_size,
- std::size_t offset
-);
-
-template <>
-mapped_view_reference<unsigned char const> mapped_view_reference<unsigned char const>::map
-(
- native_handle::reference object_handle,
- std::size_t desired_size,
- std::size_t offset,
- bool map_for_code_execution
-);
-
-
-template <typename Element>
-class mapped_view
- :
- public mapped_view_reference<Element>
- #ifdef BOOST_MSVC
- ,private noncopyable
- #endif // BOOST_MSVC
-{
-public:
- mapped_view( mapped_view_reference<Element> const range ) : mapped_view_reference<Element>( range ) {}
- ~mapped_view<Element>() { mapped_view_reference<Element>::unmap( *this ); }
-
- #ifndef BOOST_MSVC
- mapped_view( mapped_view const & ); // noncopyable
- #endif // BOOST_MSVC
-};
-
-
-basic_mapped_view_ref map_file ( char const * file_name, std::size_t desired_size );
-basic_mapped_read_only_view_ref map_read_only_file( char const * file_name );
-
//------------------------------------------------------------------------------
} // namespace mmap
//------------------------------------------------------------------------------
@@ -321,7 +76,7 @@
//------------------------------------------------------------------------------
#ifdef BOOST_MMAP_HEADER_ONLY
- #include "mapped_view.inl"
+ #include "mapping_flags.inl"
#endif
-#endif // mapped_view_hpp
+#endif // mapping_flags.hpp
Copied: sandbox/mmap/boost/mmap/mappble_objects/file/posix/mapping_flags.inl (from r74074, /sandbox/mmap/boost/mmap/mapped_view.inl)
==============================================================================
--- /sandbox/mmap/boost/mmap/mapped_view.inl (original)
+++ sandbox/mmap/boost/mmap/mappble_objects/file/posix/mapping_flags.inl 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////////////////////////
///
-/// \file mapped_view.inl
-/// ---------------------
+/// \file mapping_flags.inl
+/// -----------------------
///
/// Copyright (c) Domagoj Saric 2010.-2011.
///
@@ -13,39 +13,7 @@
///
////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
-#include "mapped_view.hpp"
-
-#include "detail/impl_inline.hpp"
-#include "implementations.hpp"
-#include "mappble_objects/file/handle.hpp"
-
-#include "boost/assert.hpp"
-
-#ifdef _WIN32
- #ifndef WIN32_LEAN_AND_MEAN
- #define WIN32_LEAN_AND_MEAN
- #endif // WIN32_LEAN_AND_MEAN
- #include "windows.h"
-
- #pragma warning ( disable : 4996 ) // "The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name."
- #include "io.h"
-#else
- #include "sys/mman.h" // mmap, munmap.
- #include "sys/stat.h"
- #include "sys/types.h" // struct stat.
- #include "unistd.h" // sysconf.
-#endif // _WIN32
-#include "errno.h"
-#include "fcntl.h"
-
-#ifndef _WIN32
- #ifdef __APPLE__
- #define BOOST_AUX_MMAP_POSIX_OR_OSX( posix, osx ) osx
- #else
- #define BOOST_AUX_MMAP_POSIX_OR_OSX( posix, osx ) posix
- #endif
-#endif
-
+#include "mapping_flags.hpp"
//------------------------------------------------------------------------------
namespace boost
{
@@ -54,223 +22,21 @@
{
//------------------------------------------------------------------------------
-unsigned int const mapping_flags::handle_access_rights::read = BOOST_AUX_IO_WIN32_OR_POSIX( FILE_MAP_READ , PROT_READ );
-unsigned int const mapping_flags::handle_access_rights::write = BOOST_AUX_IO_WIN32_OR_POSIX( FILE_MAP_WRITE , PROT_WRITE );
-unsigned int const mapping_flags::handle_access_rights::execute = BOOST_AUX_IO_WIN32_OR_POSIX( FILE_MAP_EXECUTE, PROT_EXEC );
-
-unsigned int const mapping_flags::share_mode::shared = BOOST_AUX_IO_WIN32_OR_POSIX( 0, MAP_SHARED );
-unsigned int const mapping_flags::share_mode::hidden = BOOST_AUX_IO_WIN32_OR_POSIX( FILE_MAP_COPY, MAP_PRIVATE );
-
-unsigned int const mapping_flags::system_hint::lock_to_ram = BOOST_AUX_IO_WIN32_OR_POSIX( SEC_COMMIT , BOOST_AUX_MMAP_POSIX_OR_OSX( MAP_LOCKED, 0 ) );
-unsigned int const mapping_flags::system_hint::reserve_page_file_space = BOOST_AUX_IO_WIN32_OR_POSIX( SEC_RESERVE, /*khm#1*/MAP_NORESERVE );
-unsigned int const mapping_flags::system_hint::precommit = BOOST_AUX_IO_WIN32_OR_POSIX( SEC_COMMIT , BOOST_AUX_MMAP_POSIX_OR_OSX( MAP_POPULATE, 0 ) );
-unsigned int const mapping_flags::system_hint::uninitialized = BOOST_AUX_IO_WIN32_OR_POSIX( 0, BOOST_AUX_MMAP_POSIX_OR_OSX( MAP_UNINITIALIZED, 0 ) );
-
-
BOOST_IMPL_INLINE
-mapping_flags mapping_flags::create
+file_mapping_flags<posix> file_mapping_flags<posix>::create
(
- unsigned int const handle_access_flags,
- unsigned int const share_mode ,
- unsigned int const system_hints
+ flags_t const combined_handle_access_flags,
+ share_mode::value_type const share_mode
)
{
mapping_flags flags;
-#ifdef _WIN32
- flags.create_mapping_flags = ( handle_access_flags & handle_access_rights::execute ) ? PAGE_EXECUTE : PAGE_NOACCESS;
- if ( share_mode == share_mode::hidden ) // WRITECOPY
- flags.create_mapping_flags *= 8;
- else
- if ( handle_access_flags & handle_access_rights::write )
- flags.create_mapping_flags *= 4;
- else
- {
- BOOST_ASSERT( handle_access_flags & handle_access_rights::read );
- flags.create_mapping_flags *= 2;
- }
-
- flags.create_mapping_flags |= system_hints;
-
- flags.map_view_flags = handle_access_flags;
-#else
- flags.protection = handle_access_flags;
+ flags.protection = combined_handle_access_flags;
flags.flags = share_mode | system_hints;
- if ( ( system_hints & system_hint::reserve_page_file_space ) ) /*khm#1*/
- flags.flags &= ~MAP_NORESERVE;
- else
- flags.flags |= MAP_NORESERVE;
-#endif // _WIN32
return flags;
}
-
-template <> BOOST_IMPL_INLINE
-mapped_view_reference<unsigned char> mapped_view_reference<unsigned char>::map
-(
- native_handle::reference const object_handle,
- mapping_flags const & flags,
- std::size_t const desired_size,
- std::size_t const offset
-)
-{
- typedef mapped_view_reference<unsigned char>::iterator iterator_t;
-
-#ifdef _WIN32
-
- // Implementation note:
- // Mapped views hold internal references to the following handles so we do
- // not need to hold/store them ourselves:
- // http://msdn.microsoft.com/en-us/library/aa366537(VS.85).aspx
- // (26.03.2010.) (Domagoj Saric)
-
- ULARGE_INTEGER large_integer;
-
- // CreateFileMapping accepts INVALID_HANDLE_VALUE as valid input but only if
- // the size parameter is not null.
- large_integer.QuadPart = desired_size;
- handle<win32> const mapping
- (
- ::CreateFileMappingW( object_handle, 0, flags.create_mapping_flags, large_integer.HighPart, large_integer.LowPart, 0 )
- );
- BOOST_ASSERT
- (
- !mapping || ( object_handle == INVALID_HANDLE_VALUE ) || ( desired_size != 0 )
- );
-
- large_integer.QuadPart = offset;
- iterator_t const view_start( static_cast<iterator_t>( ::MapViewOfFile( mapping.get(), flags.map_view_flags, large_integer.HighPart, large_integer.LowPart, desired_size ) ) );
- return mapped_view_reference<unsigned char>
- (
- view_start,
- ( view_start && ( object_handle != INVALID_HANDLE_VALUE ) )
- ? view_start + desired_size
- : view_start
- );
-
-#else // POSIX
-
- iterator_t const view_start( static_cast<iterator_t>( ::mmap( 0, desired_size, flags.protection, flags.flags, object_handle, 0 ) ) );
- return mapped_view_reference<unsigned char>
- (
- view_start,
- ( view_start != MAP_FAILED )
- ? view_start + desired_size
- : view_start
- );
-
-#endif // OS API
-}
-
-
-template <> BOOST_IMPL_INLINE
-void detail::mapped_view_base<unsigned char const>::unmap( detail::mapped_view_base<unsigned char const> const & mapped_range )
-{
-#ifdef _WIN32
- BOOST_VERIFY( ::UnmapViewOfFile( mapped_range.begin() ) || mapped_range.empty() );
-#else
- BOOST_VERIFY( ( ::munmap ( const_cast<unsigned char *>( mapped_range.begin() ), mapped_range.size() ) == 0 ) || mapped_range.empty() );
-#endif // _WIN32
-}
-
-
-template <> BOOST_IMPL_INLINE
-mapped_view_reference<unsigned char const> mapped_view_reference<unsigned char const>::map
-(
- native_handle::reference const object_handle,
- std::size_t const desired_size,
- std::size_t const offset,
- bool const map_for_code_execution
-)
-{
- return mapped_view_reference<unsigned char>::map
- (
- object_handle,
- mapping_flags::create
- (
- mapping_flags::handle_access_rights::read | ( map_for_code_execution ? mapping_flags::handle_access_rights::execute : 0 ),
- mapping_flags::share_mode::shared,
- mapping_flags::system_hint::uninitialized
- ),
- desired_size,
- offset
- );
-}
-
-
-BOOST_IMPL_INLINE
-basic_mapped_view_ref map_file( char const * const file_name, std::size_t desired_size )
-{
- typedef native_file_flags file_flags;
- file_handle<BOOST_MMAP_IMPL()> const file_handle
- (
- create_file
- (
- file_name,
- file_flags::create
- (
- file_flags::handle_access_rights::read | file_flags::handle_access_rights::write,
- file_flags::share_mode ::read,
- file_flags::open_policy::open_or_create,
- file_flags::system_hints ::sequential_access,
- file_flags::on_construction_rights::read | file_flags::on_construction_rights::write
- )
- )
- );
-
- if ( desired_size )
- set_size( file_handle.get(), desired_size );
- else
- desired_size = get_size( file_handle.get() );
-
- return basic_mapped_view_ref::map
- (
- file_handle.get(),
- mapping_flags::create
- (
- mapping_flags::handle_access_rights::read | mapping_flags::handle_access_rights::write,
- mapping_flags::share_mode::shared,
- mapping_flags::system_hint::uninitialized
- ),
- desired_size,
- 0
- );
-}
-
-
-BOOST_IMPL_INLINE
-basic_mapped_read_only_view_ref map_read_only_file( char const * const file_name )
-{
- typedef native_file_flags file_flags;
- file_handle<BOOST_MMAP_IMPL()> const file_handle
- (
- create_file
- (
- file_name,
- file_flags::create_for_opening_existing_files
- (
- file_flags::handle_access_rights::read,
- file_flags::share_mode ::read | file_flags::share_mode::write,
- false,
- file_flags::system_hints ::sequential_access
- )
- )
- );
-
- return basic_mapped_read_only_view_ref::map
- (
- file_handle.get(),
- // Implementation note:
- // Windows APIs interpret zero as 'whole file' but we still need to
- // query the file size in order to be able to properly set the end
- // pointer.
- // (13.07.2011.) (Domagoj Saric)
- get_size( file_handle.get() )
- );
-}
-
-
//------------------------------------------------------------------------------
} // mmap
//------------------------------------------------------------------------------
Copied: sandbox/mmap/boost/mmap/mappble_objects/file/posix/open_flags.hpp (from r74074, /sandbox/mmap/boost/mmap/mappble_objects/file/posix/flags.hpp)
==============================================================================
--- /sandbox/mmap/boost/mmap/mappble_objects/file/posix/flags.hpp (original)
+++ sandbox/mmap/boost/mmap/mappble_objects/file/posix/open_flags.hpp 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////////////////////////
///
-/// \file flags.hpp
-/// ---------------
+/// \file open_flags.hpp
+/// --------------------
///
/// Copyright (c) Domagoj Saric 2010.-2011.
///
@@ -13,12 +13,11 @@
///
////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
-#ifndef flags_hpp__0F422517_D9AA_4E3F_B3E4_B139021D068E
-#define flags_hpp__0F422517_D9AA_4E3F_B3E4_B139021D068E
+#ifndef open_flags_hpp__0F422517_D9AA_4E3F_B3E4_B139021D068E
+#define open_flags_hpp__0F422517_D9AA_4E3F_B3E4_B139021D068E
#pragma once
//------------------------------------------------------------------------------
-#include "boost/assert.hpp"
-#include "boost/noncopyable.hpp"
+#include "../../../detail/posix.hpp"
#include "fcntl.h"
//------------------------------------------------------------------------------
@@ -29,7 +28,7 @@
{
//------------------------------------------------------------------------------
-template <typename Impl> struct file_flags;
+template <typename Impl> struct file_open_flags;
// Implementation note:
// Using structs with public members and factory functions to enable (almost)
@@ -40,21 +39,17 @@
// (10.10.2010.) (Domagoj Saric)
template <>
-struct file_flags<posix>
+struct file_open_flags<posix>
{
struct handle_access_rights
{
- static unsigned int const read ;
- static unsigned int const write ;
- static unsigned int const execute;
- };
-
- struct share_mode
- {
- static unsigned int const none ;
- static unsigned int const read ;
- static unsigned int const write ;
- static unsigned int const remove;
+ enum values
+ {
+ read = O_RDONLY,
+ write = O_WRONLY,
+ execute = O_RDONLY,
+ all = read | write | execute
+ }
};
struct open_policy
@@ -68,39 +63,41 @@
open_and_truncate_existing = O_TRUNC
};
};
- typedef open_policy::value_type open_policy_t;
struct system_hints
{
- static unsigned int const random_access ;
- static unsigned int const sequential_access;
- static unsigned int const non_cached ;
- static unsigned int const delete_on_close ;
- static unsigned int const temporary ;
+ enum values
+ {
+ random_access = BOOST_MMAP_POSIX_STANDARD_LINUX_OSX_MSVC( 0, 0, 0, O_RANDOM ),
+ sequential_access = BOOST_MMAP_POSIX_STANDARD_LINUX_OSX_MSVC( 0, 0, 0, O_SEQUENTIAL ),
+ avoid_caching = BOOST_MMAP_POSIX_STANDARD_LINUX_OSX_MSVC( 0, O_DIRECT, 0, 0 ),
+ temporary = BOOST_MMAP_POSIX_STANDARD_LINUX_OSX_MSVC( 0, 0, 0, O_TEMPORARY | _O_SHORT_LIVED ),
+ }
};
struct on_construction_rights
{
- static unsigned int const read ;
- static unsigned int const write ;
- static unsigned int const execute;
+ enum values
+ {
+ read = BOOST_MMAP_POSIX_STANDARD_LINUX_OSX_MSVC( S_IRUSR, S_IRUSR, S_IRUSR, _S_IREAD ),
+ write = BOOST_MMAP_POSIX_STANDARD_LINUX_OSX_MSVC( S_IWUSR, S_IWUSR, S_IWUSR, _S_IWRITE ),
+ execute = BOOST_MMAP_POSIX_STANDARD_LINUX_OSX_MSVC( S_IXUSR, S_IXUSR, S_IXUSR, _S_IEXEC )
+ }
};
- static file_flags<posix> create
+ static file_open_flags<posix> create
(
- unsigned int handle_access_flags ,
- unsigned int share_mode ,
- open_policy_t ,
- unsigned int system_hints ,
- unsigned int on_construction_rights
+ flags_t handle_access_flags ,
+ open_policy::value_type ,
+ flags_t system_hints ,
+ flags_t on_construction_rights
);
- static file_flags<posix> create_for_opening_existing_files
+ static file_open_flags<posix> create_for_opening_existing_files
(
- unsigned int handle_access_flags,
- unsigned int share_mode ,
- bool truncate ,
- unsigned int system_hints
+ flags_t handle_access_flags,
+ bool truncate ,
+ flags_t system_hints
);
int oflag;
@@ -114,7 +111,7 @@
//------------------------------------------------------------------------------
#ifdef BOOST_MMAP_HEADER_ONLY
- #include "flags.inl"
+ #include "open_flags.inl"
#endif // BOOST_MMAP_HEADER_ONLY
-#endif // flags_hpp
+#endif // open_flags_hpp
Copied: sandbox/mmap/boost/mmap/mappble_objects/file/posix/open_flags.inl (from r74074, /sandbox/mmap/boost/mmap/mappble_objects/file/posix/flags.inl)
==============================================================================
--- /sandbox/mmap/boost/mmap/mappble_objects/file/posix/flags.inl (original)
+++ sandbox/mmap/boost/mmap/mappble_objects/file/posix/open_flags.inl 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////////////////////////
///
-/// \file flags.inl
-/// ---------------
+/// \file open_flags.inl
+/// --------------------
///
/// Copyright (c) Domagoj Saric 2010.-2011.
///
@@ -19,28 +19,7 @@
#include "boost/assert.hpp"
-#ifdef _WIN32
- #define BOOST_AUX_IO_WIN32_OR_POSIX( win32, posix ) win32
- #pragma warning ( disable : 4996 ) // "The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name."
- #include "io.h"
- #include "sys/stat.h"
-#else
- #define BOOST_AUX_IO_WIN32_OR_POSIX( win32, posix ) posix
- #include "sys/mman.h" // mmap, munmap.
- #include "sys/stat.h"
- #include "sys/types.h" // struct stat.
- #include "unistd.h" // sysconf.
-#endif // _WIN32
#include "errno.h"
-#include "fcntl.h"
-
-#ifndef _WIN32
- #ifdef __APPLE__
- #define BOOST_AUX_MMAP_POSIX_OR_OSX( posix, osx ) osx
- #else
- #define BOOST_AUX_MMAP_POSIX_OR_OSX( posix, osx ) posix
- #endif
-#endif
//------------------------------------------------------------------------------
namespace boost
{
@@ -49,36 +28,18 @@
{
//------------------------------------------------------------------------------
-unsigned int const file_flags<posix>::handle_access_rights::read = O_RDONLY;
-unsigned int const file_flags<posix>::handle_access_rights::write = O_WRONLY;
-unsigned int const file_flags<posix>::handle_access_rights::execute = O_RDONLY;
-
-unsigned int const file_flags<posix>::share_mode::none = 0;
-unsigned int const file_flags<posix>::share_mode::read = 0;
-unsigned int const file_flags<posix>::share_mode::write = 0;
-unsigned int const file_flags<posix>::share_mode::remove = 0;
-
-unsigned int const file_flags<posix>::system_hints::random_access = BOOST_AUX_IO_WIN32_OR_POSIX( O_RANDOM , 0 );
-unsigned int const file_flags<posix>::system_hints::sequential_access = BOOST_AUX_IO_WIN32_OR_POSIX( O_SEQUENTIAL , 0 );
-// http://stackoverflow.com/questions/2299402/how-does-one-do-raw-io-on-mac-os-x-ie-equivalent-to-linuxs-o-direct-flag
-unsigned int const file_flags<posix>::system_hints::non_cached = BOOST_AUX_IO_WIN32_OR_POSIX( 0 , BOOST_AUX_MMAP_POSIX_OR_OSX( O_DIRECT, 0 ) );
-unsigned int const file_flags<posix>::system_hints::delete_on_close = BOOST_AUX_IO_WIN32_OR_POSIX( O_TEMPORARY , 0 );
-unsigned int const file_flags<posix>::system_hints::temporary = BOOST_AUX_IO_WIN32_OR_POSIX( _O_SHORT_LIVED, 0 );
-
-unsigned int const file_flags<posix>::on_construction_rights::read = BOOST_AUX_IO_WIN32_OR_POSIX( _S_IREAD , S_IRUSR );
-unsigned int const file_flags<posix>::on_construction_rights::write = BOOST_AUX_IO_WIN32_OR_POSIX( _S_IWRITE, S_IWUSR );
-unsigned int const file_flags<posix>::on_construction_rights::execute = BOOST_AUX_IO_WIN32_OR_POSIX( _S_IEXEC , S_IXUSR );
-
BOOST_IMPL_INLINE
-file_flags<posix> file_flags<posix>::create
+file_open_flags<posix> file_open_flags<posix>::create
(
- unsigned int const handle_access_flags ,
- unsigned int const /*share_mode*/ ,
- open_policy_t const open_flags ,
- unsigned int const system_hints ,
- unsigned int const on_construction_rights
+ flags_t const handle_access_flags ,
+ open_policy::value_type const open_flags ,
+ flags_t const system_hints ,
+ flags_t const on_construction_rights
)
{
+ //...zzz...use fadvise...
+ // http://stackoverflow.com/questions/2299402/how-does-one-do-raw-io-on-mac-os-x-ie-equivalent-to-linuxs-o-direct-flag
+
unsigned int const oflag
(
( ( handle_access_flags == ( O_RDONLY | O_WRONLY ) ) ? O_RDWR : handle_access_flags )
@@ -90,7 +51,7 @@
unsigned int const pmode( on_construction_rights );
- file_flags<posix> const flags =
+ file_open_flags<posix> const flags =
{
static_cast<int>( oflag ),
static_cast<int>( pmode )
@@ -100,13 +61,17 @@
BOOST_IMPL_INLINE
-file_flags<posix> file_flags<posix>::create_for_opening_existing_files( unsigned int const handle_access_flags, unsigned int const share_mode , bool const truncate, unsigned int const system_hints )
+file_open_flags<posix> file_open_flags<posix>::create_for_opening_existing_files
+(
+ flags_t const handle_access_flags,
+ bool const truncate,
+ flags_t const system_hints
+)
{
return create
(
handle_access_flags,
- share_mode,
- truncate
+ truncate
? open_policy::open_and_truncate_existing
: open_policy::open_existing,
system_hints,
Modified: sandbox/mmap/boost/mmap/mappble_objects/file/win32/file.hpp
==============================================================================
--- sandbox/mmap/boost/mmap/mappble_objects/file/win32/file.hpp (original)
+++ sandbox/mmap/boost/mmap/mappble_objects/file/win32/file.hpp 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
@@ -17,8 +17,11 @@
#define file_hpp__FB482005_18D9_4E3B_9193_A13DBFE88F45
#pragma once
//------------------------------------------------------------------------------
-#include "../handle.hpp"
#include "../../../implementations.hpp"
+#include "../../../mapping/mapping.hpp"
+#include "../handle.hpp"
+
+#include "boost/cstdint.hpp"
#include <cstddef>
//------------------------------------------------------------------------------
@@ -29,22 +32,25 @@
{
//------------------------------------------------------------------------------
-template <typename Impl > struct file_flags;
+template <typename Impl > struct file_open_flags;
+template <typename Impl > struct file_mapping_flags;
template <class Handle> struct is_resizable;
template <> struct is_resizable< file_handle<win32> > : mpl::true_ {};
-file_handle<win32> create_file( char const * file_name, file_flags<win32> const & );
-file_handle<win32> create_file( wchar_t const * file_name, file_flags<win32> const & );
-bool delete_file( char const * file_name, win32 );
-bool delete_file( wchar_t const * file_name, win32 );
+file_handle<win32> create_file( char const * file_name, file_open_flags<win32> const & );
+file_handle<win32> create_file( wchar_t const * file_name, file_open_flags<win32> const & );
+bool delete_file( char const * file_name, win32 );
+bool delete_file( wchar_t const * file_name, win32 );
bool set_size( file_handle<win32>::reference, std::size_t desired_size );
std::size_t get_size( file_handle<win32>::reference );
+mapping<win32> create_mapping( file_handle<win32>::reference, file_mapping_flags<win32> const & );
+
//------------------------------------------------------------------------------
} // namespace mmap
//------------------------------------------------------------------------------
@@ -53,6 +59,6 @@
#ifdef BOOST_MMAP_HEADER_ONLY
#include "file.inl"
-#endif
+#endif // BOOST_MMAP_HEADER_ONLY
#endif // file_hpp
Modified: sandbox/mmap/boost/mmap/mappble_objects/file/win32/file.inl
==============================================================================
--- sandbox/mmap/boost/mmap/mappble_objects/file/win32/file.inl (original)
+++ sandbox/mmap/boost/mmap/mappble_objects/file/win32/file.inl 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
@@ -17,13 +17,9 @@
#include "flags.hpp"
#include "../../detail/impl_inline.hpp"
+#include "../../detail/windows.hpp"
#include "boost/assert.hpp"
-
-#ifndef WIN32_LEAN_AND_MEAN
- #define WIN32_LEAN_AND_MEAN
-#endif // WIN32_LEAN_AND_MEAN
-#include "windows.h"
//------------------------------------------------------------------------------
namespace boost
{
@@ -32,8 +28,14 @@
{
//------------------------------------------------------------------------------
+namespace
+{
+ // http://en.wikipedia.org/wiki/File_locking#In_UNIX
+ DWORD const default_unix_shared_semantics( FILE_SHARE_READ | FILE_SHARE_WRITE );
+}
+
BOOST_IMPL_INLINE
-file_handle<win32> create_file( char const * const file_name, file_flags<win32> const & flags )
+file_handle<win32> create_file( char const * const file_name, file_open_flags<win32> const & flags )
{
/// \note
/// This typedef is required by MSVC++ 10 SP1 and must be placed before
@@ -47,7 +49,7 @@
(
::CreateFileA
(
- file_name, flags.desired_access, flags.share_mode, 0, flags.creation_disposition, flags.flags_and_attributes, 0
+ file_name, flags.desired_access, default_unix_shared_semantics, 0, flags.creation_disposition, flags.flags_and_attributes, 0
)
);
BOOST_ASSERT( ( file_handle == INVALID_HANDLE_VALUE ) || ( ::GetLastError() == NO_ERROR ) || ( ::GetLastError() == ERROR_ALREADY_EXISTS ) );
@@ -56,26 +58,20 @@
}
BOOST_IMPL_INLINE
-file_handle<win32> create_file( wchar_t const * const file_name, file_flags<win32> const & flags )
+file_handle<win32> create_file( wchar_t const * const file_name, file_open_flags<win32> const & flags )
{
- /// \note
- /// This typedef is required by MSVC++ 10 SP1 and must be placed before
- /// the CreateFile call, otherwise it breaks at the return statement.
- /// (25.08.2011.) (Domagoj Saric)
- typedef file_handle<win32> win32_file_handle;
-
BOOST_ASSERT( file_name );
- HANDLE const file_handle
+ HANDLE const handle
(
::CreateFileW
(
- file_name, flags.desired_access, flags.share_mode, 0, flags.creation_disposition, flags.flags_and_attributes, 0
+ file_name, flags.desired_access, default_unix_shared_semantics, 0, flags.creation_disposition, flags.flags_and_attributes, 0
)
);
- BOOST_ASSERT( ( file_handle == INVALID_HANDLE_VALUE ) || ( ::GetLastError() == NO_ERROR ) || ( ::GetLastError() == ERROR_ALREADY_EXISTS ) );
+ BOOST_ASSERT( ( handle == INVALID_HANDLE_VALUE ) || ( ::GetLastError() == NO_ERROR ) || ( ::GetLastError() == ERROR_ALREADY_EXISTS ) );
- return win32_file_handle( file_handle );
+ return file_handle<win32>( handle );
}
@@ -92,7 +88,6 @@
}
-
BOOST_IMPL_INLINE
bool set_size( file_handle<win32>::reference const file_handle, std::size_t const desired_size )
{
@@ -141,6 +136,23 @@
#endif // _WIN32/64
}
+
+BOOST_IMPL_INLINE
+mapping<win32> create_mapping( file_handle<win32>::reference const file, file_mapping_flags<win32> const & flags )
+{
+ HANDLE const mapping_handle
+ (
+ ::CreateFileMappingW( file, NULL, flags.create_mapping_flags, 0, 0, NULL )
+ );
+ // CreateFileMapping accepts INVALID_HANDLE_VALUE as valid input but only if
+ // the size parameter is not null.
+ BOOST_ASSERT
+ (
+ ( file != INVALID_HANDLE_VALUE ) || !mapping_handle
+ );
+ return mapping<win32>( mapping_handle, flags.map_view_flags );
+}
+
//------------------------------------------------------------------------------
} // mmap
//------------------------------------------------------------------------------
Deleted: sandbox/mmap/boost/mmap/mappble_objects/file/win32/flags.hpp
==============================================================================
--- sandbox/mmap/boost/mmap/mappble_objects/file/win32/flags.hpp 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
+++ (empty file)
@@ -1,120 +0,0 @@
-////////////////////////////////////////////////////////////////////////////////
-///
-/// \file flags.hpp
-/// ---------------
-///
-/// Copyright (c) Domagoj Saric 2010.-2011.
-///
-/// Use, modification and distribution is subject to 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)
-///
-/// For more information, see http://www.boost.org
-///
-////////////////////////////////////////////////////////////////////////////////
-//------------------------------------------------------------------------------
-#ifndef flags_hpp__77AE8A6F_0E93_433B_A1F2_531BBBB353FC
-#define flags_hpp__77AE8A6F_0E93_433B_A1F2_531BBBB353FC
-#pragma once
-//------------------------------------------------------------------------------
-#include "boost/assert.hpp"
-#include "boost/noncopyable.hpp"
-//------------------------------------------------------------------------------
-namespace boost
-{
-//------------------------------------------------------------------------------
-namespace mmap
-{
-//------------------------------------------------------------------------------
-
-template <typename Impl> struct file_flags;
-
-// Implementation note:
-// Using structs with public members and factory functions to enable (almost)
-// zero-overhead 'link-time' conversion to native flag formats and to allow the
-// user to modify the created flags or create fully custom ones so that specific
-// platform-dependent use-cases, not otherwise covered through the generic
-// interface, can also be covered.
-// (10.10.2010.) (Domagoj Saric)
-
-template <>
-struct file_flags<win32>
-{
- struct handle_access_rights
- {
- static unsigned int const read ;
- static unsigned int const write ;
- static unsigned int const execute;
- };
-
- struct share_mode
- {
- static unsigned int const none ;
- static unsigned int const read ;
- static unsigned int const write ;
- static unsigned int const remove;
- };
-
- struct open_policy
- {
- enum value_type
- {
- create_new = 1,
- create_new_or_truncate_existing = 2,
- open_existing = 3,
- open_or_create = 4,
- open_and_truncate_existing = 5
- };
- };
- typedef open_policy::value_type open_policy_t;
-
- struct system_hints
- {
- static unsigned int const random_access ;
- static unsigned int const sequential_access;
- static unsigned int const non_cached ;
- static unsigned int const delete_on_close ;
- static unsigned int const temporary ;
- };
-
- struct on_construction_rights
- {
- static unsigned int const read ;
- static unsigned int const write ;
- static unsigned int const execute;
- };
-
- static file_flags<win32> create
- (
- unsigned int handle_access_flags ,
- unsigned int share_mode ,
- open_policy_t ,
- unsigned int system_hints ,
- unsigned int on_construction_rights
- );
-
- static file_flags<win32> create_for_opening_existing_files
- (
- unsigned int handle_access_flags,
- unsigned int share_mode ,
- bool truncate ,
- unsigned int system_hints
- );
-
- unsigned long desired_access ;
- unsigned long share_mode ;
- unsigned long creation_disposition;
- unsigned long flags_and_attributes;
-};
-
-//------------------------------------------------------------------------------
-} // namespace mmap
-//------------------------------------------------------------------------------
-} // namespace boost
-//------------------------------------------------------------------------------
-
-#ifdef BOOST_MMAP_HEADER_ONLY
- #include "flags.inl"
-#endif // BOOST_MMAP_HEADER_ONLY
-
-#endif // flags_hpp
Deleted: sandbox/mmap/boost/mmap/mappble_objects/file/win32/flags.inl
==============================================================================
--- sandbox/mmap/boost/mmap/mappble_objects/file/win32/flags.inl 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
+++ (empty file)
@@ -1,107 +0,0 @@
-////////////////////////////////////////////////////////////////////////////////
-///
-/// \file flags.inl
-/// ---------------
-///
-/// Copyright (c) Domagoj Saric 2010.-2011.
-///
-/// Use, modification and distribution is subject to 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)
-///
-/// For more information, see http://www.boost.org
-///
-////////////////////////////////////////////////////////////////////////////////
-//------------------------------------------------------------------------------
-#include "flags.hpp"
-
-#include "../../detail/impl_inline.hpp"
-
-#include "boost/assert.hpp"
-
-#ifndef WIN32_LEAN_AND_MEAN
- #define WIN32_LEAN_AND_MEAN
-#endif // WIN32_LEAN_AND_MEAN
-#include "windows.h"
-//------------------------------------------------------------------------------
-namespace boost
-{
-//------------------------------------------------------------------------------
-namespace mmap
-{
-//------------------------------------------------------------------------------
-
-unsigned int const file_flags<win32>::handle_access_rights::read = GENERIC_READ ;
-unsigned int const file_flags<win32>::handle_access_rights::write = GENERIC_WRITE ;
-unsigned int const file_flags<win32>::handle_access_rights::execute = GENERIC_EXECUTE;
-
-unsigned int const file_flags<win32>::share_mode::none = 0 ;
-unsigned int const file_flags<win32>::share_mode::read = FILE_SHARE_READ ;
-unsigned int const file_flags<win32>::share_mode::write = FILE_SHARE_WRITE ;
-unsigned int const file_flags<win32>::share_mode::remove = FILE_SHARE_DELETE;
-
-unsigned int const file_flags<win32>::system_hints::random_access = FILE_FLAG_RANDOM_ACCESS ;
-unsigned int const file_flags<win32>::system_hints::sequential_access = FILE_FLAG_SEQUENTIAL_SCAN ;
-unsigned int const file_flags<win32>::system_hints::non_cached = FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH;
-unsigned int const file_flags<win32>::system_hints::delete_on_close = FILE_FLAG_DELETE_ON_CLOSE ;
-unsigned int const file_flags<win32>::system_hints::temporary = FILE_ATTRIBUTE_TEMPORARY ;
-
-unsigned int const file_flags<win32>::on_construction_rights::read = FILE_ATTRIBUTE_READONLY;
-unsigned int const file_flags<win32>::on_construction_rights::write = FILE_ATTRIBUTE_NORMAL ;
-unsigned int const file_flags<win32>::on_construction_rights::execute = FILE_ATTRIBUTE_READONLY;
-
-BOOST_IMPL_INLINE
-file_flags<win32> file_flags<win32>::create
-(
- unsigned int const handle_access_flags ,
- unsigned int const share_mode ,
- open_policy_t const open_flags ,
- unsigned int const system_hints ,
- unsigned int const on_construction_rights
-)
-{
- file_flags<win32> const flags =
- {
- handle_access_flags, // desired_access
- share_mode, // share_mode
- open_flags, // creation_disposition
- system_hints
- |
- (
- ( on_construction_rights & FILE_ATTRIBUTE_NORMAL )
- ? ( on_construction_rights & ~FILE_ATTRIBUTE_READONLY )
- : on_construction_rights
- ) // flags_and_attributes
- };
-
- return flags;
-}
-
-
-BOOST_IMPL_INLINE
-file_flags<win32> file_flags<win32>::create_for_opening_existing_files
-(
- unsigned int const handle_access_flags,
- unsigned int const share_mode,
- bool const truncate,
- unsigned int const system_hints
-)
-{
- return create
- (
- handle_access_flags,
- share_mode,
- truncate
- ? open_policy::open_and_truncate_existing
- : open_policy::open_existing,
- system_hints,
- 0
- );
-}
-
-
-//------------------------------------------------------------------------------
-} // mmap
-//------------------------------------------------------------------------------
-} // boost
-//------------------------------------------------------------------------------
Copied: sandbox/mmap/boost/mmap/mappble_objects/file/win32/mapping_flags.hpp (from r74074, /sandbox/mmap/boost/mmap/mapped_view.hpp)
==============================================================================
--- /sandbox/mmap/boost/mmap/mapped_view.hpp (original)
+++ sandbox/mmap/boost/mmap/mappble_objects/file/win32/mapping_flags.hpp 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////////////////////////
///
-/// \file mapped_view.hpp
-/// ---------------------
+/// \file mapping_flags.hpp
+/// -----------------------
///
/// Copyright (c) Domagoj Saric 2010.-2011.
///
@@ -13,31 +13,10 @@
///
////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
-#ifndef mapped_view_hpp__D9C84FF5_E506_4ECB_9778_61E036048D28
-#define mapped_view_hpp__D9C84FF5_E506_4ECB_9778_61E036048D28
+#ifndef mapping_flags_hpp__CD518463_D4CB_4E18_8E35_E0FBBA8CA1D1
+#define mapping_flags_hpp__CD518463_D4CB_4E18_8E35_E0FBBA8CA1D1
#pragma once
//------------------------------------------------------------------------------
-#include "handles/handle.hpp"
-//...zzz...
-#include "mappble_objects/file/file.hpp"
-#include "mappble_objects/file/posix/file.hpp"
-#ifdef _WIN32
-#include "mappble_objects/file/win32/file.hpp"
-#endif // _WIN32
-
-#include "boost/assert.hpp"
-#include "boost/noncopyable.hpp"
-#include "boost/range/iterator_range.hpp"
-
-#ifndef _WIN32
- #include "fcntl.h"
-#endif // _WIN32
-
-#ifdef _WIN32
- #define BOOST_AUX_IO_WIN32_OR_POSIX( win32, posix ) win32
-#else
- #define BOOST_AUX_IO_WIN32_OR_POSIX( win32, posix ) posix
-#endif
//------------------------------------------------------------------------------
namespace boost
{
@@ -46,274 +25,47 @@
{
//------------------------------------------------------------------------------
-// Implementation note:
-// Using structs with public members and factory functions to enable (almost)
-// zero-overhead 'link-time' conversion to native flag formats and to allow the
-// user to modify the created flags or create fully custom ones so that specific
-// platform-dependent use-cases, not otherwise covered through the generic
-// interface, can also be covered.
-// (10.10.2010.) (Domagoj Saric)
+template <typename Impl> struct file_mapping_flags;
+
+struct win32;
-struct mapping_flags
+typedef unsigned flags_t;
+
+template <>
+struct file_mapping_flags<win32>
{
struct handle_access_rights
{
- static unsigned int const read ;
- static unsigned int const write ;
- static unsigned int const execute;
+ enum values
+ {
+ read = 0x0004,
+ write = 0x0002,
+ execute = 0x0020,
+ all = read | write | execute
+ };
};
struct share_mode
{
- static unsigned int const shared;
- static unsigned int const hidden;
- };
-
- struct system_hint
- {
- static unsigned int const lock_to_ram ;
- static unsigned int const reserve_page_file_space;
- static unsigned int const precommit ;
- static unsigned int const uninitialized ;
+ enum value_type
+ {
+ shared = 0,
+ hidden = 0x0001
+ };
};
- static mapping_flags create
- (
- unsigned int handle_access_rights,
- unsigned int share_mode ,
- unsigned int system_hints
- );
-
-#ifdef _WIN32
- unsigned int create_mapping_flags;
- unsigned int map_view_flags;
-#else
- int protection;
- int flags ;
-#endif // _WIN32
-};
-
-
-typedef iterator_range<unsigned char *> basic_memory_range_t;
-typedef iterator_range<unsigned char const *> basic_read_only_memory_range_t;
-
-template <typename Element>
-class mapped_view_reference;
-
-typedef mapped_view_reference<unsigned char > basic_mapped_view_ref;
-typedef mapped_view_reference<unsigned char const> basic_mapped_read_only_view_ref;
-
-namespace detail
-{
- template <typename Element>
- class mapped_view_base : public iterator_range<Element *>
- {
- public:
- typedef iterator_range<Element *> memory_range_t;
-
- public: // Factory methods.
- static void unmap( mapped_view_base const & );
-
- protected:
- mapped_view_base( iterator_range<Element *> const & mapped_range ) : iterator_range<Element *>( mapped_range ) {}
- mapped_view_base( Element * const p_begin, Element * const p_end ) : iterator_range<Element *>( p_begin, p_end ) {}
-
- static mapped_view_reference<unsigned char const>
- #ifdef BOOST_MSVC
- const &
- #endif
- make_basic_view( mapped_view_base<Element> const & );
-
- static mapped_view_reference<Element>
- #ifdef BOOST_MSVC
- const &
- #endif
- make_typed_range( mapped_view_base<unsigned char> const & );
-
- private: // Hide mutable members
- void advance_begin();
- void advance_end ();
-
- void pop_front();
- void pop_back ();
- };
-
-
- template <typename Element>
- void mapped_view_base<Element>::unmap( mapped_view_base<Element> const & mapped_range )
- {
- mapped_view_base<unsigned char const>::unmap( make_basic_view( mapped_range ) );
- }
-
- template <>
- void mapped_view_base<unsigned char const>::unmap( mapped_view_base<unsigned char const> const & );
-} // namespace detail
-
-template <typename Element>
-class mapped_view_reference : public detail::mapped_view_base<Element>
-{
-public:
- basic_memory_range_t basic_range() const
- {
- return basic_memory_range_t
- (
- static_cast<unsigned char *>( static_cast<void *>( this->begin() ) ),
- static_cast<unsigned char *>( static_cast<void *>( this->end () ) )
- );
- }
-
-public: // Factory methods.
- static mapped_view_reference map
- (
- native_handle::reference,
- mapping_flags const &,
- std::size_t desired_size = 0,
- std::size_t offset = 0
- );
-
-private:
- template <typename T> friend class detail::mapped_view_base;
-
- mapped_view_reference( iterator_range<Element *> const & mapped_range ) : detail::mapped_view_base<Element>( mapped_range ) {}
- mapped_view_reference( Element * const p_begin, Element * const p_end ) : detail::mapped_view_base<Element>( p_begin, p_end ) {}
-};
-
-template <typename Element>
-class mapped_view_reference<Element const> : public detail::mapped_view_base<Element const>
-{
-public:
- basic_memory_range_t basic_range() const
- {
- return basic_memory_range_t
- (
- static_cast<unsigned char const *>( static_cast<void const *>( this->begin() ) ),
- static_cast<unsigned char const *>( static_cast<void const *>( this->end () ) )
- );
- }
-
-public: // Factory methods.
- static mapped_view_reference map
+ static file_mapping_flags<win32> create
(
- native_handle::reference object_handle,
- std::size_t desired_size = 0,
- std::size_t offset = 0,
- bool map_for_code_execution = false
+ flags_t combined_handle_access_rights,
+ share_mode::value_type share_mode
);
-private:
- template <typename T> friend class detail::mapped_view_base;
- mapped_view_reference( iterator_range<Element const *> const & mapped_range ) : detail::mapped_view_base<Element const>( mapped_range ) {}
- mapped_view_reference( Element const * const p_begin, Element const * const p_end ) : detail::mapped_view_base<Element const>( p_begin, p_end ) {}
- mapped_view_reference( mapped_view_reference<Element> const & mutable_view ) : detail::mapped_view_base<Element const>( mutable_view ) {}
-};
-
-
-namespace detail
-{
- // Implementation note:
- // These have to be defined after mapped_view_reference for eager
- // compilers (e.g. GCC and Clang).
- // (14.07.2011.) (Domagoj Saric)
-
- template <typename Element>
- mapped_view_reference<unsigned char const>
- #ifdef BOOST_MSVC
- const &
- #endif
- mapped_view_base<Element>::make_basic_view( mapped_view_base<Element> const & range )
- {
- return
- #ifdef BOOST_MSVC
- reinterpret_cast<mapped_view_reference<unsigned char const> const &>( range );
- #else // compiler might care about strict aliasing rules
- mapped_view_reference<unsigned char const>
- (
- static_cast<unsigned char const *>( static_cast<void const *>( range.begin() ) ),
- static_cast<unsigned char const *>( static_cast<void const *>( range.end () ) )
- );
- #endif // compiler
- }
-
-
- template <typename Element>
- mapped_view_reference<Element>
- #ifdef BOOST_MSVC
- const &
- #endif
- mapped_view_base<Element>::make_typed_range( mapped_view_base<unsigned char> const & range )
- {
- BOOST_ASSERT( reinterpret_cast<std::size_t>( range.begin() ) % sizeof( Element ) == 0 );
- BOOST_ASSERT( reinterpret_cast<std::size_t>( range.end () ) % sizeof( Element ) == 0 );
- BOOST_ASSERT( range.size () % sizeof( Element ) == 0 );
- return
- #ifdef BOOST_MSVC
- reinterpret_cast<mapped_view_reference<Element> const &>( range );
- #else // compiler might care about strict aliasing rules
- mapped_view_reference<unsigned char const>
- (
- static_cast<Element *>( static_cast<void *>( range.begin() ) ),
- static_cast<Element *>( static_cast<void *>( range.end () ) )
- );
- #endif // compiler
- }
-} // namespace detail
-
-
-template <typename Handle>
-struct is_mappable : mpl::false_ {};
-
-template <> struct is_mappable<char *> : mpl::true_ {};
-template <> struct is_mappable<char const *> : mpl::true_ {};
-template <> struct is_mappable<FILE *> : mpl::true_ {};
-template <> struct is_mappable<handle<posix>::native_handle_t > : mpl::true_ {};
-#ifdef _WIN32
-template <> struct is_mappable<wchar_t *> : mpl::true_ {};
-template <> struct is_mappable<wchar_t const *> : mpl::true_ {};
-template <> struct is_mappable<handle<win32>::native_handle_t > : mpl::true_ {};
-#endif // _WIN32
-
-
-template <>
-mapped_view_reference<unsigned char> mapped_view_reference<unsigned char>::map
-(
- native_handle::reference,
- mapping_flags const &,
- std::size_t desired_size,
- std::size_t offset
-);
-
-template <>
-mapped_view_reference<unsigned char const> mapped_view_reference<unsigned char const>::map
-(
- native_handle::reference object_handle,
- std::size_t desired_size,
- std::size_t offset,
- bool map_for_code_execution
-);
-
-
-template <typename Element>
-class mapped_view
- :
- public mapped_view_reference<Element>
- #ifdef BOOST_MSVC
- ,private noncopyable
- #endif // BOOST_MSVC
-{
-public:
- mapped_view( mapped_view_reference<Element> const range ) : mapped_view_reference<Element>( range ) {}
- ~mapped_view<Element>() { mapped_view_reference<Element>::unmap( *this ); }
-
- #ifndef BOOST_MSVC
- mapped_view( mapped_view const & ); // noncopyable
- #endif // BOOST_MSVC
+ unsigned int create_mapping_flags;
+ unsigned int map_view_flags ;
};
-basic_mapped_view_ref map_file ( char const * file_name, std::size_t desired_size );
-basic_mapped_read_only_view_ref map_read_only_file( char const * file_name );
-
//------------------------------------------------------------------------------
} // namespace mmap
//------------------------------------------------------------------------------
@@ -321,7 +73,7 @@
//------------------------------------------------------------------------------
#ifdef BOOST_MMAP_HEADER_ONLY
- #include "mapped_view.inl"
+ #include "mapping_flags.inl"
#endif
-#endif // mapped_view_hpp
+#endif // mapping_flags.hpp
Copied: sandbox/mmap/boost/mmap/mappble_objects/file/win32/mapping_flags.inl (from r74074, /sandbox/mmap/boost/mmap/mapped_view.inl)
==============================================================================
--- /sandbox/mmap/boost/mmap/mapped_view.inl (original)
+++ sandbox/mmap/boost/mmap/mappble_objects/file/win32/mapping_flags.inl 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////////////////////////
///
-/// \file mapped_view.inl
-/// ---------------------
+/// \file mapping_flags.inl
+/// -----------------------
///
/// Copyright (c) Domagoj Saric 2010.-2011.
///
@@ -13,39 +13,11 @@
///
////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
-#include "mapped_view.hpp"
+#include "mapping_flags.hpp"
-#include "detail/impl_inline.hpp"
-#include "implementations.hpp"
-#include "mappble_objects/file/handle.hpp"
-
-#include "boost/assert.hpp"
-
-#ifdef _WIN32
- #ifndef WIN32_LEAN_AND_MEAN
- #define WIN32_LEAN_AND_MEAN
- #endif // WIN32_LEAN_AND_MEAN
- #include "windows.h"
-
- #pragma warning ( disable : 4996 ) // "The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name."
- #include "io.h"
-#else
- #include "sys/mman.h" // mmap, munmap.
- #include "sys/stat.h"
- #include "sys/types.h" // struct stat.
- #include "unistd.h" // sysconf.
-#endif // _WIN32
-#include "errno.h"
-#include "fcntl.h"
-
-#ifndef _WIN32
- #ifdef __APPLE__
- #define BOOST_AUX_MMAP_POSIX_OR_OSX( posix, osx ) osx
- #else
- #define BOOST_AUX_MMAP_POSIX_OR_OSX( posix, osx ) posix
- #endif
-#endif
+#include "../../../detail/windows.hpp"
+#include "boost/static_assert.hpp"
//------------------------------------------------------------------------------
namespace boost
{
@@ -54,223 +26,40 @@
{
//------------------------------------------------------------------------------
-unsigned int const mapping_flags::handle_access_rights::read = BOOST_AUX_IO_WIN32_OR_POSIX( FILE_MAP_READ , PROT_READ );
-unsigned int const mapping_flags::handle_access_rights::write = BOOST_AUX_IO_WIN32_OR_POSIX( FILE_MAP_WRITE , PROT_WRITE );
-unsigned int const mapping_flags::handle_access_rights::execute = BOOST_AUX_IO_WIN32_OR_POSIX( FILE_MAP_EXECUTE, PROT_EXEC );
-
-unsigned int const mapping_flags::share_mode::shared = BOOST_AUX_IO_WIN32_OR_POSIX( 0, MAP_SHARED );
-unsigned int const mapping_flags::share_mode::hidden = BOOST_AUX_IO_WIN32_OR_POSIX( FILE_MAP_COPY, MAP_PRIVATE );
+BOOST_STATIC_ASSERT( file_mapping_flags<win32>::handle_access_rights::read == FILE_MAP_READ );
+BOOST_STATIC_ASSERT( file_mapping_flags<win32>::handle_access_rights::write == FILE_MAP_WRITE );
+BOOST_STATIC_ASSERT( file_mapping_flags<win32>::handle_access_rights::execute == FILE_MAP_EXECUTE );
-unsigned int const mapping_flags::system_hint::lock_to_ram = BOOST_AUX_IO_WIN32_OR_POSIX( SEC_COMMIT , BOOST_AUX_MMAP_POSIX_OR_OSX( MAP_LOCKED, 0 ) );
-unsigned int const mapping_flags::system_hint::reserve_page_file_space = BOOST_AUX_IO_WIN32_OR_POSIX( SEC_RESERVE, /*khm#1*/MAP_NORESERVE );
-unsigned int const mapping_flags::system_hint::precommit = BOOST_AUX_IO_WIN32_OR_POSIX( SEC_COMMIT , BOOST_AUX_MMAP_POSIX_OR_OSX( MAP_POPULATE, 0 ) );
-unsigned int const mapping_flags::system_hint::uninitialized = BOOST_AUX_IO_WIN32_OR_POSIX( 0, BOOST_AUX_MMAP_POSIX_OR_OSX( MAP_UNINITIALIZED, 0 ) );
+BOOST_STATIC_ASSERT( file_mapping_flags<win32>::share_mode::shared == 0 );
+BOOST_STATIC_ASSERT( file_mapping_flags<win32>::share_mode::hidden == FILE_MAP_COPY );
BOOST_IMPL_INLINE
-mapping_flags mapping_flags::create
+file_mapping_flags<win32> file_mapping_flags<win32>::create
(
- unsigned int const handle_access_flags,
- unsigned int const share_mode ,
- unsigned int const system_hints
+ flags_t const combined_handle_access_flags,
+ share_mode::value_type const share_mode
)
{
- mapping_flags flags;
+ file_mapping_flags flags;
-#ifdef _WIN32
- flags.create_mapping_flags = ( handle_access_flags & handle_access_rights::execute ) ? PAGE_EXECUTE : PAGE_NOACCESS;
+ flags.create_mapping_flags = ( combined_handle_access_flags & handle_access_rights::execute ) ? PAGE_EXECUTE : PAGE_NOACCESS;
if ( share_mode == share_mode::hidden ) // WRITECOPY
flags.create_mapping_flags *= 8;
else
- if ( handle_access_flags & handle_access_rights::write )
+ if ( combined_handle_access_flags & handle_access_rights::write )
flags.create_mapping_flags *= 4;
else
{
- BOOST_ASSERT( handle_access_flags & handle_access_rights::read );
+ BOOST_ASSERT( combined_handle_access_flags & handle_access_rights::read );
flags.create_mapping_flags *= 2;
}
- flags.create_mapping_flags |= system_hints;
-
- flags.map_view_flags = handle_access_flags;
-#else
- flags.protection = handle_access_flags;
- flags.flags = share_mode | system_hints;
- if ( ( system_hints & system_hint::reserve_page_file_space ) ) /*khm#1*/
- flags.flags &= ~MAP_NORESERVE;
- else
- flags.flags |= MAP_NORESERVE;
-#endif // _WIN32
+ flags.map_view_flags = combined_handle_access_flags;
return flags;
}
-
-template <> BOOST_IMPL_INLINE
-mapped_view_reference<unsigned char> mapped_view_reference<unsigned char>::map
-(
- native_handle::reference const object_handle,
- mapping_flags const & flags,
- std::size_t const desired_size,
- std::size_t const offset
-)
-{
- typedef mapped_view_reference<unsigned char>::iterator iterator_t;
-
-#ifdef _WIN32
-
- // Implementation note:
- // Mapped views hold internal references to the following handles so we do
- // not need to hold/store them ourselves:
- // http://msdn.microsoft.com/en-us/library/aa366537(VS.85).aspx
- // (26.03.2010.) (Domagoj Saric)
-
- ULARGE_INTEGER large_integer;
-
- // CreateFileMapping accepts INVALID_HANDLE_VALUE as valid input but only if
- // the size parameter is not null.
- large_integer.QuadPart = desired_size;
- handle<win32> const mapping
- (
- ::CreateFileMappingW( object_handle, 0, flags.create_mapping_flags, large_integer.HighPart, large_integer.LowPart, 0 )
- );
- BOOST_ASSERT
- (
- !mapping || ( object_handle == INVALID_HANDLE_VALUE ) || ( desired_size != 0 )
- );
-
- large_integer.QuadPart = offset;
- iterator_t const view_start( static_cast<iterator_t>( ::MapViewOfFile( mapping.get(), flags.map_view_flags, large_integer.HighPart, large_integer.LowPart, desired_size ) ) );
- return mapped_view_reference<unsigned char>
- (
- view_start,
- ( view_start && ( object_handle != INVALID_HANDLE_VALUE ) )
- ? view_start + desired_size
- : view_start
- );
-
-#else // POSIX
-
- iterator_t const view_start( static_cast<iterator_t>( ::mmap( 0, desired_size, flags.protection, flags.flags, object_handle, 0 ) ) );
- return mapped_view_reference<unsigned char>
- (
- view_start,
- ( view_start != MAP_FAILED )
- ? view_start + desired_size
- : view_start
- );
-
-#endif // OS API
-}
-
-
-template <> BOOST_IMPL_INLINE
-void detail::mapped_view_base<unsigned char const>::unmap( detail::mapped_view_base<unsigned char const> const & mapped_range )
-{
-#ifdef _WIN32
- BOOST_VERIFY( ::UnmapViewOfFile( mapped_range.begin() ) || mapped_range.empty() );
-#else
- BOOST_VERIFY( ( ::munmap ( const_cast<unsigned char *>( mapped_range.begin() ), mapped_range.size() ) == 0 ) || mapped_range.empty() );
-#endif // _WIN32
-}
-
-
-template <> BOOST_IMPL_INLINE
-mapped_view_reference<unsigned char const> mapped_view_reference<unsigned char const>::map
-(
- native_handle::reference const object_handle,
- std::size_t const desired_size,
- std::size_t const offset,
- bool const map_for_code_execution
-)
-{
- return mapped_view_reference<unsigned char>::map
- (
- object_handle,
- mapping_flags::create
- (
- mapping_flags::handle_access_rights::read | ( map_for_code_execution ? mapping_flags::handle_access_rights::execute : 0 ),
- mapping_flags::share_mode::shared,
- mapping_flags::system_hint::uninitialized
- ),
- desired_size,
- offset
- );
-}
-
-
-BOOST_IMPL_INLINE
-basic_mapped_view_ref map_file( char const * const file_name, std::size_t desired_size )
-{
- typedef native_file_flags file_flags;
- file_handle<BOOST_MMAP_IMPL()> const file_handle
- (
- create_file
- (
- file_name,
- file_flags::create
- (
- file_flags::handle_access_rights::read | file_flags::handle_access_rights::write,
- file_flags::share_mode ::read,
- file_flags::open_policy::open_or_create,
- file_flags::system_hints ::sequential_access,
- file_flags::on_construction_rights::read | file_flags::on_construction_rights::write
- )
- )
- );
-
- if ( desired_size )
- set_size( file_handle.get(), desired_size );
- else
- desired_size = get_size( file_handle.get() );
-
- return basic_mapped_view_ref::map
- (
- file_handle.get(),
- mapping_flags::create
- (
- mapping_flags::handle_access_rights::read | mapping_flags::handle_access_rights::write,
- mapping_flags::share_mode::shared,
- mapping_flags::system_hint::uninitialized
- ),
- desired_size,
- 0
- );
-}
-
-
-BOOST_IMPL_INLINE
-basic_mapped_read_only_view_ref map_read_only_file( char const * const file_name )
-{
- typedef native_file_flags file_flags;
- file_handle<BOOST_MMAP_IMPL()> const file_handle
- (
- create_file
- (
- file_name,
- file_flags::create_for_opening_existing_files
- (
- file_flags::handle_access_rights::read,
- file_flags::share_mode ::read | file_flags::share_mode::write,
- false,
- file_flags::system_hints ::sequential_access
- )
- )
- );
-
- return basic_mapped_read_only_view_ref::map
- (
- file_handle.get(),
- // Implementation note:
- // Windows APIs interpret zero as 'whole file' but we still need to
- // query the file size in order to be able to properly set the end
- // pointer.
- // (13.07.2011.) (Domagoj Saric)
- get_size( file_handle.get() )
- );
-}
-
-
//------------------------------------------------------------------------------
} // mmap
//------------------------------------------------------------------------------
Copied: sandbox/mmap/boost/mmap/mappble_objects/file/win32/open_flags.hpp (from r74074, /sandbox/mmap/boost/mmap/mappble_objects/file/win32/flags.hpp)
==============================================================================
--- /sandbox/mmap/boost/mmap/mappble_objects/file/win32/flags.hpp (original)
+++ sandbox/mmap/boost/mmap/mappble_objects/file/win32/open_flags.hpp 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////////////////////////
///
-/// \file flags.hpp
-/// ---------------
+/// \file open_flags.hpp
+/// --------------------
///
/// Copyright (c) Domagoj Saric 2010.-2011.
///
@@ -13,8 +13,8 @@
///
////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
-#ifndef flags_hpp__77AE8A6F_0E93_433B_A1F2_531BBBB353FC
-#define flags_hpp__77AE8A6F_0E93_433B_A1F2_531BBBB353FC
+#ifndef open_flags_hpp__77AE8A6F_0E93_433B_A1F2_531BBBB353FC
+#define open_flags_hpp__77AE8A6F_0E93_433B_A1F2_531BBBB353FC
#pragma once
//------------------------------------------------------------------------------
#include "boost/assert.hpp"
@@ -27,7 +27,7 @@
{
//------------------------------------------------------------------------------
-template <typename Impl> struct file_flags;
+template <typename Impl> struct file_open_flags;
// Implementation note:
// Using structs with public members and factory functions to enable (almost)
@@ -37,22 +37,20 @@
// interface, can also be covered.
// (10.10.2010.) (Domagoj Saric)
+typedef unsigned flags_t;
+
template <>
-struct file_flags<win32>
+struct file_open_flags<win32>
{
struct handle_access_rights
{
- static unsigned int const read ;
- static unsigned int const write ;
- static unsigned int const execute;
- };
-
- struct share_mode
- {
- static unsigned int const none ;
- static unsigned int const read ;
- static unsigned int const write ;
- static unsigned int const remove;
+ enum values
+ {
+ read = 0x80000000L,
+ write = 0x40000000L,
+ execute = 0x20000000L,
+ all = 0x10000000L
+ };
};
struct open_policy
@@ -66,43 +64,44 @@
open_and_truncate_existing = 5
};
};
- typedef open_policy::value_type open_policy_t;
struct system_hints
{
- static unsigned int const random_access ;
- static unsigned int const sequential_access;
- static unsigned int const non_cached ;
- static unsigned int const delete_on_close ;
- static unsigned int const temporary ;
+ enum values
+ {
+ random_access = 0x10000000,
+ sequential_access = 0x08000000,
+ avoid_caching = 0x20000000 | 0x80000000,
+ temporary = 0x00000100 | 0x04000000
+ };
};
struct on_construction_rights
{
- static unsigned int const read ;
- static unsigned int const write ;
- static unsigned int const execute;
+ enum values
+ {
+ read = 0x00000001,
+ write = 0x00000080,
+ execute = 0x00000001,
+ };
};
- static file_flags<win32> create
+ static file_open_flags<win32> create
(
- unsigned int handle_access_flags ,
- unsigned int share_mode ,
- open_policy_t ,
- unsigned int system_hints ,
- unsigned int on_construction_rights
+ flags_t handle_access_flags ,
+ open_policy::value_type ,
+ flags_t system_hints ,
+ flags_t on_construction_rights
);
- static file_flags<win32> create_for_opening_existing_files
+ static file_open_flags<win32> create_for_opening_existing_files
(
- unsigned int handle_access_flags,
- unsigned int share_mode ,
- bool truncate ,
- unsigned int system_hints
+ flags_t handle_access_flags,
+ bool truncate ,
+ flags_t system_hints
);
unsigned long desired_access ;
- unsigned long share_mode ;
unsigned long creation_disposition;
unsigned long flags_and_attributes;
};
@@ -114,7 +113,7 @@
//------------------------------------------------------------------------------
#ifdef BOOST_MMAP_HEADER_ONLY
- #include "flags.inl"
+ #include "open_flags.inl"
#endif // BOOST_MMAP_HEADER_ONLY
-#endif // flags_hpp
+#endif // open_flags_hpp
Copied: sandbox/mmap/boost/mmap/mappble_objects/file/win32/open_flags.inl (from r74074, /sandbox/mmap/boost/mmap/mappble_objects/file/win32/flags.inl)
==============================================================================
--- /sandbox/mmap/boost/mmap/mappble_objects/file/win32/flags.inl (original)
+++ sandbox/mmap/boost/mmap/mappble_objects/file/win32/open_flags.inl 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////////////////////////
///
-/// \file flags.inl
-/// ---------------
+/// \file open_flags.inl
+/// --------------------
///
/// Copyright (c) Domagoj Saric 2010.-2011.
///
@@ -13,11 +13,11 @@
///
////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
-#include "flags.hpp"
+#include "open_flags.hpp"
#include "../../detail/impl_inline.hpp"
-#include "boost/assert.hpp"
+#include "boost/static_assert.hpp"
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
@@ -31,46 +31,39 @@
{
//------------------------------------------------------------------------------
-unsigned int const file_flags<win32>::handle_access_rights::read = GENERIC_READ ;
-unsigned int const file_flags<win32>::handle_access_rights::write = GENERIC_WRITE ;
-unsigned int const file_flags<win32>::handle_access_rights::execute = GENERIC_EXECUTE;
-
-unsigned int const file_flags<win32>::share_mode::none = 0 ;
-unsigned int const file_flags<win32>::share_mode::read = FILE_SHARE_READ ;
-unsigned int const file_flags<win32>::share_mode::write = FILE_SHARE_WRITE ;
-unsigned int const file_flags<win32>::share_mode::remove = FILE_SHARE_DELETE;
-
-unsigned int const file_flags<win32>::system_hints::random_access = FILE_FLAG_RANDOM_ACCESS ;
-unsigned int const file_flags<win32>::system_hints::sequential_access = FILE_FLAG_SEQUENTIAL_SCAN ;
-unsigned int const file_flags<win32>::system_hints::non_cached = FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH;
-unsigned int const file_flags<win32>::system_hints::delete_on_close = FILE_FLAG_DELETE_ON_CLOSE ;
-unsigned int const file_flags<win32>::system_hints::temporary = FILE_ATTRIBUTE_TEMPORARY ;
-
-unsigned int const file_flags<win32>::on_construction_rights::read = FILE_ATTRIBUTE_READONLY;
-unsigned int const file_flags<win32>::on_construction_rights::write = FILE_ATTRIBUTE_NORMAL ;
-unsigned int const file_flags<win32>::on_construction_rights::execute = FILE_ATTRIBUTE_READONLY;
+BOOST_STATIC_ASSERT( file_open_flags<win32>::handle_access_rights::read == GENERIC_READ );
+BOOST_STATIC_ASSERT( file_open_flags<win32>::handle_access_rights::write == GENERIC_WRITE );
+BOOST_STATIC_ASSERT( file_open_flags<win32>::handle_access_rights::execute == GENERIC_EXECUTE );
+BOOST_STATIC_ASSERT( file_open_flags<win32>::handle_access_rights::all == GENERIC_ALL );
+
+BOOST_STATIC_ASSERT( file_open_flags<win32>::system_hints::random_access == FILE_FLAG_RANDOM_ACCESS );
+BOOST_STATIC_ASSERT( file_open_flags<win32>::system_hints::sequential_access == FILE_FLAG_SEQUENTIAL_SCAN );
+BOOST_STATIC_ASSERT( file_open_flags<win32>::system_hints::avoid_caching == ( FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH ) );
+BOOST_STATIC_ASSERT( file_open_flags<win32>::system_hints::temporary == ( FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE ) );
+
+BOOST_STATIC_ASSERT( file_open_flags<win32>::on_construction_rights::read == FILE_ATTRIBUTE_READONLY );
+BOOST_STATIC_ASSERT( file_open_flags<win32>::on_construction_rights::write == FILE_ATTRIBUTE_NORMAL );
+BOOST_STATIC_ASSERT( file_open_flags<win32>::on_construction_rights::execute == FILE_ATTRIBUTE_READONLY );
BOOST_IMPL_INLINE
-file_flags<win32> file_flags<win32>::create
+file_open_flags<win32> file_open_flags<win32>::create
(
- unsigned int const handle_access_flags ,
- unsigned int const share_mode ,
- open_policy_t const open_flags ,
- unsigned int const system_hints ,
- unsigned int const on_construction_rights
+ flags_t const handle_access_flags ,
+ open_policy::value_type const open_flags ,
+ flags_t const system_hints ,
+ flags_t const on_construction_rights
)
{
- file_flags<win32> const flags =
+ file_open_flags<win32> const flags =
{
handle_access_flags, // desired_access
- share_mode, // share_mode
open_flags, // creation_disposition
system_hints
|
(
( on_construction_rights & FILE_ATTRIBUTE_NORMAL )
- ? ( on_construction_rights & ~FILE_ATTRIBUTE_READONLY )
- : on_construction_rights
+ ? FILE_ATTRIBUTE_NORMAL
+ : on_construction_rights
) // flags_and_attributes
};
@@ -79,18 +72,16 @@
BOOST_IMPL_INLINE
-file_flags<win32> file_flags<win32>::create_for_opening_existing_files
+file_open_flags<win32> file_open_flags<win32>::create_for_opening_existing_files
(
- unsigned int const handle_access_flags,
- unsigned int const share_mode,
- bool const truncate,
- unsigned int const system_hints
+ flags_t const handle_access_flags,
+ bool const truncate,
+ flags_t const system_hints
)
{
return create
(
handle_access_flags,
- share_mode,
truncate
? open_policy::open_and_truncate_existing
: open_policy::open_existing,
Copied: sandbox/mmap/boost/mmap/mappble_objects/shared_memory/posix/flags.hpp (from r74074, /sandbox/mmap/boost/mmap/mapped_view.hpp)
==============================================================================
--- /sandbox/mmap/boost/mmap/mapped_view.hpp (original)
+++ sandbox/mmap/boost/mmap/mappble_objects/shared_memory/posix/flags.hpp 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////////////////////////
///
-/// \file mapped_view.hpp
-/// ---------------------
+/// \file flags.hpp
+/// ---------------
///
/// Copyright (c) Domagoj Saric 2010.-2011.
///
@@ -13,31 +13,12 @@
///
////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
-#ifndef mapped_view_hpp__D9C84FF5_E506_4ECB_9778_61E036048D28
-#define mapped_view_hpp__D9C84FF5_E506_4ECB_9778_61E036048D28
+#ifndef flags_hpp__F9CD9C91_1F07_4107_A422_0D814F0FE487
+#define flags_hpp__F9CD9C91_1F07_4107_A422_0D814F0FE487
#pragma once
//------------------------------------------------------------------------------
-#include "handles/handle.hpp"
-//...zzz...
-#include "mappble_objects/file/file.hpp"
-#include "mappble_objects/file/posix/file.hpp"
-#ifdef _WIN32
-#include "mappble_objects/file/win32/file.hpp"
-#endif // _WIN32
-
-#include "boost/assert.hpp"
-#include "boost/noncopyable.hpp"
-#include "boost/range/iterator_range.hpp"
-
-#ifndef _WIN32
- #include "fcntl.h"
-#endif // _WIN32
-
-#ifdef _WIN32
- #define BOOST_AUX_IO_WIN32_OR_POSIX( win32, posix ) win32
-#else
- #define BOOST_AUX_IO_WIN32_OR_POSIX( win32, posix ) posix
-#endif
+#include "../../file/posix/mapping_flags.hpp"
+#include "../../../detail/posix.hpp"
//------------------------------------------------------------------------------
namespace boost
{
@@ -46,274 +27,33 @@
{
//------------------------------------------------------------------------------
-// Implementation note:
-// Using structs with public members and factory functions to enable (almost)
-// zero-overhead 'link-time' conversion to native flag formats and to allow the
-// user to modify the created flags or create fully custom ones so that specific
-// platform-dependent use-cases, not otherwise covered through the generic
-// interface, can also be covered.
-// (10.10.2010.) (Domagoj Saric)
-
-struct mapping_flags
-{
- struct handle_access_rights
- {
- static unsigned int const read ;
- static unsigned int const write ;
- static unsigned int const execute;
- };
-
- struct share_mode
- {
- static unsigned int const shared;
- static unsigned int const hidden;
- };
-
- struct system_hint
- {
- static unsigned int const lock_to_ram ;
- static unsigned int const reserve_page_file_space;
- static unsigned int const precommit ;
- static unsigned int const uninitialized ;
- };
-
- static mapping_flags create
- (
- unsigned int handle_access_rights,
- unsigned int share_mode ,
- unsigned int system_hints
- );
-
-#ifdef _WIN32
- unsigned int create_mapping_flags;
- unsigned int map_view_flags;
-#else
- int protection;
- int flags ;
-#endif // _WIN32
-};
-
+template <typename Impl> struct shared_memory_flags;
-typedef iterator_range<unsigned char *> basic_memory_range_t;
-typedef iterator_range<unsigned char const *> basic_read_only_memory_range_t;
+struct posix;
-template <typename Element>
-class mapped_view_reference;
+typedef unsigned flags_t;
-typedef mapped_view_reference<unsigned char > basic_mapped_view_ref;
-typedef mapped_view_reference<unsigned char const> basic_mapped_read_only_view_ref;
-
-namespace detail
+template <>
+struct shared_memory_flags<posix> : file_mapping_flags<posix>
{
- template <typename Element>
- class mapped_view_base : public iterator_range<Element *>
+ struct system_hints
{
- public:
- typedef iterator_range<Element *> memory_range_t;
-
- public: // Factory methods.
- static void unmap( mapped_view_base const & );
-
- protected:
- mapped_view_base( iterator_range<Element *> const & mapped_range ) : iterator_range<Element *>( mapped_range ) {}
- mapped_view_base( Element * const p_begin, Element * const p_end ) : iterator_range<Element *>( p_begin, p_end ) {}
-
- static mapped_view_reference<unsigned char const>
- #ifdef BOOST_MSVC
- const &
- #endif
- make_basic_view( mapped_view_base<Element> const & );
-
- static mapped_view_reference<Element>
- #ifdef BOOST_MSVC
- const &
- #endif
- make_typed_range( mapped_view_base<unsigned char> const & );
-
- private: // Hide mutable members
- void advance_begin();
- void advance_end ();
-
- void pop_front();
- void pop_back ();
+ enum value_type
+ {
+ default = 0,
+ only_reserve_address_space = MAP_NORESERVE
+ }
};
-
- template <typename Element>
- void mapped_view_base<Element>::unmap( mapped_view_base<Element> const & mapped_range )
- {
- mapped_view_base<unsigned char const>::unmap( make_basic_view( mapped_range ) );
- }
-
- template <>
- void mapped_view_base<unsigned char const>::unmap( mapped_view_base<unsigned char const> const & );
-} // namespace detail
-
-template <typename Element>
-class mapped_view_reference : public detail::mapped_view_base<Element>
-{
-public:
- basic_memory_range_t basic_range() const
- {
- return basic_memory_range_t
- (
- static_cast<unsigned char *>( static_cast<void *>( this->begin() ) ),
- static_cast<unsigned char *>( static_cast<void *>( this->end () ) )
- );
- }
-
-public: // Factory methods.
- static mapped_view_reference map
+ static shared_memory_flags<posix> create
(
- native_handle::reference,
- mapping_flags const &,
- std::size_t desired_size = 0,
- std::size_t offset = 0
+ flags_t combined_handle_access_rights,
+ share_mode ::value_type share_mode,
+ system_hints::value_type system_hint
);
-
-private:
- template <typename T> friend class detail::mapped_view_base;
-
- mapped_view_reference( iterator_range<Element *> const & mapped_range ) : detail::mapped_view_base<Element>( mapped_range ) {}
- mapped_view_reference( Element * const p_begin, Element * const p_end ) : detail::mapped_view_base<Element>( p_begin, p_end ) {}
-};
-
-template <typename Element>
-class mapped_view_reference<Element const> : public detail::mapped_view_base<Element const>
-{
-public:
- basic_memory_range_t basic_range() const
- {
- return basic_memory_range_t
- (
- static_cast<unsigned char const *>( static_cast<void const *>( this->begin() ) ),
- static_cast<unsigned char const *>( static_cast<void const *>( this->end () ) )
- );
- }
-
-public: // Factory methods.
- static mapped_view_reference map
- (
- native_handle::reference object_handle,
- std::size_t desired_size = 0,
- std::size_t offset = 0,
- bool map_for_code_execution = false
- );
-
-private:
- template <typename T> friend class detail::mapped_view_base;
-
- mapped_view_reference( iterator_range<Element const *> const & mapped_range ) : detail::mapped_view_base<Element const>( mapped_range ) {}
- mapped_view_reference( Element const * const p_begin, Element const * const p_end ) : detail::mapped_view_base<Element const>( p_begin, p_end ) {}
- mapped_view_reference( mapped_view_reference<Element> const & mutable_view ) : detail::mapped_view_base<Element const>( mutable_view ) {}
-};
-
-
-namespace detail
-{
- // Implementation note:
- // These have to be defined after mapped_view_reference for eager
- // compilers (e.g. GCC and Clang).
- // (14.07.2011.) (Domagoj Saric)
-
- template <typename Element>
- mapped_view_reference<unsigned char const>
- #ifdef BOOST_MSVC
- const &
- #endif
- mapped_view_base<Element>::make_basic_view( mapped_view_base<Element> const & range )
- {
- return
- #ifdef BOOST_MSVC
- reinterpret_cast<mapped_view_reference<unsigned char const> const &>( range );
- #else // compiler might care about strict aliasing rules
- mapped_view_reference<unsigned char const>
- (
- static_cast<unsigned char const *>( static_cast<void const *>( range.begin() ) ),
- static_cast<unsigned char const *>( static_cast<void const *>( range.end () ) )
- );
- #endif // compiler
- }
-
-
- template <typename Element>
- mapped_view_reference<Element>
- #ifdef BOOST_MSVC
- const &
- #endif
- mapped_view_base<Element>::make_typed_range( mapped_view_base<unsigned char> const & range )
- {
- BOOST_ASSERT( reinterpret_cast<std::size_t>( range.begin() ) % sizeof( Element ) == 0 );
- BOOST_ASSERT( reinterpret_cast<std::size_t>( range.end () ) % sizeof( Element ) == 0 );
- BOOST_ASSERT( range.size () % sizeof( Element ) == 0 );
- return
- #ifdef BOOST_MSVC
- reinterpret_cast<mapped_view_reference<Element> const &>( range );
- #else // compiler might care about strict aliasing rules
- mapped_view_reference<unsigned char const>
- (
- static_cast<Element *>( static_cast<void *>( range.begin() ) ),
- static_cast<Element *>( static_cast<void *>( range.end () ) )
- );
- #endif // compiler
- }
-} // namespace detail
-
-
-template <typename Handle>
-struct is_mappable : mpl::false_ {};
-
-template <> struct is_mappable<char *> : mpl::true_ {};
-template <> struct is_mappable<char const *> : mpl::true_ {};
-template <> struct is_mappable<FILE *> : mpl::true_ {};
-template <> struct is_mappable<handle<posix>::native_handle_t > : mpl::true_ {};
-#ifdef _WIN32
-template <> struct is_mappable<wchar_t *> : mpl::true_ {};
-template <> struct is_mappable<wchar_t const *> : mpl::true_ {};
-template <> struct is_mappable<handle<win32>::native_handle_t > : mpl::true_ {};
-#endif // _WIN32
-
-
-template <>
-mapped_view_reference<unsigned char> mapped_view_reference<unsigned char>::map
-(
- native_handle::reference,
- mapping_flags const &,
- std::size_t desired_size,
- std::size_t offset
-);
-
-template <>
-mapped_view_reference<unsigned char const> mapped_view_reference<unsigned char const>::map
-(
- native_handle::reference object_handle,
- std::size_t desired_size,
- std::size_t offset,
- bool map_for_code_execution
-);
-
-
-template <typename Element>
-class mapped_view
- :
- public mapped_view_reference<Element>
- #ifdef BOOST_MSVC
- ,private noncopyable
- #endif // BOOST_MSVC
-{
-public:
- mapped_view( mapped_view_reference<Element> const range ) : mapped_view_reference<Element>( range ) {}
- ~mapped_view<Element>() { mapped_view_reference<Element>::unmap( *this ); }
-
- #ifndef BOOST_MSVC
- mapped_view( mapped_view const & ); // noncopyable
- #endif // BOOST_MSVC
};
-basic_mapped_view_ref map_file ( char const * file_name, std::size_t desired_size );
-basic_mapped_read_only_view_ref map_read_only_file( char const * file_name );
-
//------------------------------------------------------------------------------
} // namespace mmap
//------------------------------------------------------------------------------
@@ -321,7 +61,7 @@
//------------------------------------------------------------------------------
#ifdef BOOST_MMAP_HEADER_ONLY
- #include "mapped_view.inl"
+ #include "flags.inl"
#endif
-#endif // mapped_view_hpp
+#endif // flags.hpp
Copied: sandbox/mmap/boost/mmap/mappble_objects/shared_memory/posix/flags.inl (from r74074, /sandbox/mmap/boost/mmap/mapped_view.inl)
==============================================================================
--- /sandbox/mmap/boost/mmap/mapped_view.inl (original)
+++ sandbox/mmap/boost/mmap/mappble_objects/shared_memory/posix/flags.inl 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////////////////////////
///
-/// \file mapped_view.inl
-/// ---------------------
+/// \file flags.inl
+/// ---------------
///
/// Copyright (c) Domagoj Saric 2010.-2011.
///
@@ -13,39 +13,7 @@
///
////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
-#include "mapped_view.hpp"
-
-#include "detail/impl_inline.hpp"
-#include "implementations.hpp"
-#include "mappble_objects/file/handle.hpp"
-
-#include "boost/assert.hpp"
-
-#ifdef _WIN32
- #ifndef WIN32_LEAN_AND_MEAN
- #define WIN32_LEAN_AND_MEAN
- #endif // WIN32_LEAN_AND_MEAN
- #include "windows.h"
-
- #pragma warning ( disable : 4996 ) // "The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name."
- #include "io.h"
-#else
- #include "sys/mman.h" // mmap, munmap.
- #include "sys/stat.h"
- #include "sys/types.h" // struct stat.
- #include "unistd.h" // sysconf.
-#endif // _WIN32
-#include "errno.h"
-#include "fcntl.h"
-
-#ifndef _WIN32
- #ifdef __APPLE__
- #define BOOST_AUX_MMAP_POSIX_OR_OSX( posix, osx ) osx
- #else
- #define BOOST_AUX_MMAP_POSIX_OR_OSX( posix, osx ) posix
- #endif
-#endif
-
+#include "flags.hpp"
//------------------------------------------------------------------------------
namespace boost
{
@@ -54,223 +22,19 @@
{
//------------------------------------------------------------------------------
-unsigned int const mapping_flags::handle_access_rights::read = BOOST_AUX_IO_WIN32_OR_POSIX( FILE_MAP_READ , PROT_READ );
-unsigned int const mapping_flags::handle_access_rights::write = BOOST_AUX_IO_WIN32_OR_POSIX( FILE_MAP_WRITE , PROT_WRITE );
-unsigned int const mapping_flags::handle_access_rights::execute = BOOST_AUX_IO_WIN32_OR_POSIX( FILE_MAP_EXECUTE, PROT_EXEC );
-
-unsigned int const mapping_flags::share_mode::shared = BOOST_AUX_IO_WIN32_OR_POSIX( 0, MAP_SHARED );
-unsigned int const mapping_flags::share_mode::hidden = BOOST_AUX_IO_WIN32_OR_POSIX( FILE_MAP_COPY, MAP_PRIVATE );
-
-unsigned int const mapping_flags::system_hint::lock_to_ram = BOOST_AUX_IO_WIN32_OR_POSIX( SEC_COMMIT , BOOST_AUX_MMAP_POSIX_OR_OSX( MAP_LOCKED, 0 ) );
-unsigned int const mapping_flags::system_hint::reserve_page_file_space = BOOST_AUX_IO_WIN32_OR_POSIX( SEC_RESERVE, /*khm#1*/MAP_NORESERVE );
-unsigned int const mapping_flags::system_hint::precommit = BOOST_AUX_IO_WIN32_OR_POSIX( SEC_COMMIT , BOOST_AUX_MMAP_POSIX_OR_OSX( MAP_POPULATE, 0 ) );
-unsigned int const mapping_flags::system_hint::uninitialized = BOOST_AUX_IO_WIN32_OR_POSIX( 0, BOOST_AUX_MMAP_POSIX_OR_OSX( MAP_UNINITIALIZED, 0 ) );
-
-
BOOST_IMPL_INLINE
-mapping_flags mapping_flags::create
+shared_memory_flags<posix> shared_memory_flags<posix>::create
(
- unsigned int const handle_access_flags,
- unsigned int const share_mode ,
- unsigned int const system_hints
+ flags_t const combined_handle_access_flags,
+ share_mode ::value_type const share_mode,
+ system_hints::value_type const system_hint
)
{
- mapping_flags flags;
-
-#ifdef _WIN32
- flags.create_mapping_flags = ( handle_access_flags & handle_access_rights::execute ) ? PAGE_EXECUTE : PAGE_NOACCESS;
- if ( share_mode == share_mode::hidden ) // WRITECOPY
- flags.create_mapping_flags *= 8;
- else
- if ( handle_access_flags & handle_access_rights::write )
- flags.create_mapping_flags *= 4;
- else
- {
- BOOST_ASSERT( handle_access_flags & handle_access_rights::read );
- flags.create_mapping_flags *= 2;
- }
-
- flags.create_mapping_flags |= system_hints;
-
- flags.map_view_flags = handle_access_flags;
-#else
- flags.protection = handle_access_flags;
- flags.flags = share_mode | system_hints;
- if ( ( system_hints & system_hint::reserve_page_file_space ) ) /*khm#1*/
- flags.flags &= ~MAP_NORESERVE;
- else
- flags.flags |= MAP_NORESERVE;
-#endif // _WIN32
-
+ shared_memory_flags<posix> flags( file_mapping_flags<posix>::create( combined_handle_access_flags, share_mode ) );
+ flags.flags |= system_hint;
return flags;
}
-
-template <> BOOST_IMPL_INLINE
-mapped_view_reference<unsigned char> mapped_view_reference<unsigned char>::map
-(
- native_handle::reference const object_handle,
- mapping_flags const & flags,
- std::size_t const desired_size,
- std::size_t const offset
-)
-{
- typedef mapped_view_reference<unsigned char>::iterator iterator_t;
-
-#ifdef _WIN32
-
- // Implementation note:
- // Mapped views hold internal references to the following handles so we do
- // not need to hold/store them ourselves:
- // http://msdn.microsoft.com/en-us/library/aa366537(VS.85).aspx
- // (26.03.2010.) (Domagoj Saric)
-
- ULARGE_INTEGER large_integer;
-
- // CreateFileMapping accepts INVALID_HANDLE_VALUE as valid input but only if
- // the size parameter is not null.
- large_integer.QuadPart = desired_size;
- handle<win32> const mapping
- (
- ::CreateFileMappingW( object_handle, 0, flags.create_mapping_flags, large_integer.HighPart, large_integer.LowPart, 0 )
- );
- BOOST_ASSERT
- (
- !mapping || ( object_handle == INVALID_HANDLE_VALUE ) || ( desired_size != 0 )
- );
-
- large_integer.QuadPart = offset;
- iterator_t const view_start( static_cast<iterator_t>( ::MapViewOfFile( mapping.get(), flags.map_view_flags, large_integer.HighPart, large_integer.LowPart, desired_size ) ) );
- return mapped_view_reference<unsigned char>
- (
- view_start,
- ( view_start && ( object_handle != INVALID_HANDLE_VALUE ) )
- ? view_start + desired_size
- : view_start
- );
-
-#else // POSIX
-
- iterator_t const view_start( static_cast<iterator_t>( ::mmap( 0, desired_size, flags.protection, flags.flags, object_handle, 0 ) ) );
- return mapped_view_reference<unsigned char>
- (
- view_start,
- ( view_start != MAP_FAILED )
- ? view_start + desired_size
- : view_start
- );
-
-#endif // OS API
-}
-
-
-template <> BOOST_IMPL_INLINE
-void detail::mapped_view_base<unsigned char const>::unmap( detail::mapped_view_base<unsigned char const> const & mapped_range )
-{
-#ifdef _WIN32
- BOOST_VERIFY( ::UnmapViewOfFile( mapped_range.begin() ) || mapped_range.empty() );
-#else
- BOOST_VERIFY( ( ::munmap ( const_cast<unsigned char *>( mapped_range.begin() ), mapped_range.size() ) == 0 ) || mapped_range.empty() );
-#endif // _WIN32
-}
-
-
-template <> BOOST_IMPL_INLINE
-mapped_view_reference<unsigned char const> mapped_view_reference<unsigned char const>::map
-(
- native_handle::reference const object_handle,
- std::size_t const desired_size,
- std::size_t const offset,
- bool const map_for_code_execution
-)
-{
- return mapped_view_reference<unsigned char>::map
- (
- object_handle,
- mapping_flags::create
- (
- mapping_flags::handle_access_rights::read | ( map_for_code_execution ? mapping_flags::handle_access_rights::execute : 0 ),
- mapping_flags::share_mode::shared,
- mapping_flags::system_hint::uninitialized
- ),
- desired_size,
- offset
- );
-}
-
-
-BOOST_IMPL_INLINE
-basic_mapped_view_ref map_file( char const * const file_name, std::size_t desired_size )
-{
- typedef native_file_flags file_flags;
- file_handle<BOOST_MMAP_IMPL()> const file_handle
- (
- create_file
- (
- file_name,
- file_flags::create
- (
- file_flags::handle_access_rights::read | file_flags::handle_access_rights::write,
- file_flags::share_mode ::read,
- file_flags::open_policy::open_or_create,
- file_flags::system_hints ::sequential_access,
- file_flags::on_construction_rights::read | file_flags::on_construction_rights::write
- )
- )
- );
-
- if ( desired_size )
- set_size( file_handle.get(), desired_size );
- else
- desired_size = get_size( file_handle.get() );
-
- return basic_mapped_view_ref::map
- (
- file_handle.get(),
- mapping_flags::create
- (
- mapping_flags::handle_access_rights::read | mapping_flags::handle_access_rights::write,
- mapping_flags::share_mode::shared,
- mapping_flags::system_hint::uninitialized
- ),
- desired_size,
- 0
- );
-}
-
-
-BOOST_IMPL_INLINE
-basic_mapped_read_only_view_ref map_read_only_file( char const * const file_name )
-{
- typedef native_file_flags file_flags;
- file_handle<BOOST_MMAP_IMPL()> const file_handle
- (
- create_file
- (
- file_name,
- file_flags::create_for_opening_existing_files
- (
- file_flags::handle_access_rights::read,
- file_flags::share_mode ::read | file_flags::share_mode::write,
- false,
- file_flags::system_hints ::sequential_access
- )
- )
- );
-
- return basic_mapped_read_only_view_ref::map
- (
- file_handle.get(),
- // Implementation note:
- // Windows APIs interpret zero as 'whole file' but we still need to
- // query the file size in order to be able to properly set the end
- // pointer.
- // (13.07.2011.) (Domagoj Saric)
- get_size( file_handle.get() )
- );
-}
-
-
//------------------------------------------------------------------------------
} // mmap
//------------------------------------------------------------------------------
Copied: sandbox/mmap/boost/mmap/mappble_objects/shared_memory/win32/flags.hpp (from r74074, /sandbox/mmap/boost/mmap/mapped_view.hpp)
==============================================================================
--- /sandbox/mmap/boost/mmap/mapped_view.hpp (original)
+++ sandbox/mmap/boost/mmap/mappble_objects/shared_memory/win32/flags.hpp 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////////////////////////
///
-/// \file mapped_view.hpp
-/// ---------------------
+/// \file mapping_flags.hpp
+/// -----------------------
///
/// Copyright (c) Domagoj Saric 2010.-2011.
///
@@ -13,31 +13,11 @@
///
////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
-#ifndef mapped_view_hpp__D9C84FF5_E506_4ECB_9778_61E036048D28
-#define mapped_view_hpp__D9C84FF5_E506_4ECB_9778_61E036048D28
+#ifndef flags_hpp__504C3F9E_97C2_4E8C_82C6_881340C5FBA6
+#define flags_hpp__504C3F9E_97C2_4E8C_82C6_881340C5FBA6
#pragma once
//------------------------------------------------------------------------------
-#include "handles/handle.hpp"
-//...zzz...
-#include "mappble_objects/file/file.hpp"
-#include "mappble_objects/file/posix/file.hpp"
-#ifdef _WIN32
-#include "mappble_objects/file/win32/file.hpp"
-#endif // _WIN32
-
-#include "boost/assert.hpp"
-#include "boost/noncopyable.hpp"
-#include "boost/range/iterator_range.hpp"
-
-#ifndef _WIN32
- #include "fcntl.h"
-#endif // _WIN32
-
-#ifdef _WIN32
- #define BOOST_AUX_IO_WIN32_OR_POSIX( win32, posix ) win32
-#else
- #define BOOST_AUX_IO_WIN32_OR_POSIX( win32, posix ) posix
-#endif
+#include "../../file/win32/mapping_flags.hpp"
//------------------------------------------------------------------------------
namespace boost
{
@@ -46,274 +26,33 @@
{
//------------------------------------------------------------------------------
-// Implementation note:
-// Using structs with public members and factory functions to enable (almost)
-// zero-overhead 'link-time' conversion to native flag formats and to allow the
-// user to modify the created flags or create fully custom ones so that specific
-// platform-dependent use-cases, not otherwise covered through the generic
-// interface, can also be covered.
-// (10.10.2010.) (Domagoj Saric)
-
-struct mapping_flags
-{
- struct handle_access_rights
- {
- static unsigned int const read ;
- static unsigned int const write ;
- static unsigned int const execute;
- };
-
- struct share_mode
- {
- static unsigned int const shared;
- static unsigned int const hidden;
- };
-
- struct system_hint
- {
- static unsigned int const lock_to_ram ;
- static unsigned int const reserve_page_file_space;
- static unsigned int const precommit ;
- static unsigned int const uninitialized ;
- };
-
- static mapping_flags create
- (
- unsigned int handle_access_rights,
- unsigned int share_mode ,
- unsigned int system_hints
- );
-
-#ifdef _WIN32
- unsigned int create_mapping_flags;
- unsigned int map_view_flags;
-#else
- int protection;
- int flags ;
-#endif // _WIN32
-};
-
+template <typename Impl> struct shared_memory_flags;
-typedef iterator_range<unsigned char *> basic_memory_range_t;
-typedef iterator_range<unsigned char const *> basic_read_only_memory_range_t;
+struct win32;
-template <typename Element>
-class mapped_view_reference;
+typedef unsigned flags_t;
-typedef mapped_view_reference<unsigned char > basic_mapped_view_ref;
-typedef mapped_view_reference<unsigned char const> basic_mapped_read_only_view_ref;
-
-namespace detail
+template <>
+struct shared_memory_flags<win32> : file_mapping_flags<win32>
{
- template <typename Element>
- class mapped_view_base : public iterator_range<Element *>
+ struct system_hints
{
- public:
- typedef iterator_range<Element *> memory_range_t;
-
- public: // Factory methods.
- static void unmap( mapped_view_base const & );
-
- protected:
- mapped_view_base( iterator_range<Element *> const & mapped_range ) : iterator_range<Element *>( mapped_range ) {}
- mapped_view_base( Element * const p_begin, Element * const p_end ) : iterator_range<Element *>( p_begin, p_end ) {}
-
- static mapped_view_reference<unsigned char const>
- #ifdef BOOST_MSVC
- const &
- #endif
- make_basic_view( mapped_view_base<Element> const & );
-
- static mapped_view_reference<Element>
- #ifdef BOOST_MSVC
- const &
- #endif
- make_typed_range( mapped_view_base<unsigned char> const & );
-
- private: // Hide mutable members
- void advance_begin();
- void advance_end ();
-
- void pop_front();
- void pop_back ();
+ enum value_type
+ {
+ default = 0x8000000,
+ only_reserve_address_space = 0x4000000
+ }
};
-
- template <typename Element>
- void mapped_view_base<Element>::unmap( mapped_view_base<Element> const & mapped_range )
- {
- mapped_view_base<unsigned char const>::unmap( make_basic_view( mapped_range ) );
- }
-
- template <>
- void mapped_view_base<unsigned char const>::unmap( mapped_view_base<unsigned char const> const & );
-} // namespace detail
-
-template <typename Element>
-class mapped_view_reference : public detail::mapped_view_base<Element>
-{
-public:
- basic_memory_range_t basic_range() const
- {
- return basic_memory_range_t
- (
- static_cast<unsigned char *>( static_cast<void *>( this->begin() ) ),
- static_cast<unsigned char *>( static_cast<void *>( this->end () ) )
- );
- }
-
-public: // Factory methods.
- static mapped_view_reference map
+ static shared_memory_flags<win32> create
(
- native_handle::reference,
- mapping_flags const &,
- std::size_t desired_size = 0,
- std::size_t offset = 0
+ flags_t combined_handle_access_rights,
+ share_mode ::value_type share_mode,
+ system_hints::value_type system_hint
);
-
-private:
- template <typename T> friend class detail::mapped_view_base;
-
- mapped_view_reference( iterator_range<Element *> const & mapped_range ) : detail::mapped_view_base<Element>( mapped_range ) {}
- mapped_view_reference( Element * const p_begin, Element * const p_end ) : detail::mapped_view_base<Element>( p_begin, p_end ) {}
-};
-
-template <typename Element>
-class mapped_view_reference<Element const> : public detail::mapped_view_base<Element const>
-{
-public:
- basic_memory_range_t basic_range() const
- {
- return basic_memory_range_t
- (
- static_cast<unsigned char const *>( static_cast<void const *>( this->begin() ) ),
- static_cast<unsigned char const *>( static_cast<void const *>( this->end () ) )
- );
- }
-
-public: // Factory methods.
- static mapped_view_reference map
- (
- native_handle::reference object_handle,
- std::size_t desired_size = 0,
- std::size_t offset = 0,
- bool map_for_code_execution = false
- );
-
-private:
- template <typename T> friend class detail::mapped_view_base;
-
- mapped_view_reference( iterator_range<Element const *> const & mapped_range ) : detail::mapped_view_base<Element const>( mapped_range ) {}
- mapped_view_reference( Element const * const p_begin, Element const * const p_end ) : detail::mapped_view_base<Element const>( p_begin, p_end ) {}
- mapped_view_reference( mapped_view_reference<Element> const & mutable_view ) : detail::mapped_view_base<Element const>( mutable_view ) {}
-};
-
-
-namespace detail
-{
- // Implementation note:
- // These have to be defined after mapped_view_reference for eager
- // compilers (e.g. GCC and Clang).
- // (14.07.2011.) (Domagoj Saric)
-
- template <typename Element>
- mapped_view_reference<unsigned char const>
- #ifdef BOOST_MSVC
- const &
- #endif
- mapped_view_base<Element>::make_basic_view( mapped_view_base<Element> const & range )
- {
- return
- #ifdef BOOST_MSVC
- reinterpret_cast<mapped_view_reference<unsigned char const> const &>( range );
- #else // compiler might care about strict aliasing rules
- mapped_view_reference<unsigned char const>
- (
- static_cast<unsigned char const *>( static_cast<void const *>( range.begin() ) ),
- static_cast<unsigned char const *>( static_cast<void const *>( range.end () ) )
- );
- #endif // compiler
- }
-
-
- template <typename Element>
- mapped_view_reference<Element>
- #ifdef BOOST_MSVC
- const &
- #endif
- mapped_view_base<Element>::make_typed_range( mapped_view_base<unsigned char> const & range )
- {
- BOOST_ASSERT( reinterpret_cast<std::size_t>( range.begin() ) % sizeof( Element ) == 0 );
- BOOST_ASSERT( reinterpret_cast<std::size_t>( range.end () ) % sizeof( Element ) == 0 );
- BOOST_ASSERT( range.size () % sizeof( Element ) == 0 );
- return
- #ifdef BOOST_MSVC
- reinterpret_cast<mapped_view_reference<Element> const &>( range );
- #else // compiler might care about strict aliasing rules
- mapped_view_reference<unsigned char const>
- (
- static_cast<Element *>( static_cast<void *>( range.begin() ) ),
- static_cast<Element *>( static_cast<void *>( range.end () ) )
- );
- #endif // compiler
- }
-} // namespace detail
-
-
-template <typename Handle>
-struct is_mappable : mpl::false_ {};
-
-template <> struct is_mappable<char *> : mpl::true_ {};
-template <> struct is_mappable<char const *> : mpl::true_ {};
-template <> struct is_mappable<FILE *> : mpl::true_ {};
-template <> struct is_mappable<handle<posix>::native_handle_t > : mpl::true_ {};
-#ifdef _WIN32
-template <> struct is_mappable<wchar_t *> : mpl::true_ {};
-template <> struct is_mappable<wchar_t const *> : mpl::true_ {};
-template <> struct is_mappable<handle<win32>::native_handle_t > : mpl::true_ {};
-#endif // _WIN32
-
-
-template <>
-mapped_view_reference<unsigned char> mapped_view_reference<unsigned char>::map
-(
- native_handle::reference,
- mapping_flags const &,
- std::size_t desired_size,
- std::size_t offset
-);
-
-template <>
-mapped_view_reference<unsigned char const> mapped_view_reference<unsigned char const>::map
-(
- native_handle::reference object_handle,
- std::size_t desired_size,
- std::size_t offset,
- bool map_for_code_execution
-);
-
-
-template <typename Element>
-class mapped_view
- :
- public mapped_view_reference<Element>
- #ifdef BOOST_MSVC
- ,private noncopyable
- #endif // BOOST_MSVC
-{
-public:
- mapped_view( mapped_view_reference<Element> const range ) : mapped_view_reference<Element>( range ) {}
- ~mapped_view<Element>() { mapped_view_reference<Element>::unmap( *this ); }
-
- #ifndef BOOST_MSVC
- mapped_view( mapped_view const & ); // noncopyable
- #endif // BOOST_MSVC
};
-basic_mapped_view_ref map_file ( char const * file_name, std::size_t desired_size );
-basic_mapped_read_only_view_ref map_read_only_file( char const * file_name );
-
//------------------------------------------------------------------------------
} // namespace mmap
//------------------------------------------------------------------------------
@@ -321,7 +60,7 @@
//------------------------------------------------------------------------------
#ifdef BOOST_MMAP_HEADER_ONLY
- #include "mapped_view.inl"
+ #include "flags.inl"
#endif
-#endif // mapped_view_hpp
+#endif // flags.hpp
Copied: sandbox/mmap/boost/mmap/mappble_objects/shared_memory/win32/flags.inl (from r74074, /sandbox/mmap/boost/mmap/mapped_view.inl)
==============================================================================
--- /sandbox/mmap/boost/mmap/mapped_view.inl (original)
+++ sandbox/mmap/boost/mmap/mappble_objects/shared_memory/win32/flags.inl 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////////////////////////
///
-/// \file mapped_view.inl
-/// ---------------------
+/// \file flags.inl
+/// ---------------
///
/// Copyright (c) Domagoj Saric 2010.-2011.
///
@@ -13,39 +13,11 @@
///
////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
-#include "mapped_view.hpp"
+#include "flags.hpp"
-#include "detail/impl_inline.hpp"
-#include "implementations.hpp"
-#include "mappble_objects/file/handle.hpp"
-
-#include "boost/assert.hpp"
-
-#ifdef _WIN32
- #ifndef WIN32_LEAN_AND_MEAN
- #define WIN32_LEAN_AND_MEAN
- #endif // WIN32_LEAN_AND_MEAN
- #include "windows.h"
-
- #pragma warning ( disable : 4996 ) // "The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name."
- #include "io.h"
-#else
- #include "sys/mman.h" // mmap, munmap.
- #include "sys/stat.h"
- #include "sys/types.h" // struct stat.
- #include "unistd.h" // sysconf.
-#endif // _WIN32
-#include "errno.h"
-#include "fcntl.h"
-
-#ifndef _WIN32
- #ifdef __APPLE__
- #define BOOST_AUX_MMAP_POSIX_OR_OSX( posix, osx ) osx
- #else
- #define BOOST_AUX_MMAP_POSIX_OR_OSX( posix, osx ) posix
- #endif
-#endif
+#include "../../../detail/windows.hpp"
+#include "boost/static_assert.hpp"
//------------------------------------------------------------------------------
namespace boost
{
@@ -54,223 +26,23 @@
{
//------------------------------------------------------------------------------
-unsigned int const mapping_flags::handle_access_rights::read = BOOST_AUX_IO_WIN32_OR_POSIX( FILE_MAP_READ , PROT_READ );
-unsigned int const mapping_flags::handle_access_rights::write = BOOST_AUX_IO_WIN32_OR_POSIX( FILE_MAP_WRITE , PROT_WRITE );
-unsigned int const mapping_flags::handle_access_rights::execute = BOOST_AUX_IO_WIN32_OR_POSIX( FILE_MAP_EXECUTE, PROT_EXEC );
-
-unsigned int const mapping_flags::share_mode::shared = BOOST_AUX_IO_WIN32_OR_POSIX( 0, MAP_SHARED );
-unsigned int const mapping_flags::share_mode::hidden = BOOST_AUX_IO_WIN32_OR_POSIX( FILE_MAP_COPY, MAP_PRIVATE );
-
-unsigned int const mapping_flags::system_hint::lock_to_ram = BOOST_AUX_IO_WIN32_OR_POSIX( SEC_COMMIT , BOOST_AUX_MMAP_POSIX_OR_OSX( MAP_LOCKED, 0 ) );
-unsigned int const mapping_flags::system_hint::reserve_page_file_space = BOOST_AUX_IO_WIN32_OR_POSIX( SEC_RESERVE, /*khm#1*/MAP_NORESERVE );
-unsigned int const mapping_flags::system_hint::precommit = BOOST_AUX_IO_WIN32_OR_POSIX( SEC_COMMIT , BOOST_AUX_MMAP_POSIX_OR_OSX( MAP_POPULATE, 0 ) );
-unsigned int const mapping_flags::system_hint::uninitialized = BOOST_AUX_IO_WIN32_OR_POSIX( 0, BOOST_AUX_MMAP_POSIX_OR_OSX( MAP_UNINITIALIZED, 0 ) );
+BOOST_STATIC_ASSERT( shared_memory_flags<win32>::system_hints::default == SEC_COMMIT );
+BOOST_STATIC_ASSERT( shared_memory_flags<win32>::system_hints::only_reserve_address_space == SEC_RESERVE );
BOOST_IMPL_INLINE
-mapping_flags mapping_flags::create
+shared_memory_flags<win32> shared_memory_flags<win32>::create
(
- unsigned int const handle_access_flags,
- unsigned int const share_mode ,
- unsigned int const system_hints
+ flags_t const combined_handle_access_flags,
+ share_mode ::value_type const share_mode,
+ system_hints::value_type const system_hint
)
{
- mapping_flags flags;
-
-#ifdef _WIN32
- flags.create_mapping_flags = ( handle_access_flags & handle_access_rights::execute ) ? PAGE_EXECUTE : PAGE_NOACCESS;
- if ( share_mode == share_mode::hidden ) // WRITECOPY
- flags.create_mapping_flags *= 8;
- else
- if ( handle_access_flags & handle_access_rights::write )
- flags.create_mapping_flags *= 4;
- else
- {
- BOOST_ASSERT( handle_access_flags & handle_access_rights::read );
- flags.create_mapping_flags *= 2;
- }
-
- flags.create_mapping_flags |= system_hints;
-
- flags.map_view_flags = handle_access_flags;
-#else
- flags.protection = handle_access_flags;
- flags.flags = share_mode | system_hints;
- if ( ( system_hints & system_hint::reserve_page_file_space ) ) /*khm#1*/
- flags.flags &= ~MAP_NORESERVE;
- else
- flags.flags |= MAP_NORESERVE;
-#endif // _WIN32
-
+ shared_memory_flags<win32> flags( file_mapping_flags<win32>::create( combined_handle_access_flags, share_mode ) );
+ flags.create_mapping_flags |= system_hint;
return flags;
}
-
-template <> BOOST_IMPL_INLINE
-mapped_view_reference<unsigned char> mapped_view_reference<unsigned char>::map
-(
- native_handle::reference const object_handle,
- mapping_flags const & flags,
- std::size_t const desired_size,
- std::size_t const offset
-)
-{
- typedef mapped_view_reference<unsigned char>::iterator iterator_t;
-
-#ifdef _WIN32
-
- // Implementation note:
- // Mapped views hold internal references to the following handles so we do
- // not need to hold/store them ourselves:
- // http://msdn.microsoft.com/en-us/library/aa366537(VS.85).aspx
- // (26.03.2010.) (Domagoj Saric)
-
- ULARGE_INTEGER large_integer;
-
- // CreateFileMapping accepts INVALID_HANDLE_VALUE as valid input but only if
- // the size parameter is not null.
- large_integer.QuadPart = desired_size;
- handle<win32> const mapping
- (
- ::CreateFileMappingW( object_handle, 0, flags.create_mapping_flags, large_integer.HighPart, large_integer.LowPart, 0 )
- );
- BOOST_ASSERT
- (
- !mapping || ( object_handle == INVALID_HANDLE_VALUE ) || ( desired_size != 0 )
- );
-
- large_integer.QuadPart = offset;
- iterator_t const view_start( static_cast<iterator_t>( ::MapViewOfFile( mapping.get(), flags.map_view_flags, large_integer.HighPart, large_integer.LowPart, desired_size ) ) );
- return mapped_view_reference<unsigned char>
- (
- view_start,
- ( view_start && ( object_handle != INVALID_HANDLE_VALUE ) )
- ? view_start + desired_size
- : view_start
- );
-
-#else // POSIX
-
- iterator_t const view_start( static_cast<iterator_t>( ::mmap( 0, desired_size, flags.protection, flags.flags, object_handle, 0 ) ) );
- return mapped_view_reference<unsigned char>
- (
- view_start,
- ( view_start != MAP_FAILED )
- ? view_start + desired_size
- : view_start
- );
-
-#endif // OS API
-}
-
-
-template <> BOOST_IMPL_INLINE
-void detail::mapped_view_base<unsigned char const>::unmap( detail::mapped_view_base<unsigned char const> const & mapped_range )
-{
-#ifdef _WIN32
- BOOST_VERIFY( ::UnmapViewOfFile( mapped_range.begin() ) || mapped_range.empty() );
-#else
- BOOST_VERIFY( ( ::munmap ( const_cast<unsigned char *>( mapped_range.begin() ), mapped_range.size() ) == 0 ) || mapped_range.empty() );
-#endif // _WIN32
-}
-
-
-template <> BOOST_IMPL_INLINE
-mapped_view_reference<unsigned char const> mapped_view_reference<unsigned char const>::map
-(
- native_handle::reference const object_handle,
- std::size_t const desired_size,
- std::size_t const offset,
- bool const map_for_code_execution
-)
-{
- return mapped_view_reference<unsigned char>::map
- (
- object_handle,
- mapping_flags::create
- (
- mapping_flags::handle_access_rights::read | ( map_for_code_execution ? mapping_flags::handle_access_rights::execute : 0 ),
- mapping_flags::share_mode::shared,
- mapping_flags::system_hint::uninitialized
- ),
- desired_size,
- offset
- );
-}
-
-
-BOOST_IMPL_INLINE
-basic_mapped_view_ref map_file( char const * const file_name, std::size_t desired_size )
-{
- typedef native_file_flags file_flags;
- file_handle<BOOST_MMAP_IMPL()> const file_handle
- (
- create_file
- (
- file_name,
- file_flags::create
- (
- file_flags::handle_access_rights::read | file_flags::handle_access_rights::write,
- file_flags::share_mode ::read,
- file_flags::open_policy::open_or_create,
- file_flags::system_hints ::sequential_access,
- file_flags::on_construction_rights::read | file_flags::on_construction_rights::write
- )
- )
- );
-
- if ( desired_size )
- set_size( file_handle.get(), desired_size );
- else
- desired_size = get_size( file_handle.get() );
-
- return basic_mapped_view_ref::map
- (
- file_handle.get(),
- mapping_flags::create
- (
- mapping_flags::handle_access_rights::read | mapping_flags::handle_access_rights::write,
- mapping_flags::share_mode::shared,
- mapping_flags::system_hint::uninitialized
- ),
- desired_size,
- 0
- );
-}
-
-
-BOOST_IMPL_INLINE
-basic_mapped_read_only_view_ref map_read_only_file( char const * const file_name )
-{
- typedef native_file_flags file_flags;
- file_handle<BOOST_MMAP_IMPL()> const file_handle
- (
- create_file
- (
- file_name,
- file_flags::create_for_opening_existing_files
- (
- file_flags::handle_access_rights::read,
- file_flags::share_mode ::read | file_flags::share_mode::write,
- false,
- file_flags::system_hints ::sequential_access
- )
- )
- );
-
- return basic_mapped_read_only_view_ref::map
- (
- file_handle.get(),
- // Implementation note:
- // Windows APIs interpret zero as 'whole file' but we still need to
- // query the file size in order to be able to properly set the end
- // pointer.
- // (13.07.2011.) (Domagoj Saric)
- get_size( file_handle.get() )
- );
-}
-
-
//------------------------------------------------------------------------------
} // mmap
//------------------------------------------------------------------------------
Modified: sandbox/mmap/boost/mmap/mapped_view.hpp
==============================================================================
--- sandbox/mmap/boost/mmap/mapped_view.hpp (original)
+++ sandbox/mmap/boost/mmap/mapped_view.hpp 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
@@ -18,26 +18,11 @@
#pragma once
//------------------------------------------------------------------------------
#include "handles/handle.hpp"
-//...zzz...
-#include "mappble_objects/file/file.hpp"
-#include "mappble_objects/file/posix/file.hpp"
-#ifdef _WIN32
-#include "mappble_objects/file/win32/file.hpp"
-#endif // _WIN32
+#include "detail/impl_selection.hpp"
#include "boost/assert.hpp"
#include "boost/noncopyable.hpp"
-#include "boost/range/iterator_range.hpp"
-
-#ifndef _WIN32
- #include "fcntl.h"
-#endif // _WIN32
-
-#ifdef _WIN32
- #define BOOST_AUX_IO_WIN32_OR_POSIX( win32, posix ) win32
-#else
- #define BOOST_AUX_IO_WIN32_OR_POSIX( win32, posix ) posix
-#endif
+#include "boost/range/iterator_range_core.hpp"
//------------------------------------------------------------------------------
namespace boost
{
@@ -46,58 +31,10 @@
{
//------------------------------------------------------------------------------
-// Implementation note:
-// Using structs with public members and factory functions to enable (almost)
-// zero-overhead 'link-time' conversion to native flag formats and to allow the
-// user to modify the created flags or create fully custom ones so that specific
-// platform-dependent use-cases, not otherwise covered through the generic
-// interface, can also be covered.
-// (10.10.2010.) (Domagoj Saric)
-
-struct mapping_flags
-{
- struct handle_access_rights
- {
- static unsigned int const read ;
- static unsigned int const write ;
- static unsigned int const execute;
- };
-
- struct share_mode
- {
- static unsigned int const shared;
- static unsigned int const hidden;
- };
-
- struct system_hint
- {
- static unsigned int const lock_to_ram ;
- static unsigned int const reserve_page_file_space;
- static unsigned int const precommit ;
- static unsigned int const uninitialized ;
- };
-
- static mapping_flags create
- (
- unsigned int handle_access_rights,
- unsigned int share_mode ,
- unsigned int system_hints
- );
-
-#ifdef _WIN32
- unsigned int create_mapping_flags;
- unsigned int map_view_flags;
-#else
- int protection;
- int flags ;
-#endif // _WIN32
-};
-
-
typedef iterator_range<unsigned char *> basic_memory_range_t;
typedef iterator_range<unsigned char const *> basic_read_only_memory_range_t;
-template <typename Element>
+template <typename Element, typename Impl = BOOST_MMAP_IMPL()>
class mapped_view_reference;
typedef mapped_view_reference<unsigned char > basic_mapped_view_ref;
@@ -105,7 +42,7 @@
namespace detail
{
- template <typename Element>
+ template <typename Element, typename Impl>
class mapped_view_base : public iterator_range<Element *>
{
public:
@@ -118,17 +55,17 @@
mapped_view_base( iterator_range<Element *> const & mapped_range ) : iterator_range<Element *>( mapped_range ) {}
mapped_view_base( Element * const p_begin, Element * const p_end ) : iterator_range<Element *>( p_begin, p_end ) {}
- static mapped_view_reference<unsigned char const>
+ static mapped_view_reference<unsigned char const, Impl>
#ifdef BOOST_MSVC
const &
#endif
- make_basic_view( mapped_view_base<Element> const & );
+ make_basic_view( mapped_view_base<Element, Impl> const & );
- static mapped_view_reference<Element>
+ static mapped_view_reference<Element, Impl>
#ifdef BOOST_MSVC
const &
#endif
- make_typed_range( mapped_view_base<unsigned char> const & );
+ make_typed_range( mapped_view_base<unsigned char, Impl> const & );
private: // Hide mutable members
void advance_begin();
@@ -139,18 +76,17 @@
};
- template <typename Element>
- void mapped_view_base<Element>::unmap( mapped_view_base<Element> const & mapped_range )
+ template <typename Element, typename Impl>
+ void mapped_view_base<Element, Impl>::unmap( mapped_view_base<Element, Impl> const & mapped_range )
{
- mapped_view_base<unsigned char const>::unmap( make_basic_view( mapped_range ) );
+ mapped_view_base<unsigned char const, Impl>::unmap( make_basic_view( mapped_range ) );
}
-
- template <>
- void mapped_view_base<unsigned char const>::unmap( mapped_view_base<unsigned char const> const & );
} // namespace detail
-template <typename Element>
-class mapped_view_reference : public detail::mapped_view_base<Element>
+template <typename Impl> struct mapping;
+
+template <typename Element, typename Impl>
+class mapped_view_reference : public detail::mapped_view_base<Element, Impl>
{
public:
basic_memory_range_t basic_range() const
@@ -165,48 +101,29 @@
public: // Factory methods.
static mapped_view_reference map
(
- native_handle::reference,
- mapping_flags const &,
- std::size_t desired_size = 0,
- std::size_t offset = 0
+ mapping<Impl> const & source_mapping,
+ boost::uint64_t offset = 0,
+ std ::size_t desired_size = 0
);
private:
- template <typename T> friend class detail::mapped_view_base;
+ template <typename T, typename Impl> friend class detail::mapped_view_base;
- mapped_view_reference( iterator_range<Element *> const & mapped_range ) : detail::mapped_view_base<Element>( mapped_range ) {}
- mapped_view_reference( Element * const p_begin, Element * const p_end ) : detail::mapped_view_base<Element>( p_begin, p_end ) {}
+ mapped_view_reference( iterator_range<Element *> const & mapped_range ) : detail::mapped_view_base<Element, Impl>( mapped_range ) {}
+ mapped_view_reference( Element * const p_begin, Element * const p_end ) : detail::mapped_view_base<Element, Impl>( p_begin, p_end ) {}
};
-template <typename Element>
-class mapped_view_reference<Element const> : public detail::mapped_view_base<Element const>
-{
-public:
- basic_memory_range_t basic_range() const
- {
- return basic_memory_range_t
- (
- static_cast<unsigned char const *>( static_cast<void const *>( this->begin() ) ),
- static_cast<unsigned char const *>( static_cast<void const *>( this->end () ) )
- );
- }
-
-public: // Factory methods.
- static mapped_view_reference map
- (
- native_handle::reference object_handle,
- std::size_t desired_size = 0,
- std::size_t offset = 0,
- bool map_for_code_execution = false
- );
-
-private:
- template <typename T> friend class detail::mapped_view_base;
- mapped_view_reference( iterator_range<Element const *> const & mapped_range ) : detail::mapped_view_base<Element const>( mapped_range ) {}
- mapped_view_reference( Element const * const p_begin, Element const * const p_end ) : detail::mapped_view_base<Element const>( p_begin, p_end ) {}
- mapped_view_reference( mapped_view_reference<Element> const & mutable_view ) : detail::mapped_view_base<Element const>( mutable_view ) {}
-};
+//...zzz...
+//template <typename Element, typename Impl>
+//basic_read_only_memory_range_t mapped_view_reference<Element const, Impl>::basic_range() const
+//{
+// return basic_read_only_memory_range_t
+// (
+// static_cast<unsigned char const *>( static_cast<void const *>( this->begin() ) ),
+// static_cast<unsigned char const *>( static_cast<void const *>( this->end () ) )
+// );
+//}
namespace detail
@@ -216,18 +133,18 @@
// compilers (e.g. GCC and Clang).
// (14.07.2011.) (Domagoj Saric)
- template <typename Element>
- mapped_view_reference<unsigned char const>
+ template <typename Element, typename Impl>
+ mapped_view_reference<unsigned char const, Impl>
#ifdef BOOST_MSVC
const &
#endif
- mapped_view_base<Element>::make_basic_view( mapped_view_base<Element> const & range )
+ mapped_view_base<Element, Impl>::make_basic_view( mapped_view_base<Element, Impl> const & range )
{
return
#ifdef BOOST_MSVC
- reinterpret_cast<mapped_view_reference<unsigned char const> const &>( range );
+ reinterpret_cast<mapped_view_reference<unsigned char const, Impl> const &>( range );
#else // compiler might care about strict aliasing rules
- mapped_view_reference<unsigned char const>
+ mapped_view_reference<unsigned char const, Impl>
(
static_cast<unsigned char const *>( static_cast<void const *>( range.begin() ) ),
static_cast<unsigned char const *>( static_cast<void const *>( range.end () ) )
@@ -236,21 +153,21 @@
}
- template <typename Element>
- mapped_view_reference<Element>
+ template <typename Element, typename Impl>
+ mapped_view_reference<Element, Impl>
#ifdef BOOST_MSVC
const &
#endif
- mapped_view_base<Element>::make_typed_range( mapped_view_base<unsigned char> const & range )
+ mapped_view_base<Element, Impl>::make_typed_range( mapped_view_base<unsigned char, Impl> const & range )
{
BOOST_ASSERT( reinterpret_cast<std::size_t>( range.begin() ) % sizeof( Element ) == 0 );
BOOST_ASSERT( reinterpret_cast<std::size_t>( range.end () ) % sizeof( Element ) == 0 );
BOOST_ASSERT( range.size () % sizeof( Element ) == 0 );
return
#ifdef BOOST_MSVC
- reinterpret_cast<mapped_view_reference<Element> const &>( range );
+ reinterpret_cast<mapped_view_reference<Element, Impl> const &>( range );
#else // compiler might care about strict aliasing rules
- mapped_view_reference<unsigned char const>
+ mapped_view_reference<Element, Impl>
(
static_cast<Element *>( static_cast<void *>( range.begin() ) ),
static_cast<Element *>( static_cast<void *>( range.end () ) )
@@ -273,37 +190,39 @@
template <> struct is_mappable<handle<win32>::native_handle_t > : mpl::true_ {};
#endif // _WIN32
-
-template <>
-mapped_view_reference<unsigned char> mapped_view_reference<unsigned char>::map
+template <typename Element, typename Impl>
+mapped_view_reference<Element, Impl> mapped_view_reference<Element, Impl>::map
(
- native_handle::reference,
- mapping_flags const &,
- std::size_t desired_size,
- std::size_t offset
-);
+ mapping<Impl> const & source_mapping,
+ boost::uint64_t offset = 0,
+ std ::size_t desired_size = 0
+)
+{
+ BOOST_ASSERT_MSG( !boost::is_const<Element>::value || source_mapping.is_read_only(), "Use const element mapped view for read only mappings." );
+ return mapped_view_reference<unsigned char, Impl>::map( source_mapping, offset, desired_size );
+}
-template <>
-mapped_view_reference<unsigned char const> mapped_view_reference<unsigned char const>::map
-(
- native_handle::reference object_handle,
- std::size_t desired_size,
- std::size_t offset,
- bool map_for_code_execution
-);
+//...zzz...
+//template <unsigned char, typename Impl>
+//static mapped_view_reference<unsigned char, Impl> mapped_view_reference<unsigned char, Impl>::map
+//(
+// mapping<Impl> const & source_mapping,
+// boost::uint64_t offset = 0,
+// std ::size_t desired_size = 0
+//);
-template <typename Element>
+template <typename Element, typename Impl = BOOST_MMAP_IMPL()>
class mapped_view
:
- public mapped_view_reference<Element>
+ public mapped_view_reference<Element, Impl>
#ifdef BOOST_MSVC
,private noncopyable
#endif // BOOST_MSVC
{
public:
- mapped_view( mapped_view_reference<Element> const range ) : mapped_view_reference<Element>( range ) {}
- ~mapped_view<Element>() { mapped_view_reference<Element>::unmap( *this ); }
+ mapped_view( mapped_view_reference<Element, Impl> const range ) : mapped_view_reference<Element, Impl>( range ) {}
+ ~mapped_view() { mapped_view_reference<Element, Impl>::unmap( *this ); }
#ifndef BOOST_MSVC
mapped_view( mapped_view const & ); // noncopyable
Modified: sandbox/mmap/boost/mmap/mapped_view.inl
==============================================================================
--- sandbox/mmap/boost/mmap/mapped_view.inl (original)
+++ sandbox/mmap/boost/mmap/mapped_view.inl 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
@@ -17,35 +17,9 @@
#include "detail/impl_inline.hpp"
#include "implementations.hpp"
-#include "mappble_objects/file/handle.hpp"
+#include "mappble_objects/file/file.hpp"
#include "boost/assert.hpp"
-
-#ifdef _WIN32
- #ifndef WIN32_LEAN_AND_MEAN
- #define WIN32_LEAN_AND_MEAN
- #endif // WIN32_LEAN_AND_MEAN
- #include "windows.h"
-
- #pragma warning ( disable : 4996 ) // "The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name."
- #include "io.h"
-#else
- #include "sys/mman.h" // mmap, munmap.
- #include "sys/stat.h"
- #include "sys/types.h" // struct stat.
- #include "unistd.h" // sysconf.
-#endif // _WIN32
-#include "errno.h"
-#include "fcntl.h"
-
-#ifndef _WIN32
- #ifdef __APPLE__
- #define BOOST_AUX_MMAP_POSIX_OR_OSX( posix, osx ) osx
- #else
- #define BOOST_AUX_MMAP_POSIX_OR_OSX( posix, osx ) posix
- #endif
-#endif
-
//------------------------------------------------------------------------------
namespace boost
{
@@ -54,167 +28,21 @@
{
//------------------------------------------------------------------------------
-unsigned int const mapping_flags::handle_access_rights::read = BOOST_AUX_IO_WIN32_OR_POSIX( FILE_MAP_READ , PROT_READ );
-unsigned int const mapping_flags::handle_access_rights::write = BOOST_AUX_IO_WIN32_OR_POSIX( FILE_MAP_WRITE , PROT_WRITE );
-unsigned int const mapping_flags::handle_access_rights::execute = BOOST_AUX_IO_WIN32_OR_POSIX( FILE_MAP_EXECUTE, PROT_EXEC );
-
-unsigned int const mapping_flags::share_mode::shared = BOOST_AUX_IO_WIN32_OR_POSIX( 0, MAP_SHARED );
-unsigned int const mapping_flags::share_mode::hidden = BOOST_AUX_IO_WIN32_OR_POSIX( FILE_MAP_COPY, MAP_PRIVATE );
-
-unsigned int const mapping_flags::system_hint::lock_to_ram = BOOST_AUX_IO_WIN32_OR_POSIX( SEC_COMMIT , BOOST_AUX_MMAP_POSIX_OR_OSX( MAP_LOCKED, 0 ) );
-unsigned int const mapping_flags::system_hint::reserve_page_file_space = BOOST_AUX_IO_WIN32_OR_POSIX( SEC_RESERVE, /*khm#1*/MAP_NORESERVE );
-unsigned int const mapping_flags::system_hint::precommit = BOOST_AUX_IO_WIN32_OR_POSIX( SEC_COMMIT , BOOST_AUX_MMAP_POSIX_OR_OSX( MAP_POPULATE, 0 ) );
-unsigned int const mapping_flags::system_hint::uninitialized = BOOST_AUX_IO_WIN32_OR_POSIX( 0, BOOST_AUX_MMAP_POSIX_OR_OSX( MAP_UNINITIALIZED, 0 ) );
-
-
-BOOST_IMPL_INLINE
-mapping_flags mapping_flags::create
-(
- unsigned int const handle_access_flags,
- unsigned int const share_mode ,
- unsigned int const system_hints
-)
-{
- mapping_flags flags;
-
-#ifdef _WIN32
- flags.create_mapping_flags = ( handle_access_flags & handle_access_rights::execute ) ? PAGE_EXECUTE : PAGE_NOACCESS;
- if ( share_mode == share_mode::hidden ) // WRITECOPY
- flags.create_mapping_flags *= 8;
- else
- if ( handle_access_flags & handle_access_rights::write )
- flags.create_mapping_flags *= 4;
- else
- {
- BOOST_ASSERT( handle_access_flags & handle_access_rights::read );
- flags.create_mapping_flags *= 2;
- }
-
- flags.create_mapping_flags |= system_hints;
-
- flags.map_view_flags = handle_access_flags;
-#else
- flags.protection = handle_access_flags;
- flags.flags = share_mode | system_hints;
- if ( ( system_hints & system_hint::reserve_page_file_space ) ) /*khm#1*/
- flags.flags &= ~MAP_NORESERVE;
- else
- flags.flags |= MAP_NORESERVE;
-#endif // _WIN32
-
- return flags;
-}
-
-
-template <> BOOST_IMPL_INLINE
-mapped_view_reference<unsigned char> mapped_view_reference<unsigned char>::map
-(
- native_handle::reference const object_handle,
- mapping_flags const & flags,
- std::size_t const desired_size,
- std::size_t const offset
-)
-{
- typedef mapped_view_reference<unsigned char>::iterator iterator_t;
-
-#ifdef _WIN32
-
- // Implementation note:
- // Mapped views hold internal references to the following handles so we do
- // not need to hold/store them ourselves:
- // http://msdn.microsoft.com/en-us/library/aa366537(VS.85).aspx
- // (26.03.2010.) (Domagoj Saric)
-
- ULARGE_INTEGER large_integer;
-
- // CreateFileMapping accepts INVALID_HANDLE_VALUE as valid input but only if
- // the size parameter is not null.
- large_integer.QuadPart = desired_size;
- handle<win32> const mapping
- (
- ::CreateFileMappingW( object_handle, 0, flags.create_mapping_flags, large_integer.HighPart, large_integer.LowPart, 0 )
- );
- BOOST_ASSERT
- (
- !mapping || ( object_handle == INVALID_HANDLE_VALUE ) || ( desired_size != 0 )
- );
-
- large_integer.QuadPart = offset;
- iterator_t const view_start( static_cast<iterator_t>( ::MapViewOfFile( mapping.get(), flags.map_view_flags, large_integer.HighPart, large_integer.LowPart, desired_size ) ) );
- return mapped_view_reference<unsigned char>
- (
- view_start,
- ( view_start && ( object_handle != INVALID_HANDLE_VALUE ) )
- ? view_start + desired_size
- : view_start
- );
-
-#else // POSIX
-
- iterator_t const view_start( static_cast<iterator_t>( ::mmap( 0, desired_size, flags.protection, flags.flags, object_handle, 0 ) ) );
- return mapped_view_reference<unsigned char>
- (
- view_start,
- ( view_start != MAP_FAILED )
- ? view_start + desired_size
- : view_start
- );
-
-#endif // OS API
-}
-
-
-template <> BOOST_IMPL_INLINE
-void detail::mapped_view_base<unsigned char const>::unmap( detail::mapped_view_base<unsigned char const> const & mapped_range )
-{
-#ifdef _WIN32
- BOOST_VERIFY( ::UnmapViewOfFile( mapped_range.begin() ) || mapped_range.empty() );
-#else
- BOOST_VERIFY( ( ::munmap ( const_cast<unsigned char *>( mapped_range.begin() ), mapped_range.size() ) == 0 ) || mapped_range.empty() );
-#endif // _WIN32
-}
-
-
-template <> BOOST_IMPL_INLINE
-mapped_view_reference<unsigned char const> mapped_view_reference<unsigned char const>::map
-(
- native_handle::reference const object_handle,
- std::size_t const desired_size,
- std::size_t const offset,
- bool const map_for_code_execution
-)
-{
- return mapped_view_reference<unsigned char>::map
- (
- object_handle,
- mapping_flags::create
- (
- mapping_flags::handle_access_rights::read | ( map_for_code_execution ? mapping_flags::handle_access_rights::execute : 0 ),
- mapping_flags::share_mode::shared,
- mapping_flags::system_hint::uninitialized
- ),
- desired_size,
- offset
- );
-}
-
-
BOOST_IMPL_INLINE
basic_mapped_view_ref map_file( char const * const file_name, std::size_t desired_size )
{
- typedef native_file_flags file_flags;
+ typedef file_open_flags<BOOST_MMAP_IMPL()> open_flags;
file_handle<BOOST_MMAP_IMPL()> const file_handle
(
create_file
(
file_name,
- file_flags::create
+ open_flags::create
(
- file_flags::handle_access_rights::read | file_flags::handle_access_rights::write,
- file_flags::share_mode ::read,
- file_flags::open_policy::open_or_create,
- file_flags::system_hints ::sequential_access,
- file_flags::on_construction_rights::read | file_flags::on_construction_rights::write
+ open_flags::handle_access_rights ::read | open_flags::handle_access_rights::write,
+ open_flags::open_policy ::open_or_create,
+ open_flags::system_hints ::sequential_access,
+ open_flags::on_construction_rights::read | open_flags::on_construction_rights::write
)
)
);
@@ -224,14 +52,17 @@
else
desired_size = get_size( file_handle.get() );
+ typedef file_mapping_flags<BOOST_MMAP_IMPL()> mapping_flags;
return basic_mapped_view_ref::map
(
- file_handle.get(),
- mapping_flags::create
+ create_mapping
(
- mapping_flags::handle_access_rights::read | mapping_flags::handle_access_rights::write,
- mapping_flags::share_mode::shared,
- mapping_flags::system_hint::uninitialized
+ file_handle,
+ mapping_flags::create
+ (
+ mapping_flags::handle_access_rights::read | mapping_flags::handle_access_rights::write,
+ mapping_flags::share_mode ::shared
+ )
),
desired_size,
0
@@ -242,31 +73,35 @@
BOOST_IMPL_INLINE
basic_mapped_read_only_view_ref map_read_only_file( char const * const file_name )
{
- typedef native_file_flags file_flags;
+ typedef file_open_flags<BOOST_MMAP_IMPL()> open_flags;
file_handle<BOOST_MMAP_IMPL()> const file_handle
(
create_file
(
file_name,
- file_flags::create_for_opening_existing_files
+ open_flags::create_for_opening_existing_files
(
- file_flags::handle_access_rights::read,
- file_flags::share_mode ::read | file_flags::share_mode::write,
+ open_flags::handle_access_rights::read,
false,
- file_flags::system_hints ::sequential_access
+ open_flags::system_hints ::sequential_access
)
)
);
+ typedef file_mapping_flags<BOOST_MMAP_IMPL()> mapping_flags;
return basic_mapped_read_only_view_ref::map
(
- file_handle.get(),
- // Implementation note:
- // Windows APIs interpret zero as 'whole file' but we still need to
- // query the file size in order to be able to properly set the end
- // pointer.
- // (13.07.2011.) (Domagoj Saric)
- get_size( file_handle.get() )
+ create_mapping
+ (
+ file_handle,
+ mapping_flags::create
+ (
+ mapping_flags::handle_access_rights::read,
+ mapping_flags::share_mode ::shared
+ )
+ ),
+ get_size( file_handle.get() ),
+ 0
);
}
Copied: sandbox/mmap/boost/mmap/mapping/mapping.hpp (from r74074, /sandbox/mmap/boost/mmap/handles/mapping_handle.hpp)
==============================================================================
--- /sandbox/mmap/boost/mmap/handles/mapping_handle.hpp (original)
+++ sandbox/mmap/boost/mmap/mapping/mapping.hpp 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////////////////////////
///
-/// \file mapping_handle.hpp
-/// ------------------------
+/// \file mapping.hpp
+/// -----------------
///
/// Copyright (c) 2011 Domagoj Saric
///
@@ -13,11 +13,13 @@
///
////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
-#ifndef mapping_handle_hpp__D42BC724_FD9A_4C7B_B521_CF3C29C948B3
-#define mapping_handle_hpp__D42BC724_FD9A_4C7B_B521_CF3C29C948B3
+#ifndef mapping_hpp__D42BC724_FD9A_4C7B_B521_CF3C29C948B3
+#define mapping_hpp__D42BC724_FD9A_4C7B_B521_CF3C29C948B3
#pragma once
//------------------------------------------------------------------------------
-#include "handle.hpp"
+#include "../detail/impl_selection.hpp"
+
+#include BOOST_MMAP_IMPL_INCLUDE( BOOST_PP_EMPTY, BOOST_PP_IDENTITY( /mapping.hpp ) )
//------------------------------------------------------------------------------
namespace boost
{
@@ -26,19 +28,12 @@
{
//------------------------------------------------------------------------------
-template <typename Impl> class handle;
-
template <typename Impl>
-class mapping_handle : handle<Impl>
-{
-public:
- mapping_handle( typename handle<Impl>::handle_t const native_handle )
- : handle<Impl>( native_handle ) {}
-};
+struct mapping;
//------------------------------------------------------------------------------
} // namespace mmap
//------------------------------------------------------------------------------
} // namespace boost
//------------------------------------------------------------------------------
-#endif // handle_hpp
+#endif // mapping_hpp
Copied: sandbox/mmap/boost/mmap/mapping/posix/mapping.hpp (from r74074, /sandbox/mmap/boost/mmap/handles/mapping_handle.hpp)
==============================================================================
--- /sandbox/mmap/boost/mmap/handles/mapping_handle.hpp (original)
+++ sandbox/mmap/boost/mmap/mapping/posix/mapping.hpp 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////////////////////////
///
-/// \file mapping_handle.hpp
-/// ------------------------
+/// \file mapping.hpp
+/// -----------------
///
/// Copyright (c) 2011 Domagoj Saric
///
@@ -13,11 +13,14 @@
///
////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
-#ifndef mapping_handle_hpp__D42BC724_FD9A_4C7B_B521_CF3C29C948B3
-#define mapping_handle_hpp__D42BC724_FD9A_4C7B_B521_CF3C29C948B3
+#ifndef mapping_hpp__99837E03_86B1_42F5_A57D_69A6E828DD08
+#define mapping_hpp__99837E03_86B1_42F5_A57D_69A6E828DD08
#pragma once
//------------------------------------------------------------------------------
-#include "handle.hpp"
+#include "../../handles/posix/handle.hpp"
+#include "../../mappble_objects/file/posix/mapping_flags.hpp"
+
+#include "boost/config/suffix.hpp"
//------------------------------------------------------------------------------
namespace boost
{
@@ -26,14 +29,24 @@
{
//------------------------------------------------------------------------------
-template <typename Impl> class handle;
+template <typename Impl> struct mapping;
-template <typename Impl>
-class mapping_handle : handle<Impl>
+template <>
+struct mapping<posix>
+ :
+ handle<posix>::reference
{
-public:
- mapping_handle( typename handle<Impl>::handle_t const native_handle )
- : handle<Impl>( native_handle ) {}
+ typedef handle<posix>::handle_t native_handle_t;
+ typedef mapping const & reference;
+
+ BOOST_STATIC_CONSTANT( bool, owns_parent_handle = false );
+
+ mapping( native_handle_t const native_handle, file_mapping_flags<posix> const & view_mapping_flags_param )
+ : handle<posix>::reference( native_handle ), view_mapping_flags( view_mapping_flags_param ) {}
+
+ bool is_read_only() const { return ( view_mapping_flags.protection & file_mapping_flags<posix>::handle_access_rights::write ) == 0; }
+
+ file_mapping_flags<posix> const view_mapping_flags;
};
//------------------------------------------------------------------------------
@@ -41,4 +54,9 @@
//------------------------------------------------------------------------------
} // namespace boost
//------------------------------------------------------------------------------
-#endif // handle_hpp
+
+#ifdef BOOST_MMAP_HEADER_ONLY
+ #include "mapping.inl"
+#endif // BOOST_MMAP_HEADER_ONLY
+
+#endif // mapping_hpp
Copied: sandbox/mmap/boost/mmap/mapping/posix/mapping.inl (from r74074, /sandbox/mmap/boost/mmap/handles/win32/handle.inl)
==============================================================================
--- /sandbox/mmap/boost/mmap/handles/win32/handle.inl (original)
+++ sandbox/mmap/boost/mmap/mapping/posix/mapping.inl 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////////////////////////
///
-/// \file handle.inl
-/// ----------------
+/// \file mapping.inl
+/// -----------------
///
/// Copyright (c) Domagoj Saric 2010.-2011.
///
@@ -13,20 +13,9 @@
///
////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
-#include "handle.hpp"
+#include "mapping.hpp"
-#include "../../detail/impl_inline.hpp"
-
-#include "boost/assert.hpp"
-
-#ifndef WIN32_LEAN_AND_MEAN
- #define WIN32_LEAN_AND_MEAN
-#endif // WIN32_LEAN_AND_MEAN
-#include "windows.h"
-
-#ifdef BOOST_MSVC
- #include "io.h"
-#endif // BOOST_MSVC
+#include "../../detail/posix.hpp"
//------------------------------------------------------------------------------
namespace boost
{
@@ -35,37 +24,48 @@
{
//------------------------------------------------------------------------------
-BOOST_IMPL_INLINE
-handle<win32>::handle( native_handle_t const handle )
- :
- handle_( handle )
-{}
-
-BOOST_IMPL_INLINE
-handle<win32>::~handle()
+template <> BOOST_IMPL_INLINE
+mapped_view_reference<unsigned char, posix> mapped_view_reference<unsigned char, posix>::map
+(
+ mapping<posix> const & source_mapping,
+ boost::uint64_t const offset ,
+ std ::size_t const desired_size
+)
{
- BOOST_VERIFY
+ iterator const view_start
+ (
+ static_cast<iterator>
+ (
+ ::mmap
+ (
+ 0,
+ desired_size,
+ source_mapping.view_mapping_flags.protection,
+ source_mapping.view_mapping_flags.flags,
+ source_mapping,
+ 0
+ )
+ )
+ );
+
+ return mapped_view_reference<unsigned char>
(
- ( ::CloseHandle( handle_ ) != false ) ||
- ( handle_ == 0 || handle_ == INVALID_HANDLE_VALUE )
+ view_start,
+ ( view_start != MAP_FAILED )
+ ? view_start + desired_size
+ : view_start
);
}
-#ifdef BOOST_MSVC
- BOOST_IMPL_INLINE
- handle<posix> make_posix_handle( handle<win32>::native_handle_t const native_handle, int const flags )
- {
- return handle<posix>( ::_open_osfhandle( reinterpret_cast<intptr_t>( native_handle ), flags ) );
- }
-#endif // BOOST_MSVC
+template <> BOOST_IMPL_INLINE
+void detail::mapped_view_base<unsigned char const, posix>::unmap( detail::mapped_view_base<unsigned char const, posix> const & mapped_range )
+{
+ BOOST_VERIFY( ( ::munmap( const_cast<unsigned char *>( mapped_range.begin() ), mapped_range.size() ) == 0 ) || mapped_range.empty() );
+}
//------------------------------------------------------------------------------
} // mmap
//------------------------------------------------------------------------------
} // boost
//------------------------------------------------------------------------------
-
-#ifndef BOOST_MMAP_HEADER_ONLY
- #include "../posix/handle.inl"
-#endif // BOOST_MMAP_HEADER_ONLY
Copied: sandbox/mmap/boost/mmap/mapping/win32/mapping.hpp (from r74074, /sandbox/mmap/boost/mmap/handles/mapping_handle.hpp)
==============================================================================
--- /sandbox/mmap/boost/mmap/handles/mapping_handle.hpp (original)
+++ sandbox/mmap/boost/mmap/mapping/win32/mapping.hpp 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////////////////////////
///
-/// \file mapping_handle.hpp
-/// ------------------------
+/// \file mapping.hpp
+/// -----------------
///
/// Copyright (c) 2011 Domagoj Saric
///
@@ -13,11 +13,14 @@
///
////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
-#ifndef mapping_handle_hpp__D42BC724_FD9A_4C7B_B521_CF3C29C948B3
-#define mapping_handle_hpp__D42BC724_FD9A_4C7B_B521_CF3C29C948B3
+#ifndef mapping_hpp__8B2CEDFB_C87C_4AA4_B9D0_8EF0A42825F2
+#define mapping_hpp__8B2CEDFB_C87C_4AA4_B9D0_8EF0A42825F2
#pragma once
//------------------------------------------------------------------------------
-#include "handle.hpp"
+#include "../../handles/win32/handle.hpp"
+#include "../../mappble_objects/file/win32/mapping_flags.hpp"
+
+#include "boost/config/suffix.hpp"
//------------------------------------------------------------------------------
namespace boost
{
@@ -26,14 +29,24 @@
{
//------------------------------------------------------------------------------
-template <typename Impl> class handle;
+template <typename Impl> struct mapping;
-template <typename Impl>
-class mapping_handle : handle<Impl>
+template <>
+struct mapping<win32>
+ :
+ handle<win32>
{
-public:
- mapping_handle( typename handle<Impl>::handle_t const native_handle )
- : handle<Impl>( native_handle ) {}
+ typedef handle<win32>::native_handle_t native_handle_t;
+ typedef mapping const & reference;
+
+ BOOST_STATIC_CONSTANT( bool, owns_parent_handle = true );
+
+ mapping( native_handle_t const native_handle, unsigned int const view_mapping_flags_param )
+ : handle<win32>( native_handle ), view_mapping_flags( view_mapping_flags_param ) {}
+
+ bool is_read_only() const { return ( view_mapping_flags & file_mapping_flags<win32>::handle_access_rights::write ) == 0; }
+
+ unsigned int const view_mapping_flags;
};
//------------------------------------------------------------------------------
@@ -41,4 +54,9 @@
//------------------------------------------------------------------------------
} // namespace boost
//------------------------------------------------------------------------------
-#endif // handle_hpp
+
+#ifdef BOOST_MMAP_HEADER_ONLY
+ #include "mapping.inl"
+#endif // BOOST_MMAP_HEADER_ONLY
+
+#endif // mapping_hpp
Copied: sandbox/mmap/boost/mmap/mapping/win32/mapping.inl (from r74074, /sandbox/mmap/boost/mmap/handles/win32/handle.inl)
==============================================================================
--- /sandbox/mmap/boost/mmap/handles/win32/handle.inl (original)
+++ sandbox/mmap/boost/mmap/mapping/win32/mapping.inl 2011-08-28 20:17:54 EDT (Sun, 28 Aug 2011)
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////////////////////////
///
-/// \file handle.inl
-/// ----------------
+/// \file mapping.inl
+/// -----------------
///
/// Copyright (c) Domagoj Saric 2010.-2011.
///
@@ -13,20 +13,9 @@
///
////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
-#include "handle.hpp"
+#include "mapping.hpp"
-#include "../../detail/impl_inline.hpp"
-
-#include "boost/assert.hpp"
-
-#ifndef WIN32_LEAN_AND_MEAN
- #define WIN32_LEAN_AND_MEAN
-#endif // WIN32_LEAN_AND_MEAN
-#include "windows.h"
-
-#ifdef BOOST_MSVC
- #include "io.h"
-#endif // BOOST_MSVC
+#include "../../detail/windows.hpp"
//------------------------------------------------------------------------------
namespace boost
{
@@ -35,37 +24,59 @@
{
//------------------------------------------------------------------------------
+template <>
BOOST_IMPL_INLINE
-handle<win32>::handle( native_handle_t const handle )
- :
- handle_( handle )
-{}
-
-BOOST_IMPL_INLINE
-handle<win32>::~handle()
+mapped_view_reference<unsigned char, win32> mapped_view_reference<unsigned char, win32>::map
+(
+ mapping<win32> const & source_mapping,
+ boost::uint64_t const offset ,
+ std ::size_t const desired_size
+)
{
- BOOST_VERIFY
+ // Implementation note:
+ // Mapped views hold internal references to the following handles so we do
+ // not need to hold/store them ourselves:
+ // http://msdn.microsoft.com/en-us/library/aa366537(VS.85).aspx
+ // (26.03.2010.) (Domagoj Saric)
+
+ typedef mapped_view_reference<unsigned char, win32>::iterator iterator_t;
+
+ ULARGE_INTEGER large_integer;
+ large_integer.QuadPart = offset;
+
+ iterator_t const view_start
+ (
+ static_cast<iterator_t>
+ (
+ ::MapViewOfFile
+ (
+ source_mapping.get(),
+ source_mapping.view_mapping_flags,
+ large_integer.HighPart,
+ large_integer.LowPart,
+ desired_size
+ )
+ )
+ );
+
+ return mapped_view_reference<unsigned char>
(
- ( ::CloseHandle( handle_ ) != false ) ||
- ( handle_ == 0 || handle_ == INVALID_HANDLE_VALUE )
+ view_start,
+ view_start
+ ? view_start + desired_size
+ : view_start
);
}
-#ifdef BOOST_MSVC
- BOOST_IMPL_INLINE
- handle<posix> make_posix_handle( handle<win32>::native_handle_t const native_handle, int const flags )
- {
- return handle<posix>( ::_open_osfhandle( reinterpret_cast<intptr_t>( native_handle ), flags ) );
- }
-#endif // BOOST_MSVC
+template <> BOOST_IMPL_INLINE
+void detail::mapped_view_base<unsigned char const, win32>::unmap( detail::mapped_view_base<unsigned char const, win32> const & mapped_range )
+{
+ BOOST_VERIFY( ::UnmapViewOfFile( mapped_range.begin() ) || mapped_range.empty() );
+}
//------------------------------------------------------------------------------
} // mmap
//------------------------------------------------------------------------------
} // boost
//------------------------------------------------------------------------------
-
-#ifndef BOOST_MMAP_HEADER_ONLY
- #include "../posix/handle.inl"
-#endif // BOOST_MMAP_HEADER_ONLY
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk