diff options
Diffstat (limited to 'src/third_party/boost-1.56.0/boost/interprocess/detail/managed_open_or_create_impl.hpp')
-rw-r--r-- | src/third_party/boost-1.56.0/boost/interprocess/detail/managed_open_or_create_impl.hpp | 493 |
1 files changed, 0 insertions, 493 deletions
diff --git a/src/third_party/boost-1.56.0/boost/interprocess/detail/managed_open_or_create_impl.hpp b/src/third_party/boost-1.56.0/boost/interprocess/detail/managed_open_or_create_impl.hpp deleted file mode 100644 index f12d6c6044f..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/detail/managed_open_or_create_impl.hpp +++ /dev/null @@ -1,493 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2006-2012. Distributed under the Boost -// Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org/libs/interprocess for documentation. -// -////////////////////////////////////////////////////////////////////////////// - -#ifndef BOOST_INTERPROCESS_MANAGED_OPEN_OR_CREATE_IMPL -#define BOOST_INTERPROCESS_MANAGED_OPEN_OR_CREATE_IMPL - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/os_thread_functions.hpp> -#include <boost/interprocess/detail/os_file_functions.hpp> -#include <boost/interprocess/creation_tags.hpp> -#include <boost/interprocess/mapped_region.hpp> -#include <boost/interprocess/detail/utilities.hpp> -#include <boost/interprocess/detail/type_traits.hpp> -#include <boost/interprocess/detail/atomic.hpp> -#include <boost/interprocess/detail/interprocess_tester.hpp> -#include <boost/interprocess/creation_tags.hpp> -#include <boost/interprocess/detail/mpl.hpp> -#include <boost/interprocess/permissions.hpp> -#include <boost/type_traits/alignment_of.hpp> -#include <boost/type_traits/type_with_alignment.hpp> -#include <boost/interprocess/sync/spin/wait.hpp> -#include <boost/move/move.hpp> -#include <boost/cstdint.hpp> - -namespace boost { -namespace interprocess { - -/// @cond -namespace ipcdetail{ class interprocess_tester; } - - -template<class DeviceAbstraction> -struct managed_open_or_create_impl_device_id_t -{ - typedef const char *type; -}; - -#ifdef BOOST_INTERPROCESS_XSI_SHARED_MEMORY_OBJECTS - -class xsi_shared_memory_file_wrapper; -class xsi_key; - -template<> -struct managed_open_or_create_impl_device_id_t<xsi_shared_memory_file_wrapper> -{ - typedef xsi_key type; -}; - -#endif //BOOST_INTERPROCESS_XSI_SHARED_MEMORY_OBJECTS - -/// @endcond - -namespace ipcdetail { - - -template <bool StoreDevice, class DeviceAbstraction> -class managed_open_or_create_impl_device_holder -{ - public: - DeviceAbstraction &get_device() - { static DeviceAbstraction dev; return dev; } - - const DeviceAbstraction &get_device() const - { static DeviceAbstraction dev; return dev; } -}; - -template <class DeviceAbstraction> -class managed_open_or_create_impl_device_holder<true, DeviceAbstraction> -{ - public: - DeviceAbstraction &get_device() - { return dev; } - - const DeviceAbstraction &get_device() const - { return dev; } - - private: - DeviceAbstraction dev; -}; - -template<class DeviceAbstraction, std::size_t MemAlignment, bool FileBased, bool StoreDevice> -class managed_open_or_create_impl - : public managed_open_or_create_impl_device_holder<StoreDevice, DeviceAbstraction> -{ - //Non-copyable - BOOST_MOVABLE_BUT_NOT_COPYABLE(managed_open_or_create_impl) - - typedef typename managed_open_or_create_impl_device_id_t<DeviceAbstraction>::type device_id_t; - typedef managed_open_or_create_impl_device_holder<StoreDevice, DeviceAbstraction> DevHolder; - enum - { - UninitializedSegment, - InitializingSegment, - InitializedSegment, - CorruptedSegment - }; - - public: - static const std::size_t - ManagedOpenOrCreateUserOffset = - ct_rounded_size - < sizeof(boost::uint32_t) - , MemAlignment ? (MemAlignment) : - (::boost::alignment_of< ::boost::detail::max_align >::value) - >::value; - - managed_open_or_create_impl() - {} - - managed_open_or_create_impl(create_only_t, - const device_id_t & id, - std::size_t size, - mode_t mode, - const void *addr, - const permissions &perm) - { - priv_open_or_create - ( DoCreate - , id - , size - , mode - , addr - , perm - , null_mapped_region_function()); - } - - managed_open_or_create_impl(open_only_t, - const device_id_t & id, - mode_t mode, - const void *addr) - { - priv_open_or_create - ( DoOpen - , id - , 0 - , mode - , addr - , permissions() - , null_mapped_region_function()); - } - - - managed_open_or_create_impl(open_or_create_t, - const device_id_t & id, - std::size_t size, - mode_t mode, - const void *addr, - const permissions &perm) - { - priv_open_or_create - ( DoOpenOrCreate - , id - , size - , mode - , addr - , perm - , null_mapped_region_function()); - } - - template <class ConstructFunc> - managed_open_or_create_impl(create_only_t, - const device_id_t & id, - std::size_t size, - mode_t mode, - const void *addr, - const ConstructFunc &construct_func, - const permissions &perm) - { - priv_open_or_create - (DoCreate - , id - , size - , mode - , addr - , perm - , construct_func); - } - - template <class ConstructFunc> - managed_open_or_create_impl(open_only_t, - const device_id_t & id, - mode_t mode, - const void *addr, - const ConstructFunc &construct_func) - { - priv_open_or_create - ( DoOpen - , id - , 0 - , mode - , addr - , permissions() - , construct_func); - } - - template <class ConstructFunc> - managed_open_or_create_impl(open_or_create_t, - const device_id_t & id, - std::size_t size, - mode_t mode, - const void *addr, - const ConstructFunc &construct_func, - const permissions &perm) - { - priv_open_or_create - ( DoOpenOrCreate - , id - , size - , mode - , addr - , perm - , construct_func); - } - - managed_open_or_create_impl(BOOST_RV_REF(managed_open_or_create_impl) moved) - { this->swap(moved); } - - managed_open_or_create_impl &operator=(BOOST_RV_REF(managed_open_or_create_impl) moved) - { - managed_open_or_create_impl tmp(boost::move(moved)); - this->swap(tmp); - return *this; - } - - ~managed_open_or_create_impl() - {} - - std::size_t get_user_size() const - { return m_mapped_region.get_size() - ManagedOpenOrCreateUserOffset; } - - void *get_user_address() const - { return static_cast<char*>(m_mapped_region.get_address()) + ManagedOpenOrCreateUserOffset; } - - std::size_t get_real_size() const - { return m_mapped_region.get_size(); } - - void *get_real_address() const - { return m_mapped_region.get_address(); } - - void swap(managed_open_or_create_impl &other) - { - this->m_mapped_region.swap(other.m_mapped_region); - } - - bool flush() - { return m_mapped_region.flush(); } - - const mapped_region &get_mapped_region() const - { return m_mapped_region; } - - - DeviceAbstraction &get_device() - { return this->DevHolder::get_device(); } - - const DeviceAbstraction &get_device() const - { return this->DevHolder::get_device(); } - - private: - - //These are templatized to allow explicit instantiations - template<bool dummy> - static void truncate_device(DeviceAbstraction &, offset_t, false_) - {} //Empty - - template<bool dummy> - static void truncate_device(DeviceAbstraction &dev, offset_t size, true_) - { dev.truncate(size); } - - - template<bool dummy> - static bool check_offset_t_size(std::size_t , false_) - { return true; } //Empty - - template<bool dummy> - static bool check_offset_t_size(std::size_t size, true_) - { return size == std::size_t(offset_t(size)); } - - //These are templatized to allow explicit instantiations - template<bool dummy> - static void create_device(DeviceAbstraction &dev, const device_id_t & id, std::size_t size, const permissions &perm, false_ file_like) - { - (void)file_like; - DeviceAbstraction tmp(create_only, id, read_write, size, perm); - tmp.swap(dev); - } - - template<bool dummy> - static void create_device(DeviceAbstraction &dev, const device_id_t & id, std::size_t, const permissions &perm, true_ file_like) - { - (void)file_like; - DeviceAbstraction tmp(create_only, id, read_write, perm); - tmp.swap(dev); - } - - template <class ConstructFunc> inline - void priv_open_or_create - (create_enum_t type, - const device_id_t & id, - std::size_t size, - mode_t mode, const void *addr, - const permissions &perm, - ConstructFunc construct_func) - { - typedef bool_<FileBased> file_like_t; - (void)mode; - bool created = false; - bool ronly = false; - bool cow = false; - DeviceAbstraction dev; - - if(type != DoOpen){ - //Check if the requested size is enough to build the managed metadata - const std::size_t func_min_size = construct_func.get_min_size(); - if( (std::size_t(-1) - ManagedOpenOrCreateUserOffset) < func_min_size || - size < (func_min_size + ManagedOpenOrCreateUserOffset) ){ - throw interprocess_exception(error_info(size_error)); - } - } - //Check size can be represented by offset_t (used by truncate) - if(type != DoOpen && !check_offset_t_size<FileBased>(size, file_like_t())){ - throw interprocess_exception(error_info(size_error)); - } - if(type == DoOpen && mode == read_write){ - DeviceAbstraction tmp(open_only, id, read_write); - tmp.swap(dev); - created = false; - } - else if(type == DoOpen && mode == read_only){ - DeviceAbstraction tmp(open_only, id, read_only); - tmp.swap(dev); - created = false; - ronly = true; - } - else if(type == DoOpen && mode == copy_on_write){ - DeviceAbstraction tmp(open_only, id, read_only); - tmp.swap(dev); - created = false; - cow = true; - } - else if(type == DoCreate){ - create_device<FileBased>(dev, id, size, perm, file_like_t()); - created = true; - } - else if(type == DoOpenOrCreate){ - //This loop is very ugly, but brute force is sometimes better - //than diplomacy. If someone knows how to open or create a - //file and know if we have really created it or just open it - //drop me a e-mail! - bool completed = false; - spin_wait swait; - while(!completed){ - try{ - create_device<FileBased>(dev, id, size, perm, file_like_t()); - created = true; - completed = true; - } - catch(interprocess_exception &ex){ - if(ex.get_error_code() != already_exists_error){ - throw; - } - else{ - try{ - DeviceAbstraction tmp(open_only, id, read_write); - dev.swap(tmp); - created = false; - completed = true; - } - catch(interprocess_exception &e){ - if(e.get_error_code() != not_found_error){ - throw; - } - } - catch(...){ - throw; - } - } - } - catch(...){ - throw; - } - swait.yield(); - } - } - - if(created){ - try{ - //If this throws, we are lost - truncate_device<FileBased>(dev, size, file_like_t()); - - //If the following throws, we will truncate the file to 1 - mapped_region region(dev, read_write, 0, 0, addr); - boost::uint32_t *patomic_word = 0; //avoid gcc warning - patomic_word = static_cast<boost::uint32_t*>(region.get_address()); - boost::uint32_t previous = atomic_cas32(patomic_word, InitializingSegment, UninitializedSegment); - - if(previous == UninitializedSegment){ - try{ - construct_func( static_cast<char*>(region.get_address()) + ManagedOpenOrCreateUserOffset - , size - ManagedOpenOrCreateUserOffset, true); - //All ok, just move resources to the external mapped region - m_mapped_region.swap(region); - } - catch(...){ - atomic_write32(patomic_word, CorruptedSegment); - throw; - } - atomic_write32(patomic_word, InitializedSegment); - } - else if(previous == InitializingSegment || previous == InitializedSegment){ - throw interprocess_exception(error_info(already_exists_error)); - } - else{ - throw interprocess_exception(error_info(corrupted_error)); - } - } - catch(...){ - try{ - truncate_device<FileBased>(dev, 1u, file_like_t()); - } - catch(...){ - } - throw; - } - } - else{ - if(FileBased){ - offset_t filesize = 0; - spin_wait swait; - while(filesize == 0){ - if(!get_file_size(file_handle_from_mapping_handle(dev.get_mapping_handle()), filesize)){ - error_info err = system_error_code(); - throw interprocess_exception(err); - } - swait.yield(); - } - if(filesize == 1){ - throw interprocess_exception(error_info(corrupted_error)); - } - } - - mapped_region region(dev, ronly ? read_only : (cow ? copy_on_write : read_write), 0, 0, addr); - - boost::uint32_t *patomic_word = static_cast<boost::uint32_t*>(region.get_address()); - boost::uint32_t value = atomic_read32(patomic_word); - - spin_wait swait; - while(value == InitializingSegment || value == UninitializedSegment){ - swait.yield(); - value = atomic_read32(patomic_word); - } - - if(value != InitializedSegment) - throw interprocess_exception(error_info(corrupted_error)); - - construct_func( static_cast<char*>(region.get_address()) + ManagedOpenOrCreateUserOffset - , region.get_size() - ManagedOpenOrCreateUserOffset - , false); - //All ok, just move resources to the external mapped region - m_mapped_region.swap(region); - } - if(StoreDevice){ - this->DevHolder::get_device() = boost::move(dev); - } - } - - friend void swap(managed_open_or_create_impl &left, managed_open_or_create_impl &right) - { - left.swap(right); - } - - private: - friend class interprocess_tester; - void dont_close_on_destruction() - { interprocess_tester::dont_close_on_destruction(m_mapped_region); } - - mapped_region m_mapped_region; -}; - -} //namespace ipcdetail { - -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //#ifndef BOOST_INTERPROCESS_MANAGED_OPEN_OR_CREATE_IMPL |