diff options
Diffstat (limited to 'src/third_party/boost-1.56.0/boost/interprocess')
72 files changed, 0 insertions, 21125 deletions
diff --git a/src/third_party/boost-1.56.0/boost/interprocess/allocators/allocator.hpp b/src/third_party/boost-1.56.0/boost/interprocess/allocators/allocator.hpp deleted file mode 100644 index 5901a0fe987..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/allocators/allocator.hpp +++ /dev/null @@ -1,306 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_ALLOCATOR_HPP -#define BOOST_INTERPROCESS_ALLOCATOR_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> - -#include <boost/intrusive/pointer_traits.hpp> - -#include <boost/interprocess/interprocess_fwd.hpp> -#include <boost/interprocess/containers/allocation_type.hpp> -#include <boost/container/detail/multiallocation_chain.hpp> -#include <boost/interprocess/allocators/detail/allocator_common.hpp> -#include <boost/interprocess/detail/utilities.hpp> -#include <boost/interprocess/containers/version_type.hpp> -#include <boost/interprocess/exceptions.hpp> -#include <boost/assert.hpp> -#include <boost/utility/addressof.hpp> -#include <boost/interprocess/detail/type_traits.hpp> - -#include <memory> -#include <new> -#include <algorithm> -#include <cstddef> -#include <stdexcept> - -//!\file -//!Describes an allocator that allocates portions of fixed size -//!memory buffer (shared memory, mapped file...) - -namespace boost { -namespace interprocess { - - -//!An STL compatible allocator that uses a segment manager as -//!memory source. The internal pointer type will of the same type (raw, smart) as -//!"typename SegmentManager::void_pointer" type. This allows -//!placing the allocator in shared memory, memory mapped-files, etc... -template<class T, class SegmentManager> -class allocator -{ - public: - //Segment manager - typedef SegmentManager segment_manager; - typedef typename SegmentManager::void_pointer void_pointer; - - /// @cond - private: - - //Self type - typedef allocator<T, SegmentManager> self_t; - - //Pointer to void - typedef typename segment_manager::void_pointer aux_pointer_t; - - //Typedef to const void pointer - typedef typename boost::intrusive:: - pointer_traits<aux_pointer_t>::template - rebind_pointer<const void>::type cvoid_ptr; - - //Pointer to the allocator - typedef typename boost::intrusive:: - pointer_traits<cvoid_ptr>::template - rebind_pointer<segment_manager>::type alloc_ptr_t; - - //Not assignable from related allocator - template<class T2, class SegmentManager2> - allocator& operator=(const allocator<T2, SegmentManager2>&); - - //Not assignable from other allocator - allocator& operator=(const allocator&); - - //Pointer to the allocator - alloc_ptr_t mp_mngr; - /// @endcond - - public: - typedef T value_type; - typedef typename boost::intrusive:: - pointer_traits<cvoid_ptr>::template - rebind_pointer<T>::type pointer; - typedef typename boost::intrusive:: - pointer_traits<pointer>::template - rebind_pointer<const T>::type const_pointer; - typedef typename ipcdetail::add_reference - <value_type>::type reference; - typedef typename ipcdetail::add_reference - <const value_type>::type const_reference; - typedef typename segment_manager::size_type size_type; - typedef typename segment_manager::difference_type difference_type; - - typedef boost::interprocess::version_type<allocator, 2> version; - - /// @cond - - //Experimental. Don't use. - typedef boost::container::container_detail::transform_multiallocation_chain - <typename SegmentManager::multiallocation_chain, T>multiallocation_chain; - /// @endcond - - //!Obtains an allocator that allocates - //!objects of type T2 - template<class T2> - struct rebind - { - typedef allocator<T2, SegmentManager> other; - }; - - //!Returns the segment manager. - //!Never throws - segment_manager* get_segment_manager()const - { return ipcdetail::to_raw_pointer(mp_mngr); } - - //!Constructor from the segment manager. - //!Never throws - allocator(segment_manager *segment_mngr) - : mp_mngr(segment_mngr) { } - - //!Constructor from other allocator. - //!Never throws - allocator(const allocator &other) - : mp_mngr(other.get_segment_manager()){ } - - //!Constructor from related allocator. - //!Never throws - template<class T2> - allocator(const allocator<T2, SegmentManager> &other) - : mp_mngr(other.get_segment_manager()){} - - //!Allocates memory for an array of count elements. - //!Throws boost::interprocess::bad_alloc if there is no enough memory - pointer allocate(size_type count, cvoid_ptr hint = 0) - { - (void)hint; - if(size_overflows<sizeof(T)>(count)){ - throw bad_alloc(); - } - return pointer(static_cast<value_type*>(mp_mngr->allocate(count*sizeof(T)))); - } - - //!Deallocates memory previously allocated. - //!Never throws - void deallocate(const pointer &ptr, size_type) - { mp_mngr->deallocate((void*)ipcdetail::to_raw_pointer(ptr)); } - - //!Returns the number of elements that could be allocated. - //!Never throws - size_type max_size() const - { return mp_mngr->get_size()/sizeof(T); } - - //!Swap segment manager. Does not throw. If each allocator is placed in - //!different memory segments, the result is undefined. - friend void swap(self_t &alloc1, self_t &alloc2) - { ipcdetail::do_swap(alloc1.mp_mngr, alloc2.mp_mngr); } - - //!Returns maximum the number of objects the previously allocated memory - //!pointed by p can hold. This size only works for memory allocated with - //!allocate, allocation_command and allocate_many. - size_type size(const pointer &p) const - { - return (size_type)mp_mngr->size(ipcdetail::to_raw_pointer(p))/sizeof(T); - } - - std::pair<pointer, bool> - allocation_command(boost::interprocess::allocation_type command, - size_type limit_size, - size_type preferred_size, - size_type &received_size, const pointer &reuse = 0) - { - return mp_mngr->allocation_command - (command, limit_size, preferred_size, received_size, ipcdetail::to_raw_pointer(reuse)); - } - - //!Allocates many elements of size elem_size in a contiguous block - //!of memory. The minimum number to be allocated is min_elements, - //!the preferred and maximum number is - //!preferred_elements. The number of actually allocated elements is - //!will be assigned to received_size. The elements must be deallocated - //!with deallocate(...) - void allocate_many(size_type elem_size, size_type num_elements, multiallocation_chain &chain) - { - if(size_overflows<sizeof(T)>(elem_size)){ - throw bad_alloc(); - } - mp_mngr->allocate_many(elem_size*sizeof(T), num_elements, chain); - } - - //!Allocates n_elements elements, each one of size elem_sizes[i]in a - //!contiguous block - //!of memory. The elements must be deallocated - void allocate_many(const size_type *elem_sizes, size_type n_elements, multiallocation_chain &chain) - { - mp_mngr->allocate_many(elem_sizes, n_elements, sizeof(T), chain); - } - - //!Allocates many elements of size elem_size in a contiguous block - //!of memory. The minimum number to be allocated is min_elements, - //!the preferred and maximum number is - //!preferred_elements. The number of actually allocated elements is - //!will be assigned to received_size. The elements must be deallocated - //!with deallocate(...) - void deallocate_many(multiallocation_chain &chain) - { mp_mngr->deallocate_many(chain); } - - //!Allocates just one object. Memory allocated with this function - //!must be deallocated only with deallocate_one(). - //!Throws boost::interprocess::bad_alloc if there is no enough memory - pointer allocate_one() - { return this->allocate(1); } - - //!Allocates many elements of size == 1 in a contiguous block - //!of memory. The minimum number to be allocated is min_elements, - //!the preferred and maximum number is - //!preferred_elements. The number of actually allocated elements is - //!will be assigned to received_size. Memory allocated with this function - //!must be deallocated only with deallocate_one(). - void allocate_individual(size_type num_elements, multiallocation_chain &chain) - { this->allocate_many(1, num_elements, chain); } - - //!Deallocates memory previously allocated with allocate_one(). - //!You should never use deallocate_one to deallocate memory allocated - //!with other functions different from allocate_one(). Never throws - void deallocate_one(const pointer &p) - { return this->deallocate(p, 1); } - - //!Allocates many elements of size == 1 in a contiguous block - //!of memory. The minimum number to be allocated is min_elements, - //!the preferred and maximum number is - //!preferred_elements. The number of actually allocated elements is - //!will be assigned to received_size. Memory allocated with this function - //!must be deallocated only with deallocate_one(). - void deallocate_individual(multiallocation_chain &chain) - { this->deallocate_many(chain); } - - //!Returns address of mutable object. - //!Never throws - pointer address(reference value) const - { return pointer(boost::addressof(value)); } - - //!Returns address of non mutable object. - //!Never throws - const_pointer address(const_reference value) const - { return const_pointer(boost::addressof(value)); } - - //!Constructs an object - //!Throws if T's constructor throws - //!For backwards compatibility with libraries using C++03 allocators - template<class P> - void construct(const pointer &ptr, BOOST_FWD_REF(P) p) - { ::new((void*)ipcdetail::to_raw_pointer(ptr)) value_type(::boost::forward<P>(p)); } - - //!Destroys object. Throws if object's - //!destructor throws - void destroy(const pointer &ptr) - { BOOST_ASSERT(ptr != 0); (*ptr).~value_type(); } - -}; - -//!Equality test for same type -//!of allocator -template<class T, class SegmentManager> inline -bool operator==(const allocator<T , SegmentManager> &alloc1, - const allocator<T, SegmentManager> &alloc2) - { return alloc1.get_segment_manager() == alloc2.get_segment_manager(); } - -//!Inequality test for same type -//!of allocator -template<class T, class SegmentManager> inline -bool operator!=(const allocator<T, SegmentManager> &alloc1, - const allocator<T, SegmentManager> &alloc2) - { return alloc1.get_segment_manager() != alloc2.get_segment_manager(); } - -} //namespace interprocess { - -/// @cond - -template<class T> -struct has_trivial_destructor; - -template<class T, class SegmentManager> -struct has_trivial_destructor - <boost::interprocess::allocator <T, SegmentManager> > -{ - static const bool value = true; -}; -/// @endcond - -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //BOOST_INTERPROCESS_ALLOCATOR_HPP - diff --git a/src/third_party/boost-1.56.0/boost/interprocess/allocators/detail/allocator_common.hpp b/src/third_party/boost-1.56.0/boost/interprocess/allocators/detail/allocator_common.hpp deleted file mode 100644 index f2b54a8abcb..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/allocators/detail/allocator_common.hpp +++ /dev/null @@ -1,850 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2008-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_ALLOCATOR_DETAIL_ALLOCATOR_COMMON_HPP -#define BOOST_INTERPROCESS_ALLOCATOR_DETAIL_ALLOCATOR_COMMON_HPP - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> - -#include <boost/intrusive/pointer_traits.hpp> - -#include <boost/interprocess/interprocess_fwd.hpp> -#include <boost/interprocess/detail/utilities.hpp> //to_raw_pointer -#include <boost/utility/addressof.hpp> //boost::addressof -#include <boost/assert.hpp> //BOOST_ASSERT -#include <boost/interprocess/exceptions.hpp> //bad_alloc -#include <boost/interprocess/sync/scoped_lock.hpp> //scoped_lock -#include <boost/interprocess/containers/allocation_type.hpp> //boost::interprocess::allocation_type -#include <boost/container/detail/multiallocation_chain.hpp> -#include <boost/interprocess/mem_algo/detail/mem_algo_common.hpp> -#include <boost/interprocess/detail/segment_manager_helper.hpp> -#include <boost/move/move.hpp> -#include <boost/interprocess/detail/type_traits.hpp> -#include <boost/interprocess/detail/utilities.hpp> -#include <algorithm> //std::swap -#include <utility> //std::pair -#include <new> - -namespace boost { -namespace interprocess { - -template <class T> -struct sizeof_value -{ - static const std::size_t value = sizeof(T); -}; - -template <> -struct sizeof_value<void> -{ - static const std::size_t value = sizeof(void*); -}; - -template <> -struct sizeof_value<const void> -{ - static const std::size_t value = sizeof(void*); -}; - -template <> -struct sizeof_value<volatile void> -{ - static const std::size_t value = sizeof(void*); -}; - -template <> -struct sizeof_value<const volatile void> -{ - static const std::size_t value = sizeof(void*); -}; - -namespace ipcdetail { - -//!Object function that creates the node allocator if it is not created and -//!increments reference count if it is already created -template<class NodePool> -struct get_or_create_node_pool_func -{ - - //!This connects or constructs the unique instance of node_pool_t - //!Can throw boost::interprocess::bad_alloc - void operator()() - { - //Find or create the node_pool_t - mp_node_pool = mp_segment_manager->template find_or_construct - <NodePool>(boost::interprocess::unique_instance)(mp_segment_manager); - //If valid, increment link count - if(mp_node_pool != 0) - mp_node_pool->inc_ref_count(); - } - - //!Constructor. Initializes function - //!object parameters - get_or_create_node_pool_func(typename NodePool::segment_manager *mngr) - : mp_segment_manager(mngr){} - - NodePool *mp_node_pool; - typename NodePool::segment_manager *mp_segment_manager; -}; - -template<class NodePool> -inline NodePool *get_or_create_node_pool(typename NodePool::segment_manager *mgnr) -{ - ipcdetail::get_or_create_node_pool_func<NodePool> func(mgnr); - mgnr->atomic_func(func); - return func.mp_node_pool; -} - -//!Object function that decrements the reference count. If the count -//!reaches to zero destroys the node allocator from memory. -//!Never throws -template<class NodePool> -struct destroy_if_last_link_func -{ - //!Decrements reference count and destroys the object if there is no - //!more attached allocators. Never throws - void operator()() - { - //If not the last link return - if(mp_node_pool->dec_ref_count() != 0) return; - - //Last link, let's destroy the segment_manager - mp_node_pool->get_segment_manager()->template destroy<NodePool>(boost::interprocess::unique_instance); - } - - //!Constructor. Initializes function - //!object parameters - destroy_if_last_link_func(NodePool *pool) - : mp_node_pool(pool) - {} - - NodePool *mp_node_pool; -}; - -//!Destruction function, initializes and executes destruction function -//!object. Never throws -template<class NodePool> -inline void destroy_node_pool_if_last_link(NodePool *pool) -{ - //Get segment manager - typename NodePool::segment_manager *mngr = pool->get_segment_manager(); - //Execute destruction functor atomically - destroy_if_last_link_func<NodePool>func(pool); - mngr->atomic_func(func); -} - -template<class NodePool> -class cache_impl -{ - typedef typename NodePool::segment_manager:: - void_pointer void_pointer; - typedef typename boost::intrusive:: - pointer_traits<void_pointer>::template - rebind_pointer<NodePool>::type node_pool_ptr; - typedef typename NodePool::multiallocation_chain multiallocation_chain; - typedef typename NodePool::segment_manager::size_type size_type; - node_pool_ptr mp_node_pool; - multiallocation_chain m_cached_nodes; - size_type m_max_cached_nodes; - - public: - typedef typename NodePool::segment_manager segment_manager; - - cache_impl(segment_manager *segment_mngr, size_type max_cached_nodes) - : mp_node_pool(get_or_create_node_pool<NodePool>(segment_mngr)) - , m_max_cached_nodes(max_cached_nodes) - {} - - cache_impl(const cache_impl &other) - : mp_node_pool(other.get_node_pool()) - , m_max_cached_nodes(other.get_max_cached_nodes()) - { - mp_node_pool->inc_ref_count(); - } - - ~cache_impl() - { - this->deallocate_all_cached_nodes(); - ipcdetail::destroy_node_pool_if_last_link(ipcdetail::to_raw_pointer(mp_node_pool)); - } - - NodePool *get_node_pool() const - { return ipcdetail::to_raw_pointer(mp_node_pool); } - - segment_manager *get_segment_manager() const - { return mp_node_pool->get_segment_manager(); } - - size_type get_max_cached_nodes() const - { return m_max_cached_nodes; } - - void *cached_allocation() - { - //If don't have any cached node, we have to get a new list of free nodes from the pool - if(m_cached_nodes.empty()){ - mp_node_pool->allocate_nodes(m_max_cached_nodes/2, m_cached_nodes); - } - void *ret = ipcdetail::to_raw_pointer(m_cached_nodes.pop_front()); - return ret; - } - - void cached_allocation(size_type n, multiallocation_chain &chain) - { - size_type count = n, allocated(0); - BOOST_TRY{ - //If don't have any cached node, we have to get a new list of free nodes from the pool - while(!m_cached_nodes.empty() && count--){ - void *ret = ipcdetail::to_raw_pointer(m_cached_nodes.pop_front()); - chain.push_back(ret); - ++allocated; - } - - if(allocated != n){ - mp_node_pool->allocate_nodes(n - allocated, chain); - } - } - BOOST_CATCH(...){ - this->cached_deallocation(chain); - BOOST_RETHROW - } - BOOST_CATCH_END - } - - void cached_deallocation(void *ptr) - { - //Check if cache is full - if(m_cached_nodes.size() >= m_max_cached_nodes){ - //This only occurs if this allocator deallocate memory allocated - //with other equal allocator. Since the cache is full, and more - //deallocations are probably coming, we'll make some room in cache - //in a single, efficient multi node deallocation. - this->priv_deallocate_n_nodes(m_cached_nodes.size() - m_max_cached_nodes/2); - } - m_cached_nodes.push_front(ptr); - } - - void cached_deallocation(multiallocation_chain &chain) - { - m_cached_nodes.splice_after(m_cached_nodes.before_begin(), chain); - - //Check if cache is full - if(m_cached_nodes.size() >= m_max_cached_nodes){ - //This only occurs if this allocator deallocate memory allocated - //with other equal allocator. Since the cache is full, and more - //deallocations are probably coming, we'll make some room in cache - //in a single, efficient multi node deallocation. - this->priv_deallocate_n_nodes(m_cached_nodes.size() - m_max_cached_nodes/2); - } - } - - //!Sets the new max cached nodes value. This can provoke deallocations - //!if "newmax" is less than current cached nodes. Never throws - void set_max_cached_nodes(size_type newmax) - { - m_max_cached_nodes = newmax; - this->priv_deallocate_remaining_nodes(); - } - - //!Frees all cached nodes. - //!Never throws - void deallocate_all_cached_nodes() - { - if(m_cached_nodes.empty()) return; - mp_node_pool->deallocate_nodes(m_cached_nodes); - } - - private: - //!Frees all cached nodes at once. - //!Never throws - void priv_deallocate_remaining_nodes() - { - if(m_cached_nodes.size() > m_max_cached_nodes){ - priv_deallocate_n_nodes(m_cached_nodes.size()-m_max_cached_nodes); - } - } - - //!Frees n cached nodes at once. Never throws - void priv_deallocate_n_nodes(size_type n) - { - //This only occurs if this allocator deallocate memory allocated - //with other equal allocator. Since the cache is full, and more - //deallocations are probably coming, we'll make some room in cache - //in a single, efficient multi node deallocation. - size_type count(n); - typename multiallocation_chain::iterator it(m_cached_nodes.before_begin()); - while(count--){ - ++it; - } - multiallocation_chain chain; - chain.splice_after(chain.before_begin(), m_cached_nodes, m_cached_nodes.before_begin(), it, n); - //Deallocate all new linked list at once - mp_node_pool->deallocate_nodes(chain); - } - - public: - void swap(cache_impl &other) - { - ipcdetail::do_swap(mp_node_pool, other.mp_node_pool); - m_cached_nodes.swap(other.m_cached_nodes); - ipcdetail::do_swap(m_max_cached_nodes, other.m_max_cached_nodes); - } -}; - -template<class Derived, class T, class SegmentManager> -class array_allocation_impl -{ - const Derived *derived() const - { return static_cast<const Derived*>(this); } - Derived *derived() - { return static_cast<Derived*>(this); } - - typedef typename SegmentManager::void_pointer void_pointer; - - public: - typedef typename boost::intrusive:: - pointer_traits<void_pointer>::template - rebind_pointer<T>::type pointer; - typedef typename boost::intrusive:: - pointer_traits<void_pointer>::template - rebind_pointer<const T>::type const_pointer; - typedef T value_type; - typedef typename ipcdetail::add_reference - <value_type>::type reference; - typedef typename ipcdetail::add_reference - <const value_type>::type const_reference; - typedef typename SegmentManager::size_type size_type; - typedef typename SegmentManager::difference_type difference_type; - typedef boost::container::container_detail::transform_multiallocation_chain - <typename SegmentManager::multiallocation_chain, T>multiallocation_chain; - - - public: - //!Returns maximum the number of objects the previously allocated memory - //!pointed by p can hold. This size only works for memory allocated with - //!allocate, allocation_command and allocate_many. - size_type size(const pointer &p) const - { - return (size_type)this->derived()->get_segment_manager()->size(ipcdetail::to_raw_pointer(p))/sizeof(T); - } - - std::pair<pointer, bool> - allocation_command(boost::interprocess::allocation_type command, - size_type limit_size, - size_type preferred_size, - size_type &received_size, const pointer &reuse = 0) - { - return this->derived()->get_segment_manager()->allocation_command - (command, limit_size, preferred_size, received_size, ipcdetail::to_raw_pointer(reuse)); - } - - //!Allocates many elements of size elem_size in a contiguous block - //!of memory. The minimum number to be allocated is min_elements, - //!the preferred and maximum number is - //!preferred_elements. The number of actually allocated elements is - //!will be assigned to received_size. The elements must be deallocated - //!with deallocate(...) - void allocate_many(size_type elem_size, size_type num_elements, multiallocation_chain &chain) - { - if(size_overflows<sizeof(T)>(elem_size)){ - throw bad_alloc(); - } - this->derived()->get_segment_manager()->allocate_many(elem_size*sizeof(T), num_elements, chain); - } - - //!Allocates n_elements elements, each one of size elem_sizes[i]in a - //!contiguous block - //!of memory. The elements must be deallocated - void allocate_many(const size_type *elem_sizes, size_type n_elements, multiallocation_chain &chain) - { - this->derived()->get_segment_manager()->allocate_many(elem_sizes, n_elements, sizeof(T), chain); - } - - //!Allocates many elements of size elem_size in a contiguous block - //!of memory. The minimum number to be allocated is min_elements, - //!the preferred and maximum number is - //!preferred_elements. The number of actually allocated elements is - //!will be assigned to received_size. The elements must be deallocated - //!with deallocate(...) - void deallocate_many(multiallocation_chain &chain) - { this->derived()->get_segment_manager()->deallocate_many(chain); } - - //!Returns the number of elements that could be - //!allocated. Never throws - size_type max_size() const - { return this->derived()->get_segment_manager()->get_size()/sizeof(T); } - - //!Returns address of mutable object. - //!Never throws - pointer address(reference value) const - { return pointer(boost::addressof(value)); } - - //!Returns address of non mutable object. - //!Never throws - const_pointer address(const_reference value) const - { return const_pointer(boost::addressof(value)); } - - //!Constructs an object - //!Throws if T's constructor throws - //!For backwards compatibility with libraries using C++03 allocators - template<class P> - void construct(const pointer &ptr, BOOST_FWD_REF(P) p) - { ::new((void*)ipcdetail::to_raw_pointer(ptr)) value_type(::boost::forward<P>(p)); } - - //!Destroys object. Throws if object's - //!destructor throws - void destroy(const pointer &ptr) - { BOOST_ASSERT(ptr != 0); (*ptr).~value_type(); } -}; - - -template<class Derived, unsigned int Version, class T, class SegmentManager> -class node_pool_allocation_impl - : public array_allocation_impl - < Derived - , T - , SegmentManager> -{ - const Derived *derived() const - { return static_cast<const Derived*>(this); } - Derived *derived() - { return static_cast<Derived*>(this); } - - typedef typename SegmentManager::void_pointer void_pointer; - typedef typename boost::intrusive:: - pointer_traits<void_pointer>::template - rebind_pointer<const void>::type cvoid_pointer; - - public: - typedef typename boost::intrusive:: - pointer_traits<void_pointer>::template - rebind_pointer<T>::type pointer; - typedef typename boost::intrusive:: - pointer_traits<void_pointer>::template - rebind_pointer<const T>::type const_pointer; - typedef T value_type; - typedef typename ipcdetail::add_reference - <value_type>::type reference; - typedef typename ipcdetail::add_reference - <const value_type>::type const_reference; - typedef typename SegmentManager::size_type size_type; - typedef typename SegmentManager::difference_type difference_type; - typedef boost::container::container_detail::transform_multiallocation_chain - <typename SegmentManager::multiallocation_chain, T>multiallocation_chain; - - - template <int Dummy> - struct node_pool - { - typedef typename Derived::template node_pool<0>::type type; - static type *get(void *p) - { return static_cast<type*>(p); } - }; - - public: - //!Allocate memory for an array of count elements. - //!Throws boost::interprocess::bad_alloc if there is no enough memory - pointer allocate(size_type count, cvoid_pointer hint = 0) - { - (void)hint; - typedef typename node_pool<0>::type node_pool_t; - node_pool_t *pool = node_pool<0>::get(this->derived()->get_node_pool()); - if(size_overflows<sizeof(T)>(count)){ - throw bad_alloc(); - } - else if(Version == 1 && count == 1){ - return pointer(static_cast<value_type*> - (pool->allocate_node())); - } - else{ - return pointer(static_cast<value_type*> - (pool->get_segment_manager()->allocate(count*sizeof(T)))); - } - } - - //!Deallocate allocated memory. Never throws - void deallocate(const pointer &ptr, size_type count) - { - (void)count; - typedef typename node_pool<0>::type node_pool_t; - node_pool_t *pool = node_pool<0>::get(this->derived()->get_node_pool()); - if(Version == 1 && count == 1) - pool->deallocate_node(ipcdetail::to_raw_pointer(ptr)); - else - pool->get_segment_manager()->deallocate((void*)ipcdetail::to_raw_pointer(ptr)); - } - - //!Allocates just one object. Memory allocated with this function - //!must be deallocated only with deallocate_one(). - //!Throws boost::interprocess::bad_alloc if there is no enough memory - pointer allocate_one() - { - typedef typename node_pool<0>::type node_pool_t; - node_pool_t *pool = node_pool<0>::get(this->derived()->get_node_pool()); - return pointer(static_cast<value_type*>(pool->allocate_node())); - } - - //!Allocates many elements of size == 1 in a contiguous block - //!of memory. The minimum number to be allocated is min_elements, - //!the preferred and maximum number is - //!preferred_elements. The number of actually allocated elements is - //!will be assigned to received_size. Memory allocated with this function - //!must be deallocated only with deallocate_one(). - void allocate_individual(size_type num_elements, multiallocation_chain &chain) - { - typedef typename node_pool<0>::type node_pool_t; - node_pool_t *pool = node_pool<0>::get(this->derived()->get_node_pool()); - pool->allocate_nodes(num_elements, chain); - } - - //!Deallocates memory previously allocated with allocate_one(). - //!You should never use deallocate_one to deallocate memory allocated - //!with other functions different from allocate_one(). Never throws - void deallocate_one(const pointer &p) - { - typedef typename node_pool<0>::type node_pool_t; - node_pool_t *pool = node_pool<0>::get(this->derived()->get_node_pool()); - pool->deallocate_node(ipcdetail::to_raw_pointer(p)); - } - - //!Allocates many elements of size == 1 in a contiguous block - //!of memory. The minimum number to be allocated is min_elements, - //!the preferred and maximum number is - //!preferred_elements. The number of actually allocated elements is - //!will be assigned to received_size. Memory allocated with this function - //!must be deallocated only with deallocate_one(). - void deallocate_individual(multiallocation_chain &chain) - { - node_pool<0>::get(this->derived()->get_node_pool())->deallocate_nodes - (chain); - } - - //!Deallocates all free blocks of the pool - void deallocate_free_blocks() - { node_pool<0>::get(this->derived()->get_node_pool())->deallocate_free_blocks(); } - - //!Deprecated, use deallocate_free_blocks. - //!Deallocates all free chunks of the pool. - void deallocate_free_chunks() - { node_pool<0>::get(this->derived()->get_node_pool())->deallocate_free_blocks(); } -}; - -template<class T, class NodePool, unsigned int Version> -class cached_allocator_impl - : public array_allocation_impl - <cached_allocator_impl<T, NodePool, Version>, T, typename NodePool::segment_manager> -{ - cached_allocator_impl & operator=(const cached_allocator_impl& other); - typedef array_allocation_impl - < cached_allocator_impl - <T, NodePool, Version> - , T - , typename NodePool::segment_manager> base_t; - - public: - typedef NodePool node_pool_t; - typedef typename NodePool::segment_manager segment_manager; - typedef typename segment_manager::void_pointer void_pointer; - typedef typename boost::intrusive:: - pointer_traits<void_pointer>::template - rebind_pointer<const void>::type cvoid_pointer; - typedef typename base_t::pointer pointer; - typedef typename base_t::size_type size_type; - typedef typename base_t::multiallocation_chain multiallocation_chain; - typedef typename base_t::value_type value_type; - - public: - static const std::size_t DEFAULT_MAX_CACHED_NODES = 64; - - cached_allocator_impl(segment_manager *segment_mngr, size_type max_cached_nodes) - : m_cache(segment_mngr, max_cached_nodes) - {} - - cached_allocator_impl(const cached_allocator_impl &other) - : m_cache(other.m_cache) - {} - - //!Copy constructor from related cached_adaptive_pool_base. If not present, constructs - //!a node pool. Increments the reference count of the associated node pool. - //!Can throw boost::interprocess::bad_alloc - template<class T2, class NodePool2> - cached_allocator_impl - (const cached_allocator_impl - <T2, NodePool2, Version> &other) - : m_cache(other.get_segment_manager(), other.get_max_cached_nodes()) - {} - - //!Returns a pointer to the node pool. - //!Never throws - node_pool_t* get_node_pool() const - { return m_cache.get_node_pool(); } - - //!Returns the segment manager. - //!Never throws - segment_manager* get_segment_manager()const - { return m_cache.get_segment_manager(); } - - //!Sets the new max cached nodes value. This can provoke deallocations - //!if "newmax" is less than current cached nodes. Never throws - void set_max_cached_nodes(size_type newmax) - { m_cache.set_max_cached_nodes(newmax); } - - //!Returns the max cached nodes parameter. - //!Never throws - size_type get_max_cached_nodes() const - { return m_cache.get_max_cached_nodes(); } - - //!Allocate memory for an array of count elements. - //!Throws boost::interprocess::bad_alloc if there is no enough memory - pointer allocate(size_type count, cvoid_pointer hint = 0) - { - (void)hint; - void * ret; - if(size_overflows<sizeof(T)>(count)){ - throw bad_alloc(); - } - else if(Version == 1 && count == 1){ - ret = m_cache.cached_allocation(); - } - else{ - ret = this->get_segment_manager()->allocate(count*sizeof(T)); - } - return pointer(static_cast<T*>(ret)); - } - - //!Deallocate allocated memory. Never throws - void deallocate(const pointer &ptr, size_type count) - { - (void)count; - if(Version == 1 && count == 1){ - m_cache.cached_deallocation(ipcdetail::to_raw_pointer(ptr)); - } - else{ - this->get_segment_manager()->deallocate((void*)ipcdetail::to_raw_pointer(ptr)); - } - } - - //!Allocates just one object. Memory allocated with this function - //!must be deallocated only with deallocate_one(). - //!Throws boost::interprocess::bad_alloc if there is no enough memory - pointer allocate_one() - { return pointer(static_cast<value_type*>(this->m_cache.cached_allocation())); } - - //!Allocates many elements of size == 1 in a contiguous block - //!of memory. The minimum number to be allocated is min_elements, - //!the preferred and maximum number is - //!preferred_elements. The number of actually allocated elements is - //!will be assigned to received_size. Memory allocated with this function - //!must be deallocated only with deallocate_one(). - void allocate_individual(size_type num_elements, multiallocation_chain &chain) - { this->m_cache.cached_allocation(num_elements, chain); } - - //!Deallocates memory previously allocated with allocate_one(). - //!You should never use deallocate_one to deallocate memory allocated - //!with other functions different from allocate_one(). Never throws - void deallocate_one(const pointer &p) - { this->m_cache.cached_deallocation(ipcdetail::to_raw_pointer(p)); } - - //!Allocates many elements of size == 1 in a contiguous block - //!of memory. The minimum number to be allocated is min_elements, - //!the preferred and maximum number is - //!preferred_elements. The number of actually allocated elements is - //!will be assigned to received_size. Memory allocated with this function - //!must be deallocated only with deallocate_one(). - void deallocate_individual(multiallocation_chain &chain) - { m_cache.cached_deallocation(chain); } - - //!Deallocates all free blocks of the pool - void deallocate_free_blocks() - { m_cache.get_node_pool()->deallocate_free_blocks(); } - - //!Swaps allocators. Does not throw. If each allocator is placed in a - //!different shared memory segments, the result is undefined. - friend void swap(cached_allocator_impl &alloc1, cached_allocator_impl &alloc2) - { alloc1.m_cache.swap(alloc2.m_cache); } - - void deallocate_cache() - { m_cache.deallocate_all_cached_nodes(); } - - //!Deprecated use deallocate_free_blocks. - void deallocate_free_chunks() - { m_cache.get_node_pool()->deallocate_free_blocks(); } - - /// @cond - private: - cache_impl<node_pool_t> m_cache; -}; - -//!Equality test for same type of -//!cached_allocator_impl -template<class T, class N, unsigned int V> inline -bool operator==(const cached_allocator_impl<T, N, V> &alloc1, - const cached_allocator_impl<T, N, V> &alloc2) - { return alloc1.get_node_pool() == alloc2.get_node_pool(); } - -//!Inequality test for same type of -//!cached_allocator_impl -template<class T, class N, unsigned int V> inline -bool operator!=(const cached_allocator_impl<T, N, V> &alloc1, - const cached_allocator_impl<T, N, V> &alloc2) - { return alloc1.get_node_pool() != alloc2.get_node_pool(); } - - -//!Pooled shared memory allocator using adaptive pool. Includes -//!a reference count but the class does not delete itself, this is -//!responsibility of user classes. Node size (NodeSize) and the number of -//!nodes allocated per block (NodesPerBlock) are known at compile time -template<class private_node_allocator_t> -class shared_pool_impl - : public private_node_allocator_t -{ - public: - //!Segment manager typedef - typedef typename private_node_allocator_t:: - segment_manager segment_manager; - typedef typename private_node_allocator_t:: - multiallocation_chain multiallocation_chain; - typedef typename private_node_allocator_t:: - size_type size_type; - - private: - typedef typename segment_manager::mutex_family::mutex_type mutex_type; - - public: - //!Constructor from a segment manager. Never throws - shared_pool_impl(segment_manager *segment_mngr) - : private_node_allocator_t(segment_mngr) - {} - - //!Destructor. Deallocates all allocated blocks. Never throws - ~shared_pool_impl() - {} - - //!Allocates array of count elements. Can throw boost::interprocess::bad_alloc - void *allocate_node() - { - //----------------------- - boost::interprocess::scoped_lock<mutex_type> guard(m_header); - //----------------------- - return private_node_allocator_t::allocate_node(); - } - - //!Deallocates an array pointed by ptr. Never throws - void deallocate_node(void *ptr) - { - //----------------------- - boost::interprocess::scoped_lock<mutex_type> guard(m_header); - //----------------------- - private_node_allocator_t::deallocate_node(ptr); - } - - //!Allocates n nodes. - //!Can throw boost::interprocess::bad_alloc - void allocate_nodes(const size_type n, multiallocation_chain &chain) - { - //----------------------- - boost::interprocess::scoped_lock<mutex_type> guard(m_header); - //----------------------- - private_node_allocator_t::allocate_nodes(n, chain); - } - - //!Deallocates a linked list of nodes ending in null pointer. Never throws - void deallocate_nodes(multiallocation_chain &nodes, size_type num) - { - //----------------------- - boost::interprocess::scoped_lock<mutex_type> guard(m_header); - //----------------------- - private_node_allocator_t::deallocate_nodes(nodes, num); - } - - //!Deallocates the nodes pointed by the multiallocation iterator. Never throws - void deallocate_nodes(multiallocation_chain &chain) - { - //----------------------- - boost::interprocess::scoped_lock<mutex_type> guard(m_header); - //----------------------- - private_node_allocator_t::deallocate_nodes(chain); - } - - //!Deallocates all the free blocks of memory. Never throws - void deallocate_free_blocks() - { - //----------------------- - boost::interprocess::scoped_lock<mutex_type> guard(m_header); - //----------------------- - private_node_allocator_t::deallocate_free_blocks(); - } - - //!Deallocates all used memory from the common pool. - //!Precondition: all nodes allocated from this pool should - //!already be deallocated. Otherwise, undefined behavior. Never throws - void purge_blocks() - { - //----------------------- - boost::interprocess::scoped_lock<mutex_type> guard(m_header); - //----------------------- - private_node_allocator_t::purge_blocks(); - } - - //!Increments internal reference count and returns new count. Never throws - size_type inc_ref_count() - { - //----------------------- - boost::interprocess::scoped_lock<mutex_type> guard(m_header); - //----------------------- - return ++m_header.m_usecount; - } - - //!Decrements internal reference count and returns new count. Never throws - size_type dec_ref_count() - { - //----------------------- - boost::interprocess::scoped_lock<mutex_type> guard(m_header); - //----------------------- - BOOST_ASSERT(m_header.m_usecount > 0); - return --m_header.m_usecount; - } - - //!Deprecated, use deallocate_free_blocks. - void deallocate_free_chunks() - { - //----------------------- - boost::interprocess::scoped_lock<mutex_type> guard(m_header); - //----------------------- - private_node_allocator_t::deallocate_free_blocks(); - } - - //!Deprecated, use purge_blocks. - void purge_chunks() - { - //----------------------- - boost::interprocess::scoped_lock<mutex_type> guard(m_header); - //----------------------- - private_node_allocator_t::purge_blocks(); - } - - private: - //!This struct includes needed data and derives from - //!the mutex type to allow EBO when using null_mutex - struct header_t : mutex_type - { - size_type m_usecount; //Number of attached allocators - - header_t() - : m_usecount(0) {} - } m_header; -}; - -} //namespace ipcdetail { -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //#ifndef BOOST_INTERPROCESS_ALLOCATOR_DETAIL_ALLOCATOR_COMMON_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/containers/allocation_type.hpp b/src/third_party/boost-1.56.0/boost/interprocess/containers/allocation_type.hpp deleted file mode 100644 index c871d575125..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/containers/allocation_type.hpp +++ /dev/null @@ -1,40 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2008-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_CONTAINERS_ALLOCATION_TYPE_HPP -#define BOOST_INTERPROCESS_CONTAINERS_ALLOCATION_TYPE_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/container/detail/allocation_type.hpp> - -namespace boost { -namespace interprocess { - -/// @cond -typedef int allocation_type; -/// @endcond -static const allocation_type allocate_new = boost::container::allocate_new; -static const allocation_type expand_fwd = boost::container::expand_fwd; -static const allocation_type expand_bwd = boost::container::expand_bwd; -static const allocation_type shrink_in_place = boost::container::shrink_in_place; -static const allocation_type try_shrink_in_place= boost::container::try_shrink_in_place; -static const allocation_type nothrow_allocation = boost::container::nothrow_allocation; -static const allocation_type zero_memory = boost::container::zero_memory; - -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif // #ifndef BOOST_INTERPROCESS_CONTAINERS_VERSION_TYPE_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/containers/containers_fwd.hpp b/src/third_party/boost-1.56.0/boost/interprocess/containers/containers_fwd.hpp deleted file mode 100644 index 2f1dfd510d2..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/containers/containers_fwd.hpp +++ /dev/null @@ -1,40 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2009-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_CONTAINERS_CONTAINERS_FWD_HPP -#define BOOST_INTERPROCESS_CONTAINERS_CONTAINERS_FWD_HPP - -/// @cond - -#if defined(_MSC_VER) -# pragma once -#endif - -////////////////////////////////////////////////////////////////////////////// -// Standard predeclarations -////////////////////////////////////////////////////////////////////////////// - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/container/container_fwd.hpp> - -namespace boost { -namespace interprocess { - -using boost::container::ordered_range; -using boost::container::ordered_unique_range; - -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -/// @endcond - -#endif // #ifndef BOOST_INTERPROCESS_CONTAINERS_CONTAINERS_FWD_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/containers/list.hpp b/src/third_party/boost-1.56.0/boost/interprocess/containers/list.hpp deleted file mode 100644 index 0e855efaaf5..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/containers/list.hpp +++ /dev/null @@ -1,33 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2008-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_CONTAINERS_LIST_HPP -#define BOOST_INTERPROCESS_CONTAINERS_LIST_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/container/list.hpp> -#include <boost/interprocess/containers/containers_fwd.hpp> - -namespace boost { -namespace interprocess { - -using boost::container::list; - -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif // #ifndef BOOST_INTERPROCESS_CONTAINERS_LIST_HPP - diff --git a/src/third_party/boost-1.56.0/boost/interprocess/containers/vector.hpp b/src/third_party/boost-1.56.0/boost/interprocess/containers/vector.hpp deleted file mode 100644 index bfae4f833fd..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/containers/vector.hpp +++ /dev/null @@ -1,33 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2008-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_CONTAINERS_VECTOR_HPP -#define BOOST_INTERPROCESS_CONTAINERS_VECTOR_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/container/vector.hpp> -#include <boost/interprocess/containers/containers_fwd.hpp> - -namespace boost { -namespace interprocess { - -using boost::container::vector; - -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif // #ifndef BOOST_INTERPROCESS_CONTAINERS_VECTOR_HPP - diff --git a/src/third_party/boost-1.56.0/boost/interprocess/containers/version_type.hpp b/src/third_party/boost-1.56.0/boost/interprocess/containers/version_type.hpp deleted file mode 100644 index 92ef49f31d9..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/containers/version_type.hpp +++ /dev/null @@ -1,33 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2008-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_CONTAINERS_VERSION_TYPE_HPP -#define BOOST_INTERPROCESS_CONTAINERS_VERSION_TYPE_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/container/detail/version_type.hpp> - -namespace boost { -namespace interprocess { - -using boost::container::container_detail::version_type; -using boost::container::container_detail::version; - -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif // #ifndef BOOST_INTERPROCESS_CONTAINERS_VERSION_TYPE_HPP - diff --git a/src/third_party/boost-1.56.0/boost/interprocess/creation_tags.hpp b/src/third_party/boost-1.56.0/boost/interprocess/creation_tags.hpp deleted file mode 100644 index 459eb4df47c..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/creation_tags.hpp +++ /dev/null @@ -1,77 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_CREATION_TAGS_HPP -#define BOOST_INTERPROCESS_CREATION_TAGS_HPP - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> - -namespace boost { -namespace interprocess { - -//!Tag to indicate that the resource must -//!be only created -struct create_only_t {}; - -//!Tag to indicate that the resource must -//!be only opened -struct open_only_t {}; - -//!Tag to indicate that the resource must -//!be only opened for reading -struct open_read_only_t {}; - -//!Tag to indicate that the resource must -//!be only opened privately for reading -struct open_read_private_t {}; - -//!Tag to indicate that the resource must -//!be only opened for reading -struct open_copy_on_write_t {}; - -//!Tag to indicate that the resource must -//!be created. If already created, it must be opened. -struct open_or_create_t {}; - -//!Value to indicate that the resource must -//!be only created -static const create_only_t create_only = create_only_t(); - -//!Value to indicate that the resource must -//!be only opened -static const open_only_t open_only = open_only_t(); - -//!Value to indicate that the resource must -//!be only opened for reading -static const open_read_only_t open_read_only = open_read_only_t(); - -//!Value to indicate that the resource must -//!be created. If already created, it must be opened. -static const open_or_create_t open_or_create = open_or_create_t(); - -//!Value to indicate that the resource must -//!be only opened for reading -static const open_copy_on_write_t open_copy_on_write = open_copy_on_write_t(); - -namespace ipcdetail { - -enum create_enum_t -{ DoCreate, DoOpen, DoOpenOrCreate }; - -} //namespace ipcdetail { - -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //#ifndef BOOST_INTERPROCESS_CREATION_TAGS_HPP - diff --git a/src/third_party/boost-1.56.0/boost/interprocess/detail/atomic.hpp b/src/third_party/boost-1.56.0/boost/interprocess/detail/atomic.hpp deleted file mode 100644 index 11992d1d157..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/detail/atomic.hpp +++ /dev/null @@ -1,562 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2006-2012 -// (C) Copyright Markus Schoepflin 2007 -// (C) Copyright Bryce Lelbach 2010 -// -// 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_DETAIL_ATOMIC_HPP -#define BOOST_INTERPROCESS_DETAIL_ATOMIC_HPP - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> -#include <boost/cstdint.hpp> - -namespace boost{ -namespace interprocess{ -namespace ipcdetail{ - -//! Atomically increment an boost::uint32_t by 1 -//! "mem": pointer to the object -//! Returns the old value pointed to by mem -inline boost::uint32_t atomic_inc32(volatile boost::uint32_t *mem); - -//! Atomically read an boost::uint32_t from memory -inline boost::uint32_t atomic_read32(volatile boost::uint32_t *mem); - -//! Atomically set an boost::uint32_t in memory -//! "mem": pointer to the object -//! "param": val value that the object will assume -inline void atomic_write32(volatile boost::uint32_t *mem, boost::uint32_t val); - -//! Compare an boost::uint32_t's value with "cmp". -//! If they are the same swap the value with "with" -//! "mem": pointer to the value -//! "with": what to swap it with -//! "cmp": the value to compare it to -//! Returns the old value of *mem -inline boost::uint32_t atomic_cas32 - (volatile boost::uint32_t *mem, boost::uint32_t with, boost::uint32_t cmp); - -} //namespace ipcdetail{ -} //namespace interprocess{ -} //namespace boost{ - -#if defined (BOOST_INTERPROCESS_WINDOWS) - -#include <boost/interprocess/detail/win32_api.hpp> - -namespace boost{ -namespace interprocess{ -namespace ipcdetail{ - -//! Atomically decrement an boost::uint32_t by 1 -//! "mem": pointer to the atomic value -//! Returns the old value pointed to by mem -inline boost::uint32_t atomic_dec32(volatile boost::uint32_t *mem) -{ return winapi::interlocked_decrement(reinterpret_cast<volatile long*>(mem)) + 1; } - -//! Atomically increment an apr_uint32_t by 1 -//! "mem": pointer to the object -//! Returns the old value pointed to by mem -inline boost::uint32_t atomic_inc32(volatile boost::uint32_t *mem) -{ return winapi::interlocked_increment(reinterpret_cast<volatile long*>(mem))-1; } - -//! Atomically read an boost::uint32_t from memory -inline boost::uint32_t atomic_read32(volatile boost::uint32_t *mem) -{ return *mem; } - -//! Atomically set an boost::uint32_t in memory -//! "mem": pointer to the object -//! "param": val value that the object will assume -inline void atomic_write32(volatile boost::uint32_t *mem, boost::uint32_t val) -{ winapi::interlocked_exchange(reinterpret_cast<volatile long*>(mem), val); } - -//! Compare an boost::uint32_t's value with "cmp". -//! If they are the same swap the value with "with" -//! "mem": pointer to the value -//! "with": what to swap it with -//! "cmp": the value to compare it to -//! Returns the old value of *mem -inline boost::uint32_t atomic_cas32 - (volatile boost::uint32_t *mem, boost::uint32_t with, boost::uint32_t cmp) -{ return winapi::interlocked_compare_exchange(reinterpret_cast<volatile long*>(mem), with, cmp); } - -} //namespace ipcdetail{ -} //namespace interprocess{ -} //namespace boost{ - -#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) && !defined(_CRAYC) - -namespace boost { -namespace interprocess { -namespace ipcdetail{ - -//! Compare an boost::uint32_t's value with "cmp". -//! If they are the same swap the value with "with" -//! "mem": pointer to the value -//! "with" what to swap it with -//! "cmp": the value to compare it to -//! Returns the old value of *mem -inline boost::uint32_t atomic_cas32 - (volatile boost::uint32_t *mem, boost::uint32_t with, boost::uint32_t cmp) -{ - boost::uint32_t prev = cmp; - // This version by Mans Rullgard of Pathscale - __asm__ __volatile__ ( "lock\n\t" - "cmpxchg %2,%0" - : "+m"(*mem), "+a"(prev) - : "r"(with) - : "cc"); - - return prev; -} - -//! Atomically add 'val' to an boost::uint32_t -//! "mem": pointer to the object -//! "val": amount to add -//! Returns the old value pointed to by mem -inline boost::uint32_t atomic_add32 - (volatile boost::uint32_t *mem, boost::uint32_t val) -{ - // int r = *pw; - // *mem += val; - // return r; - int r; - - asm volatile - ( - "lock\n\t" - "xadd %1, %0": - "+m"( *mem ), "=r"( r ): // outputs (%0, %1) - "1"( val ): // inputs (%2 == %1) - "memory", "cc" // clobbers - ); - - return r; -} - -//! Atomically increment an apr_uint32_t by 1 -//! "mem": pointer to the object -//! Returns the old value pointed to by mem -inline boost::uint32_t atomic_inc32(volatile boost::uint32_t *mem) -{ return atomic_add32(mem, 1); } - -//! Atomically decrement an boost::uint32_t by 1 -//! "mem": pointer to the atomic value -//! Returns the old value pointed to by mem -inline boost::uint32_t atomic_dec32(volatile boost::uint32_t *mem) -{ return atomic_add32(mem, (boost::uint32_t)-1); } - -//! Atomically read an boost::uint32_t from memory -inline boost::uint32_t atomic_read32(volatile boost::uint32_t *mem) -{ return *mem; } - -//! Atomically set an boost::uint32_t in memory -//! "mem": pointer to the object -//! "param": val value that the object will assume -inline void atomic_write32(volatile boost::uint32_t *mem, boost::uint32_t val) -{ *mem = val; } - -} //namespace ipcdetail{ -} //namespace interprocess{ -} //namespace boost{ - -#elif defined(__GNUC__) && (defined(__PPC__) || defined(__ppc__)) - -namespace boost { -namespace interprocess { -namespace ipcdetail{ - -//! Atomically add 'val' to an boost::uint32_t -//! "mem": pointer to the object -//! "val": amount to add -//! Returns the old value pointed to by mem -inline boost::uint32_t atomic_add32(volatile boost::uint32_t *mem, boost::uint32_t val) -{ - boost::uint32_t prev, temp; - - asm volatile ("1:\n\t" - "lwarx %0,0,%2\n\t" - "add %1,%0,%3\n\t" - "stwcx. %1,0,%2\n\t" - "bne- 1b" - : "=&r" (prev), "=&r" (temp) - : "b" (mem), "r" (val) - : "cc", "memory"); - return prev; -} - -//! Compare an boost::uint32_t's value with "cmp". -//! If they are the same swap the value with "with" -//! "mem": pointer to the value -//! "with" what to swap it with -//! "cmp": the value to compare it to -//! Returns the old value of *mem -inline boost::uint32_t atomic_cas32 - (volatile boost::uint32_t *mem, boost::uint32_t with, boost::uint32_t cmp) -{ - boost::uint32_t prev; - - asm volatile ("1:\n\t" - "lwarx %0,0,%1\n\t" - "cmpw %0,%3\n\t" - "bne- 2f\n\t" - "stwcx. %2,0,%1\n\t" - "bne- 1b\n\t" - "2:" - : "=&r"(prev) - : "b" (mem), "r" (with), "r" (cmp) - : "cc", "memory"); - return prev; -} - -//! Atomically increment an apr_uint32_t by 1 -//! "mem": pointer to the object -//! Returns the old value pointed to by mem -inline boost::uint32_t atomic_inc32(volatile boost::uint32_t *mem) -{ return atomic_add32(mem, 1); } - -//! Atomically decrement an boost::uint32_t by 1 -//! "mem": pointer to the atomic value -//! Returns the old value pointed to by mem -inline boost::uint32_t atomic_dec32(volatile boost::uint32_t *mem) -{ return atomic_add32(mem, boost::uint32_t(-1u)); } - -//! Atomically read an boost::uint32_t from memory -inline boost::uint32_t atomic_read32(volatile boost::uint32_t *mem) -{ return *mem; } - -//! Atomically set an boost::uint32_t in memory -//! "mem": pointer to the object -//! "param": val value that the object will assume -inline void atomic_write32(volatile boost::uint32_t *mem, boost::uint32_t val) -{ *mem = val; } - -} //namespace ipcdetail{ -} //namespace interprocess{ -} //namespace boost{ - -#elif (defined(sun) || defined(__sun)) - -#include <atomic.h> - -namespace boost{ -namespace interprocess{ -namespace ipcdetail{ - -//! Atomically add 'val' to an boost::uint32_t -//! "mem": pointer to the object -//! "val": amount to add -//! Returns the old value pointed to by mem -inline boost::uint32_t atomic_add32(volatile boost::uint32_t *mem, boost::uint32_t val) -{ return atomic_add_32_nv(reinterpret_cast<volatile ::uint32_t*>(mem), (int32_t)val) - val; } - -//! Compare an boost::uint32_t's value with "cmp". -//! If they are the same swap the value with "with" -//! "mem": pointer to the value -//! "with" what to swap it with -//! "cmp": the value to compare it to -//! Returns the old value of *mem -inline boost::uint32_t atomic_cas32 - (volatile boost::uint32_t *mem, boost::uint32_t with, boost::uint32_t cmp) -{ return atomic_cas_32(reinterpret_cast<volatile ::uint32_t*>(mem), cmp, with); } - -//! Atomically increment an apr_uint32_t by 1 -//! "mem": pointer to the object -//! Returns the old value pointed to by mem -inline boost::uint32_t atomic_inc32(volatile boost::uint32_t *mem) -{ return atomic_add_32_nv(reinterpret_cast<volatile ::uint32_t*>(mem), 1) - 1; } - -//! Atomically decrement an boost::uint32_t by 1 -//! "mem": pointer to the atomic value -//! Returns the old value pointed to by mem -inline boost::uint32_t atomic_dec32(volatile boost::uint32_t *mem) -{ return atomic_add_32_nv(reinterpret_cast<volatile ::uint32_t*>(mem), (boost::uint32_t)-1) + 1; } - -//! Atomically read an boost::uint32_t from memory -inline boost::uint32_t atomic_read32(volatile boost::uint32_t *mem) -{ return *mem; } - -//! Atomically set an boost::uint32_t in memory -//! "mem": pointer to the object -//! "param": val value that the object will assume -inline void atomic_write32(volatile boost::uint32_t *mem, boost::uint32_t val) -{ *mem = val; } - -} //namespace ipcdetail{ -} //namespace interprocess{ -} //namespace boost{ - -#elif defined(__osf__) && defined(__DECCXX) - -#include <machine/builtins.h> -#include <c_asm.h> - -namespace boost{ -namespace interprocess{ -namespace ipcdetail{ - -//! Atomically decrement a uint32_t by 1 -//! "mem": pointer to the atomic value -//! Returns the old value pointed to by mem -//! Acquire, memory barrier after decrement. -inline boost::uint32_t atomic_dec32(volatile boost::uint32_t *mem) -{ boost::uint32_t old_val = __ATOMIC_DECREMENT_LONG(mem); __MB(); return old_val; } - -//! Atomically increment a uint32_t by 1 -//! "mem": pointer to the object -//! Returns the old value pointed to by mem -//! Release, memory barrier before increment. -inline boost::uint32_t atomic_inc32(volatile boost::uint32_t *mem) -{ __MB(); return __ATOMIC_INCREMENT_LONG(mem); } - -// Rational for the implementation of the atomic read and write functions. -// -// 1. The Alpha Architecture Handbook requires that access to a byte, -// an aligned word, an aligned longword, or an aligned quadword is -// atomic. (See 'Alpha Architecture Handbook', version 4, chapter 5.2.2.) -// -// 2. The CXX User's Guide states that volatile quantities are accessed -// with single assembler instructions, and that a compilation error -// occurs when declaring a quantity as volatile which is not properly -// aligned. - -//! Atomically read an boost::uint32_t from memory -//! Acquire, memory barrier after load. -inline boost::uint32_t atomic_read32(volatile boost::uint32_t *mem) -{ boost::uint32_t old_val = *mem; __MB(); return old_val; } - -//! Atomically set an boost::uint32_t in memory -//! "mem": pointer to the object -//! "param": val value that the object will assume -//! Release, memory barrier before store. -inline void atomic_write32(volatile boost::uint32_t *mem, boost::uint32_t val) -{ __MB(); *mem = val; } - -//! Compare an boost::uint32_t's value with "cmp". -//! If they are the same swap the value with "with" -//! "mem": pointer to the value -//! "with" what to swap it with -//! "cmp": the value to compare it to -//! Returns the old value of *mem -//! Memory barrier between load and store. -inline boost::uint32_t atomic_cas32( - volatile boost::uint32_t *mem, boost::uint32_t with, boost::uint32_t cmp) -{ - // Note: - // - // Branch prediction prefers backward branches, and the Alpha Architecture - // Handbook explicitely states that the loop should not be implemented like - // it is below. (See chapter 4.2.5.) Therefore the code should probably look - // like this: - // - // return asm( - // "10: ldl_l %v0,(%a0) ;" - // " cmpeq %v0,%a2,%t0 ;" - // " beq %t0,20f ;" - // " mb ;" - // " mov %a1,%t0 ;" - // " stl_c %t0,(%a0) ;" - // " beq %t0,30f ;" - // "20: ret ;" - // "30: br 10b;", - // mem, with, cmp); - // - // But as the compiler always transforms this into the form where a backward - // branch is taken on failure, we can as well implement it in the straight - // forward form, as this is what it will end up in anyway. - - return asm( - "10: ldl_l %v0,(%a0) ;" // load prev value from mem and lock mem - " cmpeq %v0,%a2,%t0 ;" // compare with given value - " beq %t0,20f ;" // if not equal, we're done - " mb ;" // memory barrier - " mov %a1,%t0 ;" // load new value into scratch register - " stl_c %t0,(%a0) ;" // store new value to locked mem (overwriting scratch) - " beq %t0,10b ;" // store failed because lock has been stolen, retry - "20: ", - mem, with, cmp); -} - -} //namespace ipcdetail{ -} //namespace interprocess{ -} //namespace boost{ - -#elif defined(__IBMCPP__) && (__IBMCPP__ >= 800) && defined(_AIX) - -#include <builtins.h> - -namespace boost { -namespace interprocess { -namespace ipcdetail{ - -//first define boost::uint32_t versions of __lwarx and __stwcx to avoid poluting -//all the functions with casts - -//! From XLC documenation : -//! This function can be used with a subsequent stwcxu call to implement a -//! read-modify-write on a specified memory location. The two functions work -//! together to ensure that if the store is successfully performed, no other -//! processor or mechanism can modify the target doubleword between the time -//! lwarxu function is executed and the time the stwcxu functio ncompletes. -//! "mem" : pointer to the object -//! Returns the value at pointed to by mem -inline boost::uint32_t lwarxu(volatile boost::uint32_t *mem) -{ - return static_cast<boost::uint32_t>(__lwarx(reinterpret_cast<volatile int*>(mem))); -} - -//! "mem" : pointer to the object -//! "val" : the value to store -//! Returns true if the update of mem is successful and false if it is -//!unsuccessful -inline bool stwcxu(volatile boost::uint32_t* mem, boost::uint32_t val) -{ - return (__stwcx(reinterpret_cast<volatile int*>(mem), static_cast<int>(val)) != 0); -} - -//! "mem": pointer to the object -//! "val": amount to add -//! Returns the old value pointed to by mem -inline boost::uint32_t atomic_add32 - (volatile boost::uint32_t *mem, boost::uint32_t val) -{ - boost::uint32_t oldValue; - do - { - oldValue = lwarxu(mem); - }while (!stwcxu(mem, oldValue+val)); - return oldValue; -} - -//! Atomically increment an apr_uint32_t by 1 -//! "mem": pointer to the object -//! Returns the old value pointed to by mem -inline boost::uint32_t atomic_inc32(volatile boost::uint32_t *mem) -{ return atomic_add32(mem, 1); } - -//! Atomically decrement an boost::uint32_t by 1 -//! "mem": pointer to the atomic value -//! Returns the old value pointed to by mem -inline boost::uint32_t atomic_dec32(volatile boost::uint32_t *mem) -{ return atomic_add32(mem, (boost::uint32_t)-1); } - -//! Atomically read an boost::uint32_t from memory -inline boost::uint32_t atomic_read32(volatile boost::uint32_t *mem) -{ return *mem; } - -//! Compare an boost::uint32_t's value with "cmp". -//! If they are the same swap the value with "with" -//! "mem": pointer to the value -//! "with" what to swap it with -//! "cmp": the value to compare it to -//! Returns the old value of *mem -inline boost::uint32_t atomic_cas32 - (volatile boost::uint32_t *mem, boost::uint32_t with, boost::uint32_t cmp) -{ - boost::uint32_t oldValue; - boost::uint32_t valueToStore; - do - { - oldValue = lwarxu(mem); - } while (!stwcxu(mem, (oldValue == with) ? cmp : oldValue)); - - return oldValue; -} - -//! Atomically set an boost::uint32_t in memory -//! "mem": pointer to the object -//! "param": val value that the object will assume -inline void atomic_write32(volatile boost::uint32_t *mem, boost::uint32_t val) -{ *mem = val; } - -} //namespace ipcdetail -} //namespace interprocess -} //namespace boost - -#elif defined(__GNUC__) && ( __GNUC__ * 100 + __GNUC_MINOR__ >= 401 ) - -namespace boost { -namespace interprocess { -namespace ipcdetail{ - -//! Atomically add 'val' to an boost::uint32_t -//! "mem": pointer to the object -//! "val": amount to add -//! Returns the old value pointed to by mem -inline boost::uint32_t atomic_add32 - (volatile boost::uint32_t *mem, boost::uint32_t val) -{ return __sync_fetch_and_add(const_cast<boost::uint32_t *>(mem), val); } - -//! Atomically increment an apr_uint32_t by 1 -//! "mem": pointer to the object -//! Returns the old value pointed to by mem -inline boost::uint32_t atomic_inc32(volatile boost::uint32_t *mem) -{ return atomic_add32(mem, 1); } - -//! Atomically decrement an boost::uint32_t by 1 -//! "mem": pointer to the atomic value -//! Returns the old value pointed to by mem -inline boost::uint32_t atomic_dec32(volatile boost::uint32_t *mem) -{ return atomic_add32(mem, (boost::uint32_t)-1); } - -//! Atomically read an boost::uint32_t from memory -inline boost::uint32_t atomic_read32(volatile boost::uint32_t *mem) -{ return *mem; } - -//! Compare an boost::uint32_t's value with "cmp". -//! If they are the same swap the value with "with" -//! "mem": pointer to the value -//! "with" what to swap it with -//! "cmp": the value to compare it to -//! Returns the old value of *mem -inline boost::uint32_t atomic_cas32 - (volatile boost::uint32_t *mem, boost::uint32_t with, boost::uint32_t cmp) -{ return __sync_val_compare_and_swap(const_cast<boost::uint32_t *>(mem), cmp, with); } - -//! Atomically set an boost::uint32_t in memory -//! "mem": pointer to the object -//! "param": val value that the object will assume -inline void atomic_write32(volatile boost::uint32_t *mem, boost::uint32_t val) -{ *mem = val; } - -} //namespace ipcdetail{ -} //namespace interprocess{ -} //namespace boost{ - -#else - -#error No atomic operations implemented for this platform, sorry! - -#endif - -namespace boost{ -namespace interprocess{ -namespace ipcdetail{ - -inline bool atomic_add_unless32 - (volatile boost::uint32_t *mem, boost::uint32_t value, boost::uint32_t unless_this) -{ - boost::uint32_t old, c(atomic_read32(mem)); - while(c != unless_this && (old = atomic_cas32(mem, c + value, c)) != c){ - c = old; - } - return c != unless_this; -} - -} //namespace ipcdetail -} //namespace interprocess -} //namespace boost - - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //BOOST_INTERPROCESS_DETAIL_ATOMIC_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/detail/cast_tags.hpp b/src/third_party/boost-1.56.0/boost/interprocess/detail/cast_tags.hpp deleted file mode 100644 index 37dabd1f8ac..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/detail/cast_tags.hpp +++ /dev/null @@ -1,29 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_CAST_TAGS_HPP -#define BOOST_INTERPROCESS_CAST_TAGS_HPP - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> - -namespace boost { namespace interprocess { namespace ipcdetail { - -struct static_cast_tag {}; -struct const_cast_tag {}; -struct dynamic_cast_tag {}; -struct reinterpret_cast_tag {}; - -}}} //namespace boost { namespace interprocess { namespace ipcdetail { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //#ifndef BOOST_INTERPROCESS_CAST_TAGS_HPP - diff --git a/src/third_party/boost-1.56.0/boost/interprocess/detail/config_begin.hpp b/src/third_party/boost-1.56.0/boost/interprocess/detail/config_begin.hpp deleted file mode 100644 index 9224f7dd64c..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/detail/config_begin.hpp +++ /dev/null @@ -1,48 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_CONFIG_INCLUDED -#define BOOST_INTERPROCESS_CONFIG_INCLUDED -#include <boost/config.hpp> -#endif - -#ifdef BOOST_MSVC - #ifndef _CRT_SECURE_NO_DEPRECATE - #define BOOST_INTERPROCESS_CRT_SECURE_NO_DEPRECATE - #define _CRT_SECURE_NO_DEPRECATE - #endif - #pragma warning (push) - #pragma warning (disable : 4702) // unreachable code - #pragma warning (disable : 4706) // assignment within conditional expression - #pragma warning (disable : 4127) // conditional expression is constant - #pragma warning (disable : 4146) // unary minus operator applied to unsigned type, result still unsigned - #pragma warning (disable : 4284) // odd return type for operator-> - #pragma warning (disable : 4244) // possible loss of data - #pragma warning (disable : 4251) // "identifier" : class "type" needs to have dll-interface to be used by clients of class "type2" - #pragma warning (disable : 4267) // conversion from "X" to "Y", possible loss of data - #pragma warning (disable : 4275) // non DLL-interface classkey "identifier" used as base for DLL-interface classkey "identifier" - #pragma warning (disable : 4355) // "this" : used in base member initializer list - #pragma warning (disable : 4503) // "identifier" : decorated name length exceeded, name was truncated - #pragma warning (disable : 4511) // copy constructor could not be generated - #pragma warning (disable : 4512) // assignment operator could not be generated - #pragma warning (disable : 4514) // unreferenced inline removed - #pragma warning (disable : 4521) // Disable "multiple copy constructors specified" - #pragma warning (disable : 4522) // "class" : multiple assignment operators specified - #pragma warning (disable : 4675) // "method" should be declared "static" and have exactly one parameter - #pragma warning (disable : 4710) // function not inlined - #pragma warning (disable : 4711) // function selected for automatic inline expansion - #pragma warning (disable : 4786) // identifier truncated in debug info - #pragma warning (disable : 4996) // "function": was declared deprecated - #pragma warning (disable : 4197) // top-level volatile in cast is ignored - #pragma warning (disable : 4541) // 'typeid' used on polymorphic type 'boost::exception' - // with /GR-; unpredictable behavior may result - #pragma warning (disable : 4673) // throwing '' the following types will not be considered at the catch site - #pragma warning (disable : 4671) // the copy constructor is inaccessible - #pragma warning (disable : 4250) // inherits 'x' via dominance -#endif diff --git a/src/third_party/boost-1.56.0/boost/interprocess/detail/config_end.hpp b/src/third_party/boost-1.56.0/boost/interprocess/detail/config_end.hpp deleted file mode 100644 index f871ce7546d..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/detail/config_end.hpp +++ /dev/null @@ -1,17 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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. -// -////////////////////////////////////////////////////////////////////////////// -#if defined BOOST_MSVC - #pragma warning (pop) - #ifdef BOOST_INTERPROCESS_CRT_SECURE_NO_DEPRECATE - #undef BOOST_INTERPROCESS_CRT_SECURE_NO_DEPRECATE - #undef _CRT_SECURE_NO_DEPRECATE - #endif -#endif - diff --git a/src/third_party/boost-1.56.0/boost/interprocess/detail/config_external_begin.hpp b/src/third_party/boost-1.56.0/boost/interprocess/detail/config_external_begin.hpp deleted file mode 100644 index fb578ef013a..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/detail/config_external_begin.hpp +++ /dev/null @@ -1,18 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2012-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_EXTERNAL_CONFIG_INCLUDED -#define BOOST_INTERPROCESS_EXTERNAL_CONFIG_INCLUDED -#include <boost/config.hpp> -#endif - -#if defined(__GNUC__) && ((__GNUC__*100 + __GNUC_MINOR__) >= 406) -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wshadow" -#endif diff --git a/src/third_party/boost-1.56.0/boost/interprocess/detail/config_external_end.hpp b/src/third_party/boost-1.56.0/boost/interprocess/detail/config_external_end.hpp deleted file mode 100644 index 214558f58c8..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/detail/config_external_end.hpp +++ /dev/null @@ -1,12 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2012-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. -// -////////////////////////////////////////////////////////////////////////////// -#if defined(__GNUC__) && ((__GNUC__*100 + __GNUC_MINOR__) >= 406) -# pragma GCC diagnostic pop -#endif diff --git a/src/third_party/boost-1.56.0/boost/interprocess/detail/in_place_interface.hpp b/src/third_party/boost-1.56.0/boost/interprocess/detail/in_place_interface.hpp deleted file mode 100644 index 1315a11eed9..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/detail/in_place_interface.hpp +++ /dev/null @@ -1,73 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_IN_PLACE_INTERFACE_HPP -#define BOOST_INTERPROCESS_IN_PLACE_INTERFACE_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> -#include <boost/interprocess/detail/type_traits.hpp> -#include <boost/type_traits/alignment_of.hpp> -#include <typeinfo> //typeid - -//!\file -//!Describes an abstract interface for placement construction and destruction. - -namespace boost { -namespace interprocess { -namespace ipcdetail { - -struct in_place_interface -{ - in_place_interface(std::size_t alignm, std::size_t sz, const char *tname) - : alignment(alignm), size(sz), type_name(tname) - {} - - std::size_t alignment; - std::size_t size; - const char *type_name; - - virtual void construct_n(void *mem, std::size_t num, std::size_t &constructed) = 0; - virtual void destroy_n(void *mem, std::size_t num, std::size_t &destroyed) = 0; - virtual ~in_place_interface(){} -}; - -template<class T> -struct placement_destroy : public in_place_interface -{ - placement_destroy() - : in_place_interface(::boost::alignment_of<T>::value, sizeof(T), typeid(T).name()) - {} - - virtual void destroy_n(void *mem, std::size_t num, std::size_t &destroyed) - { - T* memory = static_cast<T*>(mem); - for(destroyed = 0; destroyed < num; ++destroyed) - (memory++)->~T(); - } - - virtual void construct_n(void *, std::size_t, std::size_t &) {} - - private: - void destroy(void *mem) - { static_cast<T*>(mem)->~T(); } -}; - -} -} -} //namespace boost { namespace interprocess { namespace ipcdetail { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //#ifndef BOOST_INTERPROCESS_IN_PLACE_INTERFACE_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/detail/intermodule_singleton_common.hpp b/src/third_party/boost-1.56.0/boost/interprocess/detail/intermodule_singleton_common.hpp deleted file mode 100644 index 10c9eceabbb..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/detail/intermodule_singleton_common.hpp +++ /dev/null @@ -1,500 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2009-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_INTERMODULE_SINGLETON_COMMON_HPP -#define BOOST_INTERPROCESS_INTERMODULE_SINGLETON_COMMON_HPP - -#if defined(_MSC_VER) -#pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> - -#include <boost/interprocess/detail/atomic.hpp> -#include <boost/interprocess/detail/os_thread_functions.hpp> -#include <boost/interprocess/exceptions.hpp> -#include <boost/type_traits/type_with_alignment.hpp> -#include <boost/interprocess/detail/mpl.hpp> -#include <boost/interprocess/sync/spin/wait.hpp> -#include <boost/assert.hpp> -#include <cstddef> -#include <cstdio> -#include <cstdlib> -#include <cstring> -#include <string> -#include <sstream> - -namespace boost{ -namespace interprocess{ -namespace ipcdetail{ - -namespace intermodule_singleton_helpers { - -inline void get_pid_creation_time_str(std::string &s) -{ - std::stringstream stream; - stream << get_current_process_id() << '_'; - stream.precision(6); - stream << std::fixed << get_current_process_creation_time(); - s = stream.str(); -} - -inline const char *get_map_base_name() -{ return "bip.gmem.map."; } - -inline void get_map_name(std::string &map_name) -{ - get_pid_creation_time_str(map_name); - map_name.insert(0, get_map_base_name()); -} - -inline std::size_t get_map_size() -{ return 65536; } - -template<class ThreadSafeGlobalMap> -struct thread_safe_global_map_dependant; - -} //namespace intermodule_singleton_helpers { - -//This class contains common code for all singleton types, so that we instantiate this -//code just once per module. This class also holds a thread soafe global map -//to be used by all instances protected with a reference count -template<class ThreadSafeGlobalMap> -class intermodule_singleton_common -{ - public: - typedef void*(singleton_constructor_t)(ThreadSafeGlobalMap &); - typedef void (singleton_destructor_t)(void *, ThreadSafeGlobalMap &); - - static const ::boost::uint32_t Uninitialized = 0u; - static const ::boost::uint32_t Initializing = 1u; - static const ::boost::uint32_t Initialized = 2u; - static const ::boost::uint32_t Broken = 3u; - static const ::boost::uint32_t Destroyed = 4u; - - //Initialize this_module_singleton_ptr, creates the global map if needed and also creates an unique - //opaque type in global map through a singleton_constructor_t function call, - //initializing the passed pointer to that unique instance. - // - //We have two concurrency types here. a)the global map/singleton creation must - //be safe between threads of this process but in different modules/dlls. b) - //the pointer to the singleton is per-module, so we have to protect this - //initization between threads of the same module. - // - //All static variables declared here are shared between inside a module - //so atomic operations will synchronize only threads of the same module. - static void initialize_singleton_logic - (void *&ptr, volatile boost::uint32_t &this_module_singleton_initialized, singleton_constructor_t constructor, bool phoenix) - { - //If current module is not initialized enter to lock free logic - if(atomic_read32(&this_module_singleton_initialized) != Initialized){ - //Now a single thread of the module will succeed in this CAS. - //trying to pass from Uninitialized to Initializing - ::boost::uint32_t previous_module_singleton_initialized = atomic_cas32 - (&this_module_singleton_initialized, Initializing, Uninitialized); - //If the thread succeeded the CAS (winner) it will compete with other - //winner threads from other modules to create the global map - if(previous_module_singleton_initialized == Destroyed){ - //Trying to resurrect a dead Phoenix singleton. Just try to - //mark it as uninitialized and start again - if(phoenix){ - atomic_cas32(&this_module_singleton_initialized, Uninitialized, Destroyed); - previous_module_singleton_initialized = atomic_cas32 - (&this_module_singleton_initialized, Initializing, Uninitialized); - } - //Trying to resurrect a non-Phoenix dead singleton is an error - else{ - throw interprocess_exception("Boost.Interprocess: Dead reference on non-Phoenix singleton of type"); - } - } - if(previous_module_singleton_initialized == Uninitialized){ - try{ - //Now initialize the global map, this function must solve concurrency - //issues between threads of several modules - initialize_global_map_handle(); - //Now try to create the singleton in global map. - //This function solves concurrency issues - //between threads of several modules - ThreadSafeGlobalMap *const pmap = get_map_ptr(); - void *tmp = constructor(*pmap); - //Increment the module reference count that reflects how many - //singletons this module holds, so that we can safely destroy - //module global map object when no singleton is left - atomic_inc32(&this_module_singleton_count); - //Insert a barrier before assigning the pointer to - //make sure this assignment comes after the initialization - atomic_write32(&this_module_singleton_initialized, Initializing); - //Assign the singleton address to the module-local pointer - ptr = tmp; - //Memory barrier inserted, all previous operations should complete - //before this one. Now marked as initialized - atomic_write32(&this_module_singleton_initialized, Initialized); - } - catch(...){ - //Mark singleton failed to initialize - atomic_write32(&this_module_singleton_initialized, Broken); - throw; - } - } - //If previous state was initializing, this means that another winner thread is - //trying to initialize the singleton. Just wait until completes its work. - else if(previous_module_singleton_initialized == Initializing){ - spin_wait swait; - while(1){ - previous_module_singleton_initialized = atomic_read32(&this_module_singleton_initialized); - if(previous_module_singleton_initialized >= Initialized){ - //Already initialized, or exception thrown by initializer thread - break; - } - else if(previous_module_singleton_initialized == Initializing){ - swait.yield(); - } - else{ - //This can't be happening! - BOOST_ASSERT(0); - } - } - } - else if(previous_module_singleton_initialized == Initialized){ - //Nothing to do here, the singleton is ready - } - //If previous state was greater than initialized, then memory is broken - //trying to initialize the singleton. - else{//(previous_module_singleton_initialized > Initialized) - throw interprocess_exception("boost::interprocess::intermodule_singleton initialization failed"); - } - } - BOOST_ASSERT(ptr != 0); - } - - static void finalize_singleton_logic(void *&ptr, volatile boost::uint32_t &this_module_singleton_initialized, singleton_destructor_t destructor) - { - //Protect destruction against lazy singletons not initialized in this execution - if(ptr){ - //Note: this destructor might provoke a Phoenix singleton - //resurrection. This means that this_module_singleton_count - //might change after this call. - ThreadSafeGlobalMap * const pmap = get_map_ptr(); - destructor(ptr, *pmap); - ptr = 0; - - //Memory barrier to make sure pointer is nulled. - //Mark this singleton as destroyed. - atomic_write32(&this_module_singleton_initialized, Destroyed); - - //If this is the last singleton of this module - //apply map destruction. - //Note: singletons are destroyed when the module is unloaded - //so no threads should be executing or holding references - //to this module - if(1 == atomic_dec32(&this_module_singleton_count)){ - destroy_global_map_handle(); - } - } - } - - private: - static ThreadSafeGlobalMap *get_map_ptr() - { - return static_cast<ThreadSafeGlobalMap *>(static_cast<void*>(mem_holder.map_mem)); - } - - static void initialize_global_map_handle() - { - //Obtain unique map name and size - spin_wait swait; - while(1){ - //Try to pass map state to initializing - ::boost::uint32_t tmp = atomic_cas32(&this_module_map_initialized, Initializing, Uninitialized); - if(tmp == Initialized || tmp == Broken){ - break; - } - else if(tmp == Destroyed){ - tmp = atomic_cas32(&this_module_map_initialized, Uninitialized, Destroyed); - continue; - } - //If some other thread is doing the work wait - else if(tmp == Initializing){ - swait.yield(); - } - else{ //(tmp == Uninitialized) - //If not initialized try it again? - try{ - //Remove old global map from the system - intermodule_singleton_helpers::thread_safe_global_map_dependant<ThreadSafeGlobalMap>::remove_old_gmem(); - //in-place construction of the global map class - ThreadSafeGlobalMap * const pmap = get_map_ptr(); - intermodule_singleton_helpers::thread_safe_global_map_dependant - <ThreadSafeGlobalMap>::construct_map(static_cast<void*>(pmap)); - //Use global map's internal lock to initialize the lock file - //that will mark this gmem as "in use". - typename intermodule_singleton_helpers::thread_safe_global_map_dependant<ThreadSafeGlobalMap>:: - lock_file_logic f(*pmap); - //If function failed (maybe a competing process has erased the shared - //memory between creation and file locking), retry with a new instance. - if(f.retry()){ - pmap->~ThreadSafeGlobalMap(); - atomic_write32(&this_module_map_initialized, Destroyed); - } - else{ - //Locking succeeded, so this global map module-instance is ready - atomic_write32(&this_module_map_initialized, Initialized); - break; - } - } - catch(...){ - // - throw; - } - } - } - } - - static void destroy_global_map_handle() - { - if(!atomic_read32(&this_module_singleton_count)){ - //This module is being unloaded, so destroy - //the global map object of this module - //and unlink the global map if it's the last - ThreadSafeGlobalMap * const pmap = get_map_ptr(); - typename intermodule_singleton_helpers::thread_safe_global_map_dependant<ThreadSafeGlobalMap>:: - unlink_map_logic f(*pmap); - pmap->~ThreadSafeGlobalMap(); - atomic_write32(&this_module_map_initialized, Destroyed); - //Do some cleanup for other processes old gmem instances - intermodule_singleton_helpers::thread_safe_global_map_dependant<ThreadSafeGlobalMap>::remove_old_gmem(); - } - } - - //Static data, zero-initalized without any dependencies - //this_module_singleton_count is the number of singletons used by this module - static volatile boost::uint32_t this_module_singleton_count; - - //this_module_map_initialized is the state of this module's map class object. - //Values: Uninitialized, Initializing, Initialized, Broken - static volatile boost::uint32_t this_module_map_initialized; - - //Raw memory to construct the global map manager - static union mem_holder_t - { - unsigned char map_mem [sizeof(ThreadSafeGlobalMap)]; - ::boost::detail::max_align aligner; - } mem_holder; -}; - -template<class ThreadSafeGlobalMap> -volatile boost::uint32_t intermodule_singleton_common<ThreadSafeGlobalMap>::this_module_singleton_count; - -template<class ThreadSafeGlobalMap> -volatile boost::uint32_t intermodule_singleton_common<ThreadSafeGlobalMap>::this_module_map_initialized; - -template<class ThreadSafeGlobalMap> -typename intermodule_singleton_common<ThreadSafeGlobalMap>::mem_holder_t - intermodule_singleton_common<ThreadSafeGlobalMap>::mem_holder; - -//A reference count to be stored in global map holding the number -//of singletons (one per module) attached to the instance pointed by -//the internal ptr. -struct ref_count_ptr -{ - ref_count_ptr(void *p, boost::uint32_t count) - : ptr(p), singleton_ref_count(count) - {} - void *ptr; - //This reference count serves to count the number of attached - //modules to this singleton - volatile boost::uint32_t singleton_ref_count; -}; - - -//Now this class is a singleton, initializing the singleton in -//the first get() function call if LazyInit is true. If false -//then the singleton will be initialized when loading the module. -template<typename C, bool LazyInit, bool Phoenix, class ThreadSafeGlobalMap> -class intermodule_singleton_impl -{ - public: - - static C& get() //Let's make inlining easy - { - if(!this_module_singleton_ptr){ - if(lifetime.dummy_function()){ //This forces lifetime instantiation, for reference counted destruction - atentry_work(); - } - } - return *static_cast<C*>(this_module_singleton_ptr); - } - - private: - - static void atentry_work() - { - intermodule_singleton_common<ThreadSafeGlobalMap>::initialize_singleton_logic - (this_module_singleton_ptr, this_module_singleton_initialized, singleton_constructor, Phoenix); - } - - static void atexit_work() - { - intermodule_singleton_common<ThreadSafeGlobalMap>::finalize_singleton_logic - (this_module_singleton_ptr, this_module_singleton_initialized, singleton_destructor); - } - - //These statics will be zero-initialized without any constructor call dependency - //this_module_singleton_ptr will be a module-local pointer to the singleton - static void* this_module_singleton_ptr; - - //this_module_singleton_count will be used to synchronize threads of the same module - //for access to a singleton instance, and to flag the state of the - //singleton. - static volatile boost::uint32_t this_module_singleton_initialized; - - //This class destructor will trigger singleton destruction - struct lifetime_type_lazy - { - bool dummy_function() - { return m_dummy == 0; } - - ~lifetime_type_lazy() - { - //if(!Phoenix){ - //atexit_work(); - //} - } - - //Dummy volatile so that the compiler can't resolve its value at compile-time - //and can't avoid lifetime_type instantiation if dummy_function() is called. - static volatile int m_dummy; - }; - - struct lifetime_type_static - : public lifetime_type_lazy - { - lifetime_type_static() - { atentry_work(); } - }; - - typedef typename if_c - <LazyInit, lifetime_type_lazy, lifetime_type_static>::type lifetime_type; - - static lifetime_type lifetime; - - //A functor to be executed inside global map lock that just - //searches for the singleton in map and if not present creates a new one. - //If singleton constructor throws, the exception is propagated - struct init_atomic_func - { - init_atomic_func(ThreadSafeGlobalMap &m) - : m_map(m), ret_ptr() - {} - - void operator()() - { - ref_count_ptr *rcount = intermodule_singleton_helpers::thread_safe_global_map_dependant - <ThreadSafeGlobalMap>::find(m_map, typeid(C).name()); - if(!rcount){ - C *p = new C; - try{ - ref_count_ptr val(p, 0u); - rcount = intermodule_singleton_helpers::thread_safe_global_map_dependant - <ThreadSafeGlobalMap>::insert(m_map, typeid(C).name(), val); - } - catch(...){ - intermodule_singleton_helpers::thread_safe_global_map_dependant - <ThreadSafeGlobalMap>::erase(m_map, typeid(C).name()); - delete p; - throw; - } - } - //if(Phoenix){ - std::atexit(&atexit_work); - //} - atomic_inc32(&rcount->singleton_ref_count); - ret_ptr = rcount->ptr; - } - void *data() const - { return ret_ptr; } - - private: - ThreadSafeGlobalMap &m_map; - void *ret_ptr; - }; - - //A functor to be executed inside global map lock that just - //deletes the singleton in map if the attached count reaches to zero - struct fini_atomic_func - { - fini_atomic_func(ThreadSafeGlobalMap &m) - : m_map(m) - {} - - void operator()() - { - ref_count_ptr *rcount = intermodule_singleton_helpers::thread_safe_global_map_dependant - <ThreadSafeGlobalMap>::find(m_map, typeid(C).name()); - //The object must exist - BOOST_ASSERT(rcount); - BOOST_ASSERT(rcount->singleton_ref_count > 0); - //Check if last reference - if(atomic_dec32(&rcount->singleton_ref_count) == 1){ - //If last, destroy the object - BOOST_ASSERT(rcount->ptr != 0); - C *pc = static_cast<C*>(rcount->ptr); - //Now destroy map entry - bool destroyed = intermodule_singleton_helpers::thread_safe_global_map_dependant - <ThreadSafeGlobalMap>::erase(m_map, typeid(C).name()); - (void)destroyed; BOOST_ASSERT(destroyed == true); - delete pc; - } - } - - private: - ThreadSafeGlobalMap &m_map; - }; - - //A wrapper to execute init_atomic_func - static void *singleton_constructor(ThreadSafeGlobalMap &map) - { - init_atomic_func f(map); - intermodule_singleton_helpers::thread_safe_global_map_dependant - <ThreadSafeGlobalMap>::atomic_func(map, f); - return f.data(); - } - - //A wrapper to execute fini_atomic_func - static void singleton_destructor(void *p, ThreadSafeGlobalMap &map) - { (void)p; - fini_atomic_func f(map); - intermodule_singleton_helpers::thread_safe_global_map_dependant - <ThreadSafeGlobalMap>::atomic_func(map, f); - } -}; - -template <typename C, bool L, bool P, class ThreadSafeGlobalMap> -volatile int intermodule_singleton_impl<C, L, P, ThreadSafeGlobalMap>::lifetime_type_lazy::m_dummy = 0; - -//These will be zero-initialized by the loader -template <typename C, bool L, bool P, class ThreadSafeGlobalMap> -void *intermodule_singleton_impl<C, L, P, ThreadSafeGlobalMap>::this_module_singleton_ptr = 0; - -template <typename C, bool L, bool P, class ThreadSafeGlobalMap> -volatile boost::uint32_t intermodule_singleton_impl<C, L, P, ThreadSafeGlobalMap>::this_module_singleton_initialized = 0; - -template <typename C, bool L, bool P, class ThreadSafeGlobalMap> -typename intermodule_singleton_impl<C, L, P, ThreadSafeGlobalMap>::lifetime_type - intermodule_singleton_impl<C, L, P, ThreadSafeGlobalMap>::lifetime; - -} //namespace ipcdetail{ -} //namespace interprocess{ -} //namespace boost{ - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //#ifndef BOOST_INTERPROCESS_INTERMODULE_SINGLETON_COMMON_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/detail/interprocess_tester.hpp b/src/third_party/boost-1.56.0/boost/interprocess/detail/interprocess_tester.hpp deleted file mode 100644 index 2fcc07bcc17..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/detail/interprocess_tester.hpp +++ /dev/null @@ -1,31 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2007-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_DETAIL_INTERPROCESS_TESTER_HPP -#define BOOST_INTERPROCESS_DETAIL_INTERPROCESS_TESTER_HPP - -namespace boost{ -namespace interprocess{ -namespace ipcdetail{ - -class interprocess_tester -{ - public: - template<class T> - static void dont_close_on_destruction(T &t) - { t.dont_close_on_destruction(); } -}; - -} //namespace ipcdetail{ -} //namespace interprocess{ -} //namespace boost{ - -#endif //#ifndef BOOST_INTERPROCESS_DETAIL_INTERPROCESS_TESTER_HPP - diff --git a/src/third_party/boost-1.56.0/boost/interprocess/detail/managed_memory_impl.hpp b/src/third_party/boost-1.56.0/boost/interprocess/detail/managed_memory_impl.hpp deleted file mode 100644 index 919e5353b86..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/detail/managed_memory_impl.hpp +++ /dev/null @@ -1,776 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_DETAIL_MANAGED_MEMORY_IMPL_HPP -#define BOOST_INTERPROCESS_DETAIL_MANAGED_MEMORY_IMPL_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> - -#include <boost/interprocess/interprocess_fwd.hpp> -#include <boost/interprocess/detail/utilities.hpp> -#include <boost/interprocess/detail/os_file_functions.hpp> -#include <boost/interprocess/creation_tags.hpp> -#include <boost/interprocess/exceptions.hpp> -#include <boost/interprocess/segment_manager.hpp> -#include <boost/interprocess/sync/scoped_lock.hpp> -// -#include <boost/detail/no_exceptions_support.hpp> -// -#include <utility> -#include <fstream> -#include <new> -#include <boost/assert.hpp> - -//!\file -//!Describes a named shared memory allocation user class. -//! - -namespace boost { -namespace interprocess { -namespace ipcdetail { - -template<class BasicManagedMemoryImpl> -class create_open_func; - -template< - class CharType, - class MemoryAlgorithm, - template<class IndexConfig> class IndexType - > -struct segment_manager_type -{ - typedef segment_manager<CharType, MemoryAlgorithm, IndexType> type; -}; - -//!This class is designed to be a base class to classes that manage -//!creation of objects in a fixed size memory buffer. Apart -//!from allocating raw memory, the user can construct named objects. To -//!achieve this, this class uses the reserved space provided by the allocation -//!algorithm to place a named_allocator_algo, who takes care of name mappings. -//!The class can be customized with the char type used for object names -//!and the memory allocation algorithm to be used.*/ -template < class CharType - , class MemoryAlgorithm - , template<class IndexConfig> class IndexType - , std::size_t Offset = 0 - > -class basic_managed_memory_impl -{ - //Non-copyable - basic_managed_memory_impl(const basic_managed_memory_impl &); - basic_managed_memory_impl &operator=(const basic_managed_memory_impl &); - - template<class BasicManagedMemoryImpl> - friend class create_open_func; - - public: - typedef typename segment_manager_type - <CharType, MemoryAlgorithm, IndexType>::type segment_manager; - typedef CharType char_type; - typedef MemoryAlgorithm memory_algorithm; - typedef typename MemoryAlgorithm::mutex_family mutex_family; - typedef CharType char_t; - typedef typename MemoryAlgorithm::size_type size_type; - typedef typename MemoryAlgorithm::difference_type difference_type; - typedef difference_type handle_t; - typedef typename segment_manager:: - const_named_iterator const_named_iterator; - typedef typename segment_manager:: - const_unique_iterator const_unique_iterator; - - /// @cond - - typedef typename - segment_manager::char_ptr_holder_t char_ptr_holder_t; - //Experimental. Don't use. - - typedef typename segment_manager::multiallocation_chain multiallocation_chain; - - /// @endcond - - static const size_type PayloadPerAllocation = segment_manager::PayloadPerAllocation; - - private: - typedef basic_managed_memory_impl - <CharType, MemoryAlgorithm, IndexType, Offset> self_t; - protected: - template<class ManagedMemory> - static bool grow(const char *filename, size_type extra_bytes) - { - typedef typename ManagedMemory::device_type device_type; - //Increase file size - try{ - offset_t old_size; - { - device_type f(open_or_create, filename, read_write); - if(!f.get_size(old_size)) - return false; - f.truncate(old_size + extra_bytes); - } - ManagedMemory managed_memory(open_only, filename); - //Grow always works - managed_memory.self_t::grow(extra_bytes); - } - catch(...){ - return false; - } - return true; - } - - template<class ManagedMemory> - static bool shrink_to_fit(const char *filename) - { - typedef typename ManagedMemory::device_type device_type; - size_type new_size; - try{ - ManagedMemory managed_memory(open_only, filename); - managed_memory.get_size(); - managed_memory.self_t::shrink_to_fit(); - new_size = managed_memory.get_size(); - } - catch(...){ - return false; - } - - //Decrease file size - { - device_type f(open_or_create, filename, read_write); - f.truncate(new_size); - } - return true; - } - - //!Constructor. Allocates basic resources. Never throws. - basic_managed_memory_impl() - : mp_header(0){} - - //!Destructor. Calls close. Never throws. - ~basic_managed_memory_impl() - { this->close_impl(); } - - //!Places segment manager in the reserved space. This can throw. - bool create_impl (void *addr, size_type size) - { - if(mp_header) return false; - - //Check if there is enough space - if(size < segment_manager::get_min_size()) - return false; - - //This function should not throw. The index construction can - //throw if constructor allocates memory. So we must catch it. - BOOST_TRY{ - //Let's construct the allocator in memory - mp_header = new(addr) segment_manager(size); - } - BOOST_CATCH(...){ - return false; - } - BOOST_CATCH_END - return true; - } - - //!Connects to a segment manager in the reserved buffer. Never throws. - bool open_impl (void *addr, size_type) - { - if(mp_header) return false; - mp_header = static_cast<segment_manager*>(addr); - return true; - } - - //!Frees resources. Never throws. - bool close_impl() - { - bool ret = mp_header != 0; - mp_header = 0; - return ret; - } - - //!Frees resources and destroys common resources. Never throws. - bool destroy_impl() - { - if(mp_header == 0) - return false; - mp_header->~segment_manager(); - this->close_impl(); - return true; - } - - //! - void grow(size_type extra_bytes) - { mp_header->grow(extra_bytes); } - - void shrink_to_fit() - { mp_header->shrink_to_fit(); } - - public: - - //!Returns segment manager. Never throws. - segment_manager *get_segment_manager() const - { return mp_header; } - - //!Returns the base address of the memory in this process. Never throws. - void * get_address () const - { return reinterpret_cast<char*>(mp_header) - Offset; } - - //!Returns the size of memory segment. Never throws. - size_type get_size () const - { return mp_header->get_size() + Offset; } - - //!Returns the number of free bytes of the memory - //!segment - size_type get_free_memory() const - { return mp_header->get_free_memory(); } - - //!Returns the result of "all_memory_deallocated()" function - //!of the used memory algorithm - bool all_memory_deallocated() - { return mp_header->all_memory_deallocated(); } - - //!Returns the result of "check_sanity()" function - //!of the used memory algorithm - bool check_sanity() - { return mp_header->check_sanity(); } - - //!Writes to zero free memory (memory not yet allocated) of - //!the memory algorithm - void zero_free_memory() - { mp_header->zero_free_memory(); } - - //!Transforms an absolute address into an offset from base address. - //!The address must belong to the memory segment. Never throws. - handle_t get_handle_from_address (const void *ptr) const - { - return (handle_t)(reinterpret_cast<const char*>(ptr) - - reinterpret_cast<const char*>(this->get_address())); - } - - //!Returns true if the address belongs to the managed memory segment - bool belongs_to_segment (const void *ptr) const - { - return ptr >= this->get_address() && - ptr < (reinterpret_cast<const char*>(this->get_address()) + this->get_size()); - } - - //!Transforms previously obtained offset into an absolute address in the - //!process space of the current process. Never throws.*/ - void * get_address_from_handle (handle_t offset) const - { return reinterpret_cast<char*>(this->get_address()) + offset; } - - //!Searches for nbytes of free memory in the segment, marks the - //!memory as used and return the pointer to the memory. If no - //!memory is available throws a boost::interprocess::bad_alloc exception - void* allocate (size_type nbytes) - { return mp_header->allocate(nbytes); } - - //!Searches for nbytes of free memory in the segment, marks the - //!memory as used and return the pointer to the memory. If no memory - //!is available returns 0. Never throws. - void* allocate (size_type nbytes, std::nothrow_t nothrow) - { return mp_header->allocate(nbytes, nothrow); } - - //!Allocates nbytes bytes aligned to "alignment" bytes. "alignment" - //!must be power of two. If no memory - //!is available returns 0. Never throws. - void * allocate_aligned (size_type nbytes, size_type alignment, std::nothrow_t nothrow) - { return mp_header->allocate_aligned(nbytes, alignment, nothrow); } - - template<class T> - std::pair<T *, bool> - allocation_command (boost::interprocess::allocation_type command, size_type limit_size, - size_type preferred_size,size_type &received_size, - T *reuse_ptr = 0) - { - return mp_header->allocation_command - (command, limit_size, preferred_size, received_size, reuse_ptr); - } - - //!Allocates nbytes bytes aligned to "alignment" bytes. "alignment" - //!must be power of two. If no - //!memory is available throws a boost::interprocess::bad_alloc exception - void * allocate_aligned(size_type nbytes, size_type alignment) - { return mp_header->allocate_aligned(nbytes, alignment); } - - /// @cond - - //Experimental. Don't use. - - //!Allocates n_elements of elem_bytes bytes. - //!Throws bad_alloc on failure. chain.size() is not increased on failure. - void allocate_many(size_type elem_bytes, size_type n_elements, multiallocation_chain &chain) - { mp_header->allocate_many(elem_bytes, n_elements, chain); } - - //!Allocates n_elements, each one of element_lengths[i]*sizeof_element bytes. - //!Throws bad_alloc on failure. chain.size() is not increased on failure. - void allocate_many(const size_type *element_lengths, size_type n_elements, size_type sizeof_element, multiallocation_chain &chain) - { mp_header->allocate_many(element_lengths, n_elements, sizeof_element, chain); } - - //!Allocates n_elements of elem_bytes bytes. - //!Non-throwing version. chain.size() is not increased on failure. - void allocate_many(std::nothrow_t, size_type elem_bytes, size_type n_elements, multiallocation_chain &chain) - { mp_header->allocate_many(std::nothrow_t(), elem_bytes, n_elements, chain); } - - //!Allocates n_elements, each one of - //!element_lengths[i]*sizeof_element bytes. - //!Non-throwing version. chain.size() is not increased on failure. - void allocate_many(std::nothrow_t, const size_type *elem_sizes, size_type n_elements, size_type sizeof_element, multiallocation_chain &chain) - { mp_header->allocate_many(std::nothrow_t(), elem_sizes, n_elements, sizeof_element, chain); } - - //!Deallocates all elements contained in chain. - //!Never throws. - void deallocate_many(multiallocation_chain &chain) - { mp_header->deallocate_many(chain); } - - /// @endcond - - //!Marks previously allocated memory as free. Never throws. - void deallocate (void *addr) - { if (mp_header) mp_header->deallocate(addr); } - - //!Tries to find a previous named allocation address. Returns a memory - //!buffer and the object count. If not found returned pointer is 0. - //!Never throws. - template <class T> - std::pair<T*, size_type> find (char_ptr_holder_t name) - { return mp_header->template find<T>(name); } - - //!Creates a named object or array in memory - //! - //!Allocates and constructs a T object or an array of T in memory, - //!associates this with the given name and returns a pointer to the - //!created object. If an array is being constructed all objects are - //!created using the same parameters given to this function. - //! - //!-> If the name was previously used, returns 0. - //! - //!-> Throws boost::interprocess::bad_alloc if there is no available memory - //! - //!-> If T's constructor throws, the function throws that exception. - //! - //!Memory is freed automatically if T's constructor throws and if an - //!array was being constructed, destructors of created objects are called - //!before freeing the memory. - template <class T> - typename segment_manager::template construct_proxy<T>::type - construct(char_ptr_holder_t name) - { return mp_header->template construct<T>(name); } - - //!Finds or creates a named object or array in memory - //! - //!Tries to find an object with the given name in memory. If - //!found, returns the pointer to this pointer. If the object is not found, - //!allocates and constructs a T object or an array of T in memory, - //!associates this with the given name and returns a pointer to the - //!created object. If an array is being constructed all objects are - //!created using the same parameters given to this function. - //! - //!-> Throws boost::interprocess::bad_alloc if there is no available memory - //! - //!-> If T's constructor throws, the function throws that exception. - //! - //!Memory is freed automatically if T's constructor throws and if an - //!array was being constructed, destructors of created objects are called - //!before freeing the memory. - template <class T> - typename segment_manager::template construct_proxy<T>::type - find_or_construct(char_ptr_holder_t name) - { return mp_header->template find_or_construct<T>(name); } - - //!Creates a named object or array in memory - //! - //!Allocates and constructs a T object or an array of T in memory, - //!associates this with the given name and returns a pointer to the - //!created object. If an array is being constructed all objects are - //!created using the same parameters given to this function. - //! - //!-> If the name was previously used, returns 0. - //! - //!-> Returns 0 if there is no available memory - //! - //!-> If T's constructor throws, the function throws that exception. - //! - //!Memory is freed automatically if T's constructor throws and if an - //!array was being constructed, destructors of created objects are called - //!before freeing the memory. - template <class T> - typename segment_manager::template construct_proxy<T>::type - construct(char_ptr_holder_t name, std::nothrow_t nothrow) - { return mp_header->template construct<T>(name, nothrow); } - - //!Finds or creates a named object or array in memory - //! - //!Tries to find an object with the given name in memory. If - //!found, returns the pointer to this pointer. If the object is not found, - //!allocates and constructs a T object or an array of T in memory, - //!associates this with the given name and returns a pointer to the - //!created object. If an array is being constructed all objects are - //!created using the same parameters given to this function. - //! - //!-> Returns 0 if there is no available memory - //! - //!-> If T's constructor throws, the function throws that exception. - //! - //!Memory is freed automatically if T's constructor throws and if an - //!array was being constructed, destructors of created objects are called - //!before freeing the memory. - template <class T> - typename segment_manager::template construct_proxy<T>::type - find_or_construct(char_ptr_holder_t name, std::nothrow_t nothrow) - { return mp_header->template find_or_construct<T>(name, nothrow); } - - //!Creates a named array from iterators in memory - //! - //!Allocates and constructs an array of T in memory, - //!associates this with the given name and returns a pointer to the - //!created object. Each element in the array is created using the - //!objects returned when dereferencing iterators as parameters - //!and incrementing all iterators for each element. - //! - //!-> If the name was previously used, returns 0. - //! - //!-> Throws boost::interprocess::bad_alloc if there is no available memory - //! - //!-> If T's constructor throws, the function throws that exception. - //! - //!Memory is freed automatically if T's constructor throws and - //!destructors of created objects are called before freeing the memory. - template <class T> - typename segment_manager::template construct_iter_proxy<T>::type - construct_it(char_ptr_holder_t name) - { return mp_header->template construct_it<T>(name); } - - //!Finds or creates a named array from iterators in memory - //! - //!Tries to find an object with the given name in memory. If - //!found, returns the pointer to this pointer. If the object is not found, - //!allocates and constructs an array of T in memory, - //!associates this with the given name and returns a pointer to the - //!created object. Each element in the array is created using the - //!objects returned when dereferencing iterators as parameters - //!and incrementing all iterators for each element. - //! - //!-> If the name was previously used, returns 0. - //! - //!-> Throws boost::interprocess::bad_alloc if there is no available memory - //! - //!-> If T's constructor throws, the function throws that exception. - //! - //!Memory is freed automatically if T's constructor throws and - //!destructors of created objects are called before freeing the memory. - template <class T> - typename segment_manager::template construct_iter_proxy<T>::type - find_or_construct_it(char_ptr_holder_t name) - { return mp_header->template find_or_construct_it<T>(name); } - - //!Creates a named array from iterators in memory - //! - //!Allocates and constructs an array of T in memory, - //!associates this with the given name and returns a pointer to the - //!created object. Each element in the array is created using the - //!objects returned when dereferencing iterators as parameters - //!and incrementing all iterators for each element. - //! - //!-> If the name was previously used, returns 0. - //! - //!-> If there is no available memory, returns 0. - //! - //!-> If T's constructor throws, the function throws that exception. - //! - //!Memory is freed automatically if T's constructor throws and - //!destructors of created objects are called before freeing the memory.*/ - template <class T> - typename segment_manager::template construct_iter_proxy<T>::type - construct_it(char_ptr_holder_t name, std::nothrow_t nothrow) - { return mp_header->template construct_it<T>(name, nothrow); } - - //!Finds or creates a named array from iterators in memory - //! - //!Tries to find an object with the given name in memory. If - //!found, returns the pointer to this pointer. If the object is not found, - //!allocates and constructs an array of T in memory, - //!associates this with the given name and returns a pointer to the - //!created object. Each element in the array is created using the - //!objects returned when dereferencing iterators as parameters - //!and incrementing all iterators for each element. - //! - //!-> If the name was previously used, returns 0. - //! - //!-> If there is no available memory, returns 0. - //! - //!-> If T's constructor throws, the function throws that exception. - //! - //!Memory is freed automatically if T's constructor throws and - //!destructors of created objects are called before freeing the memory.*/ - template <class T> - typename segment_manager::template construct_iter_proxy<T>::type - find_or_construct_it(char_ptr_holder_t name, std::nothrow_t nothrow) - { return mp_header->template find_or_construct_it<T>(name, nothrow); } - - //!Calls a functor and guarantees that no new construction, search or - //!destruction will be executed by any process while executing the object - //!function call. If the functor throws, this function throws. - template <class Func> - void atomic_func(Func &f) - { mp_header->atomic_func(f); } - - //!Tries to call a functor guaranteeing that no new construction, search or - //!destruction will be executed by any process while executing the object - //!function call. If the atomic function can't be immediatelly executed - //!because the internal mutex is already locked, returns false. - //!If the functor throws, this function throws. - template <class Func> - bool try_atomic_func(Func &f) - { return mp_header->try_atomic_func(f); } - - //!Destroys a named memory object or array. - //! - //!Finds the object with the given name, calls its destructors, - //!frees used memory and returns true. - //! - //!-> If the object is not found, it returns false. - //! - //!Exception Handling: - //! - //!When deleting a dynamically object or array, the Standard - //!does not guarantee that dynamically allocated memory, will be released. - //!Also, when deleting arrays, the Standard doesn't require calling - //!destructors for the rest of the objects if for one of them the destructor - //!terminated with an exception. - //! - //!Destroying an object: - //! - //!If the destructor throws, the memory will be freed and that exception - //!will be thrown. - //! - //!Destroying an array: - //! - //!When destroying an array, if a destructor throws, the rest of - //!destructors are called. If any of these throws, the exceptions are - //!ignored. The name association will be erased, memory will be freed and - //!the first exception will be thrown. This guarantees the unlocking of - //!mutexes and other resources. - //! - //!For all theses reasons, classes with throwing destructors are not - //!recommended. - template <class T> - bool destroy(const CharType *name) - { return mp_header->template destroy<T>(name); } - - //!Destroys the unique instance of type T - //! - //!Calls the destructor, frees used memory and returns true. - //! - //!Exception Handling: - //! - //!When deleting a dynamically object, the Standard does not - //!guarantee that dynamically allocated memory will be released. - //! - //!Destroying an object: - //! - //!If the destructor throws, the memory will be freed and that exception - //!will be thrown. - //! - //!For all theses reasons, classes with throwing destructors are not - //!recommended for memory. - template <class T> - bool destroy(const unique_instance_t *const ) - { return mp_header->template destroy<T>(unique_instance); } - - //!Destroys the object (named, unique, or anonymous) - //! - //!Calls the destructor, frees used memory and returns true. - //! - //!Exception Handling: - //! - //!When deleting a dynamically object, the Standard does not - //!guarantee that dynamically allocated memory will be released. - //! - //!Destroying an object: - //! - //!If the destructor throws, the memory will be freed and that exception - //!will be thrown. - //! - //!For all theses reasons, classes with throwing destructors are not - //!recommended for memory. - template <class T> - void destroy_ptr(const T *ptr) - { mp_header->template destroy_ptr<T>(ptr); } - - //!Returns the name of an object created with construct/find_or_construct - //!functions. If ptr points to an unique instance typeid(T).name() is returned. - template<class T> - static const char_type *get_instance_name(const T *ptr) - { return segment_manager::get_instance_name(ptr); } - - //!Returns is the type an object created with construct/find_or_construct - //!functions. Does not throw. - template<class T> - static instance_type get_instance_type(const T *ptr) - { return segment_manager::get_instance_type(ptr); } - - //!Returns the length of an object created with construct/find_or_construct - //!functions (1 if is a single element, >=1 if it's an array). Does not throw. - template<class T> - static size_type get_instance_length(const T *ptr) - { return segment_manager::get_instance_length(ptr); } - - //!Preallocates needed index resources to optimize the - //!creation of "num" named objects in the memory segment. - //!Can throw boost::interprocess::bad_alloc if there is no enough memory. - void reserve_named_objects(size_type num) - { mp_header->reserve_named_objects(num); } - - //!Preallocates needed index resources to optimize the - //!creation of "num" unique objects in the memory segment. - //!Can throw boost::interprocess::bad_alloc if there is no enough memory. - void reserve_unique_objects(size_type num) - { mp_header->reserve_unique_objects(num); } - - //!Calls shrink_to_fit in both named and unique object indexes - //to try to free unused memory from those indexes. - void shrink_to_fit_indexes() - { mp_header->shrink_to_fit_indexes(); } - - //!Returns the number of named objects stored - //!in the managed segment. - size_type get_num_named_objects() - { return mp_header->get_num_named_objects(); } - - //!Returns the number of unique objects stored - //!in the managed segment. - size_type get_num_unique_objects() - { return mp_header->get_num_unique_objects(); } - - //!Returns a constant iterator to the index storing the - //!named allocations. NOT thread-safe. Never throws. - const_named_iterator named_begin() const - { return mp_header->named_begin(); } - - //!Returns a constant iterator to the end of the index - //!storing the named allocations. NOT thread-safe. Never throws. - const_named_iterator named_end() const - { return mp_header->named_end(); } - - //!Returns a constant iterator to the index storing the - //!unique allocations. NOT thread-safe. Never throws. - const_unique_iterator unique_begin() const - { return mp_header->unique_begin(); } - - //!Returns a constant iterator to the end of the index - //!storing the unique allocations. NOT thread-safe. Never throws. - const_unique_iterator unique_end() const - { return mp_header->unique_end(); } - - //!This is the default allocator to allocate types T - //!from this managed segment - template<class T> - struct allocator - { - typedef typename segment_manager::template allocator<T>::type type; - }; - - //!Returns an instance of the default allocator for type T - //!initialized that allocates memory from this segment manager. - template<class T> - typename allocator<T>::type - get_allocator() - { return mp_header->template get_allocator<T>(); } - - //!This is the default deleter to delete types T - //!from this managed segment. - template<class T> - struct deleter - { - typedef typename segment_manager::template deleter<T>::type type; - }; - - //!Returns an instance of the default allocator for type T - //!initialized that allocates memory from this segment manager. - template<class T> - typename deleter<T>::type - get_deleter() - { return mp_header->template get_deleter<T>(); } - - /// @cond - //!Tries to find a previous named allocation address. Returns a memory - //!buffer and the object count. If not found returned pointer is 0. - //!Never throws. - template <class T> - std::pair<T*, size_type> find_no_lock (char_ptr_holder_t name) - { return mp_header->template find_no_lock<T>(name); } - /// @endcond - - protected: - //!Swaps the segment manager's managed by this managed memory segment. - //!NOT thread-safe. Never throws. - void swap(basic_managed_memory_impl &other) - { std::swap(mp_header, other.mp_header); } - - private: - segment_manager *mp_header; -}; - -template<class BasicManagedMemoryImpl> -class create_open_func -{ - typedef typename BasicManagedMemoryImpl::size_type size_type; - - public: - - create_open_func(BasicManagedMemoryImpl * const frontend, create_enum_t type) - : m_frontend(frontend), m_type(type){} - - bool operator()(void *addr, std::size_t size, bool created) const - { - if( ((m_type == DoOpen) && created) || - ((m_type == DoCreate) && !created) || - //Check for overflow - size_type(-1) < size ){ - return false; - } - else if(created){ - return m_frontend->create_impl(addr, static_cast<size_type>(size)); - } - else{ - return m_frontend->open_impl (addr, static_cast<size_type>(size)); - } - } - - std::size_t get_min_size() const - { - const size_type sz = m_frontend->get_segment_manager()->get_min_size(); - if(sz > std::size_t(-1)){ - //The minimum size is not representable by std::size_t - BOOST_ASSERT(false); - return std::size_t(-1); - } - else{ - return static_cast<std::size_t>(sz); - } - } - - private: - BasicManagedMemoryImpl *m_frontend; - create_enum_t m_type; -}; - -} //namespace ipcdetail { -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //BOOST_INTERPROCESS_DETAIL_MANAGED_MEMORY_IMPL_HPP - 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 diff --git a/src/third_party/boost-1.56.0/boost/interprocess/detail/math_functions.hpp b/src/third_party/boost-1.56.0/boost/interprocess/detail/math_functions.hpp deleted file mode 100644 index 20922b39cf6..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/detail/math_functions.hpp +++ /dev/null @@ -1,110 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Stephen Cleary 2000. -// (C) Copyright Ion Gaztanaga 2007-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. -// -// This file is a slightly modified file from Boost.Pool -// -////////////////////////////////////////////////////////////////////////////// - -#ifndef BOOST_INTERPROCESS_DETAIL_MATH_FUNCTIONS_HPP -#define BOOST_INTERPROCESS_DETAIL_MATH_FUNCTIONS_HPP - -#include <climits> -#include <boost/static_assert.hpp> - -namespace boost { -namespace interprocess { -namespace ipcdetail { - -// Greatest common divisor and least common multiple - -// -// gcd is an algorithm that calculates the greatest common divisor of two -// integers, using Euclid's algorithm. -// -// Pre: A > 0 && B > 0 -// Recommended: A > B -template <typename Integer> -inline Integer gcd(Integer A, Integer B) -{ - do - { - const Integer tmp(B); - B = A % B; - A = tmp; - } while (B != 0); - - return A; -} - -// -// lcm is an algorithm that calculates the least common multiple of two -// integers. -// -// Pre: A > 0 && B > 0 -// Recommended: A > B -template <typename Integer> -inline Integer lcm(const Integer & A, const Integer & B) -{ - Integer ret = A; - ret /= gcd(A, B); - ret *= B; - return ret; -} - -template <typename Integer> -inline Integer log2_ceil(const Integer & A) -{ - Integer i = 0; - Integer power_of_2 = 1; - - while(power_of_2 < A){ - power_of_2 <<= 1; - ++i; - } - return i; -} - -template <typename Integer> -inline Integer upper_power_of_2(const Integer & A) -{ - Integer power_of_2 = 1; - - while(power_of_2 < A){ - power_of_2 <<= 1; - } - return power_of_2; -} - -//This function uses binary search to discover the -//highest set bit of the integer -inline std::size_t floor_log2 (std::size_t x) -{ - const std::size_t Bits = sizeof(std::size_t)*CHAR_BIT; - const bool Size_t_Bits_Power_2= !(Bits & (Bits-1)); - BOOST_STATIC_ASSERT(((Size_t_Bits_Power_2)== true)); - - std::size_t n = x; - std::size_t log2 = 0; - - for(std::size_t shift = Bits >> 1; shift; shift >>= 1){ - std::size_t tmp = n >> shift; - if (tmp) - log2 += shift, n = tmp; - } - - return log2; -} - -} // namespace ipcdetail -} // namespace interprocess -} // namespace boost - -#endif diff --git a/src/third_party/boost-1.56.0/boost/interprocess/detail/min_max.hpp b/src/third_party/boost-1.56.0/boost/interprocess/detail/min_max.hpp deleted file mode 100644 index a5d01f404bc..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/detail/min_max.hpp +++ /dev/null @@ -1,40 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_DETAIL_MIN_MAX_HPP -#define BOOST_INTERPROCESS_DETAIL_MIN_MAX_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> - -namespace boost { -namespace interprocess { - -template<class T> -const T &max_value(const T &a, const T &b) -{ return a > b ? a : b; } - -template<class T> -const T &min_value(const T &a, const T &b) -{ return a < b ? a : b; } - -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //#ifndef BOOST_INTERPROCESS_DETAIL_MIN_MAX_HPP - diff --git a/src/third_party/boost-1.56.0/boost/interprocess/detail/mpl.hpp b/src/third_party/boost-1.56.0/boost/interprocess/detail/mpl.hpp deleted file mode 100644 index 29f38930388..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/detail/mpl.hpp +++ /dev/null @@ -1,152 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_DETAIL_MPL_HPP -#define BOOST_INTERPROCESS_DETAIL_MPL_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <cstddef> - -namespace boost { -namespace interprocess { -namespace ipcdetail { - -template <class T, T val> -struct integral_constant -{ - static const T value = val; - typedef integral_constant<T,val> type; -}; - -template< bool C_ > -struct bool_ : integral_constant<bool, C_> -{ - static const bool value = C_; -}; - -typedef bool_<true> true_; -typedef bool_<false> false_; - -typedef true_ true_type; -typedef false_ false_type; - -typedef char yes_type; -struct no_type -{ - char padding[8]; -}; - -template <bool B, class T = void> -struct enable_if_c { - typedef T type; -}; - -template <class T> -struct enable_if_c<false, T> {}; - -template <class Cond, class T = void> -struct enable_if : public enable_if_c<Cond::value, T> {}; - -template <class Cond, class T = void> -struct disable_if : public enable_if_c<!Cond::value, T> {}; - -template <class T, class U> -class is_convertible -{ - typedef char true_t; - class false_t { char dummy[2]; }; - static true_t dispatch(U); - static false_t dispatch(...); - static T trigger(); - public: - static const bool value = sizeof(dispatch(trigger())) == sizeof(true_t); -}; - -template< - bool C - , typename T1 - , typename T2 - > -struct if_c -{ - typedef T1 type; -}; - -template< - typename T1 - , typename T2 - > -struct if_c<false,T1,T2> -{ - typedef T2 type; -}; - -template< - typename T1 - , typename T2 - , typename T3 - > -struct if_ -{ - typedef typename if_c<0 != T1::value, T2, T3>::type type; -}; - - -template <class Pair> -struct select1st -// : public std::unary_function<Pair, typename Pair::first_type> -{ - template<class OtherPair> - const typename Pair::first_type& operator()(const OtherPair& x) const - { return x.first; } - - const typename Pair::first_type& operator()(const typename Pair::first_type& x) const - { return x; } -}; - -// identity is an extension: it is not part of the standard. -template <class T> -struct identity -// : public std::unary_function<T,T> -{ - typedef T type; - const T& operator()(const T& x) const - { return x; } -}; - -template<std::size_t S> -struct ls_zeros -{ - static const std::size_t value = (S & std::size_t(1)) ? 0 : (1u + ls_zeros<(S >> 1u)>::value); -}; - -template<> -struct ls_zeros<0> -{ - static const std::size_t value = 0; -}; - -template<> -struct ls_zeros<1> -{ - static const std::size_t value = 0; -}; - -} //namespace ipcdetail { -} //namespace interprocess { -} //namespace boost { - -#endif //#ifndef BOOST_INTERPROCESS_DETAIL_MPL_HPP - diff --git a/src/third_party/boost-1.56.0/boost/interprocess/detail/named_proxy.hpp b/src/third_party/boost-1.56.0/boost/interprocess/detail/named_proxy.hpp deleted file mode 100644 index 0c261889083..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/detail/named_proxy.hpp +++ /dev/null @@ -1,349 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_NAMED_PROXY_HPP -#define BOOST_INTERPROCESS_NAMED_PROXY_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> - -#include <new> -#include <iterator> -#include <boost/interprocess/detail/in_place_interface.hpp> -#include <boost/interprocess/detail/mpl.hpp> - -#ifndef BOOST_INTERPROCESS_PERFECT_FORWARDING -#include <boost/interprocess/detail/preprocessor.hpp> -#else -#include <boost/move/move.hpp> -#include <boost/interprocess/detail/variadic_templates_tools.hpp> -#endif //#ifdef BOOST_INTERPROCESS_PERFECT_FORWARDING - -//!\file -//!Describes a proxy class that implements named allocation syntax. - -namespace boost { -namespace interprocess { -namespace ipcdetail { - -#ifdef BOOST_INTERPROCESS_PERFECT_FORWARDING - -template<class T, bool is_iterator, class ...Args> -struct CtorNArg : public placement_destroy<T> -{ - typedef bool_<is_iterator> IsIterator; - typedef CtorNArg<T, is_iterator, Args...> self_t; - typedef typename build_number_seq<sizeof...(Args)>::type index_tuple_t; - - self_t& operator++() - { - this->do_increment(IsIterator(), index_tuple_t()); - return *this; - } - - self_t operator++(int) { return ++*this; *this; } - - CtorNArg(Args && ...args) - : args_(args...) - {} - - virtual void construct_n(void *mem - , std::size_t num - , std::size_t &constructed) - { - T* memory = static_cast<T*>(mem); - for(constructed = 0; constructed < num; ++constructed){ - this->construct(memory++, IsIterator(), index_tuple_t()); - this->do_increment(IsIterator(), index_tuple_t()); - } - } - - private: - template<int ...IdxPack> - void construct(void *mem, true_, const index_tuple<IdxPack...>&) - { new((void*)mem)T(*boost::forward<Args>(get<IdxPack>(args_))...); } - - template<int ...IdxPack> - void construct(void *mem, false_, const index_tuple<IdxPack...>&) - { new((void*)mem)T(boost::forward<Args>(get<IdxPack>(args_))...); } - - template<int ...IdxPack> - void do_increment(true_, const index_tuple<IdxPack...>&) - { - this->expansion_helper(++get<IdxPack>(args_)...); - } - - template<class ...ExpansionArgs> - void expansion_helper(ExpansionArgs &&...) - {} - - template<int ...IdxPack> - void do_increment(false_, const index_tuple<IdxPack...>&) - {} - - tuple<Args&...> args_; -}; - -//!Describes a proxy class that implements named -//!allocation syntax. -template - < class SegmentManager //segment manager to construct the object - , class T //type of object to build - , bool is_iterator //passing parameters are normal object or iterators? - > -class named_proxy -{ - typedef typename SegmentManager::char_type char_type; - const char_type * mp_name; - SegmentManager * mp_mngr; - mutable std::size_t m_num; - const bool m_find; - const bool m_dothrow; - - public: - named_proxy(SegmentManager *mngr, const char_type *name, bool find, bool dothrow) - : mp_name(name), mp_mngr(mngr), m_num(1) - , m_find(find), m_dothrow(dothrow) - {} - - template<class ...Args> - T *operator()(Args &&...args) const - { - CtorNArg<T, is_iterator, Args...> &&ctor_obj = CtorNArg<T, is_iterator, Args...> - (boost::forward<Args>(args)...); - return mp_mngr->template - generic_construct<T>(mp_name, m_num, m_find, m_dothrow, ctor_obj); - } - - //This operator allows --> named_new("Name")[3]; <-- syntax - const named_proxy &operator[](std::size_t num) const - { m_num *= num; return *this; } -}; - -#else //#ifdef BOOST_INTERPROCESS_PERFECT_FORWARDING - -//!Function object that makes placement new -//!without arguments -template<class T> -struct Ctor0Arg : public placement_destroy<T> -{ - typedef Ctor0Arg self_t; - - Ctor0Arg(){} - - self_t& operator++() { return *this; } - self_t operator++(int) { return *this; } - - void construct(void *mem) - { new((void*)mem)T; } - - virtual void construct_n(void *mem, std::size_t num, std::size_t &constructed) - { - T* memory = static_cast<T*>(mem); - for(constructed = 0; constructed < num; ++constructed) - new((void*)memory++)T; - } -}; - -//////////////////////////////////////////////////////////////// -// What the macro should generate (n == 2): -// -// template<class T, bool is_iterator, class P1, class P2> -// struct Ctor2Arg -// : public placement_destroy<T> -// { -// typedef bool_<is_iterator> IsIterator; -// typedef Ctor2Arg self_t; -// -// void do_increment(false_) -// { ++m_p1; ++m_p2; } -// -// void do_increment(true_){} -// -// self_t& operator++() -// { -// this->do_increment(IsIterator()); -// return *this; -// } -// -// self_t operator++(int) { return ++*this; *this; } -// -// Ctor2Arg(const P1 &p1, const P2 &p2) -// : p1((P1 &)p_1), p2((P2 &)p_2) {} -// -// void construct(void *mem) -// { new((void*)object)T(m_p1, m_p2); } -// -// virtual void construct_n(void *mem -// , std::size_t num -// , std::size_t &constructed) -// { -// T* memory = static_cast<T*>(mem); -// for(constructed = 0; constructed < num; ++constructed){ -// this->construct(memory++, IsIterator()); -// this->do_increment(IsIterator()); -// } -// } -// -// private: -// void construct(void *mem, true_) -// { new((void*)mem)T(*m_p1, *m_p2); } -// -// void construct(void *mem, false_) -// { new((void*)mem)T(m_p1, m_p2); } -// -// P1 &m_p1; P2 &m_p2; -// }; -//////////////////////////////////////////////////////////////// - -//Note: -//We define template parameters as const references to -//be able to bind temporaries. After that we will un-const them. -//This cast is ugly but it is necessary until "perfect forwarding" -//is achieved in C++0x. Meanwhile, if we want to be able to -//bind lvalues with non-const references, we have to be ugly -#define BOOST_PP_LOCAL_MACRO(n) \ - template<class T, bool is_iterator, BOOST_PP_ENUM_PARAMS(n, class P) > \ - struct BOOST_PP_CAT(BOOST_PP_CAT(Ctor, n), Arg) \ - : public placement_destroy<T> \ - { \ - typedef bool_<is_iterator> IsIterator; \ - typedef BOOST_PP_CAT(BOOST_PP_CAT(Ctor, n), Arg) self_t; \ - \ - void do_increment(true_) \ - { BOOST_PP_ENUM(n, BOOST_INTERPROCESS_PP_PARAM_INC, _); } \ - \ - void do_increment(false_){} \ - \ - self_t& operator++() \ - { \ - this->do_increment(IsIterator()); \ - return *this; \ - } \ - \ - self_t operator++(int) { return ++*this; *this; } \ - \ - BOOST_PP_CAT(BOOST_PP_CAT(Ctor, n), Arg) \ - ( BOOST_PP_ENUM(n, BOOST_INTERPROCESS_PP_PARAM_LIST, _) ) \ - : BOOST_PP_ENUM(n, BOOST_INTERPROCESS_PP_PARAM_INIT, _) {} \ - \ - virtual void construct_n(void *mem \ - , std::size_t num \ - , std::size_t &constructed) \ - { \ - T* memory = static_cast<T*>(mem); \ - for(constructed = 0; constructed < num; ++constructed){ \ - this->construct(memory++, IsIterator()); \ - this->do_increment(IsIterator()); \ - } \ - } \ - \ - private: \ - void construct(void *mem, true_) \ - { \ - new((void*)mem) T \ - (BOOST_PP_ENUM(n, BOOST_INTERPROCESS_PP_MEMBER_IT_FORWARD, _)); \ - } \ - \ - void construct(void *mem, false_) \ - { \ - new((void*)mem) T \ - (BOOST_PP_ENUM(n, BOOST_INTERPROCESS_PP_MEMBER_FORWARD, _)); \ - } \ - \ - BOOST_PP_REPEAT(n, BOOST_INTERPROCESS_PP_PARAM_DEFINE, _) \ - }; \ -//! -#define BOOST_PP_LOCAL_LIMITS (1, BOOST_INTERPROCESS_MAX_CONSTRUCTOR_PARAMETERS) -#include BOOST_PP_LOCAL_ITERATE() - -//!Describes a proxy class that implements named -//!allocation syntax. -template - < class SegmentManager //segment manager to construct the object - , class T //type of object to build - , bool is_iterator //passing parameters are normal object or iterators? - > -class named_proxy -{ - typedef typename SegmentManager::char_type char_type; - const char_type * mp_name; - SegmentManager * mp_mngr; - mutable std::size_t m_num; - const bool m_find; - const bool m_dothrow; - - public: - named_proxy(SegmentManager *mngr, const char_type *name, bool find, bool dothrow) - : mp_name(name), mp_mngr(mngr), m_num(1) - , m_find(find), m_dothrow(dothrow) - {} - - //!makes a named allocation and calls the - //!default constructor - T *operator()() const - { - Ctor0Arg<T> ctor_obj; - return mp_mngr->template - generic_construct<T>(mp_name, m_num, m_find, m_dothrow, ctor_obj); - } - //! - - #define BOOST_PP_LOCAL_MACRO(n) \ - template<BOOST_PP_ENUM_PARAMS(n, class P)> \ - T *operator()(BOOST_PP_ENUM (n, BOOST_INTERPROCESS_PP_PARAM_LIST, _)) const\ - { \ - typedef BOOST_PP_CAT(BOOST_PP_CAT(Ctor, n), Arg) \ - <T, is_iterator, BOOST_PP_ENUM_PARAMS(n, P)> \ - ctor_obj_t; \ - ctor_obj_t ctor_obj \ - (BOOST_PP_ENUM(n, BOOST_INTERPROCESS_PP_PARAM_FORWARD, _)); \ - return mp_mngr->template generic_construct<T> \ - (mp_name, m_num, m_find, m_dothrow, ctor_obj); \ - } \ - //! - - #define BOOST_PP_LOCAL_LIMITS ( 1, BOOST_INTERPROCESS_MAX_CONSTRUCTOR_PARAMETERS ) - #include BOOST_PP_LOCAL_ITERATE() - - //////////////////////////////////////////////////////////////////////// - // What the macro should generate (n == 2) - //////////////////////////////////////////////////////////////////////// - // - // template <class P1, class P2> - // T *operator()(P1 &p1, P2 &p2) const - // { - // typedef Ctor2Arg - // <T, is_iterator, P1, P2> - // ctor_obj_t; - // ctor_obj_t ctor_obj(p1, p2); - // - // return mp_mngr->template generic_construct<T> - // (mp_name, m_num, m_find, m_dothrow, ctor_obj); - // } - // - ////////////////////////////////////////////////////////////////////////// - - //This operator allows --> named_new("Name")[3]; <-- syntax - const named_proxy &operator[](std::size_t num) const - { m_num *= num; return *this; } -}; - -#endif //#ifdef BOOST_INTERPROCESS_PERFECT_FORWARDING - -}}} //namespace boost { namespace interprocess { namespace ipcdetail { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //#ifndef BOOST_INTERPROCESS_NAMED_PROXY_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/detail/os_file_functions.hpp b/src/third_party/boost-1.56.0/boost/interprocess/detail/os_file_functions.hpp deleted file mode 100644 index edd42adf5b7..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/detail/os_file_functions.hpp +++ /dev/null @@ -1,727 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_DETAIL_OS_FILE_FUNCTIONS_HPP -#define BOOST_INTERPROCESS_DETAIL_OS_FILE_FUNCTIONS_HPP - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> -#include <boost/interprocess/errors.hpp> -#include <boost/interprocess/permissions.hpp> - -#include <string> -#include <limits> -#include <climits> -#include <boost/type_traits/make_unsigned.hpp> - -#if defined (BOOST_INTERPROCESS_WINDOWS) -# include <boost/interprocess/detail/win32_api.hpp> -#else -# ifdef BOOST_HAS_UNISTD_H -# include <fcntl.h> -# include <unistd.h> -# include <sys/types.h> -# include <sys/stat.h> -# include <errno.h> -# include <cstdio> -# include <dirent.h> -# if 0 -# include <sys/file.h> -# endif -# else -# error Unknown platform -# endif -#endif - -#include <cstring> -#include <cstdlib> - -namespace boost { -namespace interprocess { - -#if defined (BOOST_INTERPROCESS_WINDOWS) - -typedef void * file_handle_t; -typedef long long offset_t; -typedef struct mapping_handle_impl_t{ - void * handle; - bool is_shm; -} mapping_handle_t; - -typedef enum { read_only = winapi::generic_read - , read_write = winapi::generic_read | winapi::generic_write - , copy_on_write - , read_private - , invalid_mode = 0xffff - } mode_t; - -typedef enum { file_begin = winapi::file_begin - , file_end = winapi::file_end - , file_current = winapi::file_current - } file_pos_t; - -typedef unsigned long map_options_t; -static const map_options_t default_map_options = map_options_t(-1); - -namespace ipcdetail{ - -inline mapping_handle_t mapping_handle_from_file_handle(file_handle_t hnd) -{ - mapping_handle_t ret; - ret.handle = hnd; - ret.is_shm = false; - return ret; -} - -inline mapping_handle_t mapping_handle_from_shm_handle(file_handle_t hnd) -{ - mapping_handle_t ret; - ret.handle = hnd; - ret.is_shm = true; - return ret; -} - -inline file_handle_t file_handle_from_mapping_handle(mapping_handle_t hnd) -{ return hnd.handle; } - -inline bool create_directory(const char *path) -{ return winapi::create_directory(path); } - -inline bool get_temporary_path(char *buffer, std::size_t buf_len, std::size_t &required_len) -{ - required_len = 0; - //std::size_t is always bigger or equal than unsigned long in Windows systems - //In case std::size_t is bigger than unsigned long - unsigned long buf = buf_len; - if(buf_len != buf){ //maybe overflowed - return false; - } - required_len = winapi::get_temp_path(buf_len, buffer); - const bool ret = !(buf_len < required_len); - if(ret && buffer[required_len-1] == '\\'){ - buffer[required_len-1] = 0; - } - return ret; -} - -inline file_handle_t create_new_file - (const char *name, mode_t mode, const permissions & perm = permissions(), bool temporary = false) -{ - unsigned long attr = temporary ? winapi::file_attribute_temporary : 0; - return winapi::create_file - ( name, (unsigned int)mode, winapi::create_new, attr - , (winapi::interprocess_security_attributes*)perm.get_permissions()); -} - -inline file_handle_t create_or_open_file - (const char *name, mode_t mode, const permissions & perm = permissions(), bool temporary = false) -{ - unsigned long attr = temporary ? winapi::file_attribute_temporary : 0; - return winapi::create_file - ( name, (unsigned int)mode, winapi::open_always, attr - , (winapi::interprocess_security_attributes*)perm.get_permissions()); -} - -inline file_handle_t open_existing_file - (const char *name, mode_t mode, bool temporary = false) -{ - unsigned long attr = temporary ? winapi::file_attribute_temporary : 0; - return winapi::create_file - (name, (unsigned int)mode, winapi::open_existing, attr, 0); -} - -inline bool delete_file(const char *name) -{ return winapi::unlink_file(name); } - -inline bool truncate_file (file_handle_t hnd, std::size_t size) -{ - offset_t filesize; - if(!winapi::get_file_size(hnd, filesize)) - return false; - - typedef boost::make_unsigned<offset_t>::type uoffset_t; - const uoffset_t max_filesize = uoffset_t((std::numeric_limits<offset_t>::max)()); - //Avoid unused variable warnings in 32 bit systems - if(uoffset_t(size) > max_filesize){ - winapi::set_last_error(winapi::error_file_too_large); - return false; - } - - if(offset_t(size) > filesize){ - if(!winapi::set_file_pointer_ex(hnd, filesize, 0, winapi::file_begin)){ - return false; - } - //We will write zeros in the end of the file - //since set_end_of_file does not guarantee this - for(std::size_t remaining = size - filesize, write_size = 0 - ;remaining > 0 - ;remaining -= write_size){ - const std::size_t DataSize = 512; - static char data [DataSize]; - write_size = DataSize < remaining ? DataSize : remaining; - unsigned long written; - winapi::write_file(hnd, data, (unsigned long)write_size, &written, 0); - if(written != write_size){ - return false; - } - } - } - else{ - if(!winapi::set_file_pointer_ex(hnd, size, 0, winapi::file_begin)){ - return false; - } - if(!winapi::set_end_of_file(hnd)){ - return false; - } - } - return true; -} - -inline bool get_file_size(file_handle_t hnd, offset_t &size) -{ return winapi::get_file_size(hnd, size); } - -inline bool set_file_pointer(file_handle_t hnd, offset_t off, file_pos_t pos) -{ return winapi::set_file_pointer_ex(hnd, off, 0, (unsigned long) pos); } - -inline bool get_file_pointer(file_handle_t hnd, offset_t &off) -{ return winapi::set_file_pointer_ex(hnd, 0, &off, winapi::file_current); } - -inline bool write_file(file_handle_t hnd, const void *data, std::size_t numdata) -{ - unsigned long written; - return 0 != winapi::write_file(hnd, data, (unsigned long)numdata, &written, 0); -} - -inline file_handle_t invalid_file() -{ return winapi::invalid_handle_value; } - -inline bool close_file(file_handle_t hnd) -{ return 0 != winapi::close_handle(hnd); } - -inline bool acquire_file_lock(file_handle_t hnd) -{ - static winapi::interprocess_overlapped overlapped; - const unsigned long len = ((unsigned long)-1); -// winapi::interprocess_overlapped overlapped; -// std::memset(&overlapped, 0, sizeof(overlapped)); - return winapi::lock_file_ex - (hnd, winapi::lockfile_exclusive_lock, 0, len, len, &overlapped); -} - -inline bool try_acquire_file_lock(file_handle_t hnd, bool &acquired) -{ - const unsigned long len = ((unsigned long)-1); - winapi::interprocess_overlapped overlapped; - std::memset(&overlapped, 0, sizeof(overlapped)); - if(!winapi::lock_file_ex - (hnd, winapi::lockfile_exclusive_lock | winapi::lockfile_fail_immediately, - 0, len, len, &overlapped)){ - return winapi::get_last_error() == winapi::error_lock_violation ? - acquired = false, true : false; - - } - return (acquired = true); -} - -inline bool release_file_lock(file_handle_t hnd) -{ - const unsigned long len = ((unsigned long)-1); - winapi::interprocess_overlapped overlapped; - std::memset(&overlapped, 0, sizeof(overlapped)); - return winapi::unlock_file_ex(hnd, 0, len, len, &overlapped); -} - -inline bool acquire_file_lock_sharable(file_handle_t hnd) -{ - const unsigned long len = ((unsigned long)-1); - winapi::interprocess_overlapped overlapped; - std::memset(&overlapped, 0, sizeof(overlapped)); - return winapi::lock_file_ex(hnd, 0, 0, len, len, &overlapped); -} - -inline bool try_acquire_file_lock_sharable(file_handle_t hnd, bool &acquired) -{ - const unsigned long len = ((unsigned long)-1); - winapi::interprocess_overlapped overlapped; - std::memset(&overlapped, 0, sizeof(overlapped)); - if(!winapi::lock_file_ex - (hnd, winapi::lockfile_fail_immediately, 0, len, len, &overlapped)){ - return winapi::get_last_error() == winapi::error_lock_violation ? - acquired = false, true : false; - } - return (acquired = true); -} - -inline bool release_file_lock_sharable(file_handle_t hnd) -{ return release_file_lock(hnd); } - -inline bool delete_subdirectories_recursive - (const std::string &refcstrRootDirectory, const char *dont_delete_this, unsigned int count) -{ - bool bSubdirectory = false; // Flag, indicating whether - // subdirectories have been found - void * hFile; // Handle to directory - std::string strFilePath; // Filepath - std::string strPattern; // Pattern - winapi::win32_find_data FileInformation; // File information - - //Find all files and directories - strPattern = refcstrRootDirectory + "\\*.*"; - hFile = winapi::find_first_file(strPattern.c_str(), &FileInformation); - if(hFile != winapi::invalid_handle_value){ - do{ - //If it's not "." or ".." or the pointed root_level dont_delete_this erase it - if(FileInformation.cFileName[0] != '.' && - !(dont_delete_this && count == 0 && std::strcmp(dont_delete_this, FileInformation.cFileName) == 0)){ - strFilePath.erase(); - strFilePath = refcstrRootDirectory + "\\" + FileInformation.cFileName; - - //If it's a directory, go recursive - if(FileInformation.dwFileAttributes & winapi::file_attribute_directory){ - // Delete subdirectory - if(!delete_subdirectories_recursive(strFilePath, dont_delete_this, count+1)){ - winapi::find_close(hFile); - return false; - } - } - //If it's a file, just delete it - else{ - // Set file attributes - //if(::SetFileAttributes(strFilePath.c_str(), winapi::file_attribute_normal) == 0) - //return winapi::get_last_error(); - // Delete file - winapi::unlink_file(strFilePath.c_str()); - } - } - //Go to the next file - } while(winapi::find_next_file(hFile, &FileInformation) == 1); - - // Close handle - winapi::find_close(hFile); - - //See if the loop has ended with an error or just because we've traversed all the files - if(winapi::get_last_error() != winapi::error_no_more_files){ - return false; - } - else - { - //Erase empty subdirectories or original refcstrRootDirectory - if(!bSubdirectory && count) - { - // Set directory attributes - //if(::SetFileAttributes(refcstrRootDirectory.c_str(), FILE_ATTRIBUTE_NORMAL) == 0) - //return ::GetLastError(); - // Delete directory - if(winapi::remove_directory(refcstrRootDirectory.c_str()) == 0) - return false; - } - } - } - return true; -} - -//This function erases all the subdirectories of a directory except the one pointed by "dont_delete_this" -inline bool delete_subdirectories(const std::string &refcstrRootDirectory, const char *dont_delete_this) -{ - return delete_subdirectories_recursive(refcstrRootDirectory, dont_delete_this, 0u); -} - - -template<class Function> -inline bool for_each_file_in_dir(const char *dir, Function f) -{ - void * hFile; // Handle to directory - winapi::win32_find_data FileInformation; // File information - - //Get base directory - std::string str(dir); - const std::size_t base_root_dir_len = str.size(); - - //Find all files and directories - str += "\\*.*"; - hFile = winapi::find_first_file(str.c_str(), &FileInformation); - if(hFile != winapi::invalid_handle_value){ - do{ //Now loop every file - str.erase(base_root_dir_len); - //If it's not "." or ".." skip it - if(FileInformation.cFileName[0] != '.'){ - str += "\\"; str += FileInformation.cFileName; - //If it's a file, apply erase logic - if(!(FileInformation.dwFileAttributes & winapi::file_attribute_directory)){ - f(str.c_str(), FileInformation.cFileName); - } - } - //Go to the next file - } while(winapi::find_next_file(hFile, &FileInformation) == 1); - - // Close handle and see if the loop has ended with an error - winapi::find_close(hFile); - if(winapi::get_last_error() != winapi::error_no_more_files){ - return false; - } - } - return true; -} - - -#else //#if defined (BOOST_INTERPROCESS_WINDOWS) - -typedef int file_handle_t; -typedef off_t offset_t; - -typedef struct mapping_handle_impl_t -{ - file_handle_t handle; - bool is_xsi; -} mapping_handle_t; - -typedef enum { read_only = O_RDONLY - , read_write = O_RDWR - , copy_on_write - , read_private - , invalid_mode = 0xffff - } mode_t; - -typedef enum { file_begin = SEEK_SET - , file_end = SEEK_END - , file_current = SEEK_CUR - } file_pos_t; - -typedef int map_options_t; -static const map_options_t default_map_options = map_options_t(-1); - -namespace ipcdetail{ - -inline mapping_handle_t mapping_handle_from_file_handle(file_handle_t hnd) -{ - mapping_handle_t ret; - ret.handle = hnd; - ret.is_xsi = false; - return ret; -} - -inline file_handle_t file_handle_from_mapping_handle(mapping_handle_t hnd) -{ return hnd.handle; } - -inline bool create_directory(const char *path) -{ return ::mkdir(path, 0777) == 0 && ::chmod(path, 0777) == 0; } - -inline bool get_temporary_path(char *buffer, std::size_t buf_len, std::size_t &required_len) -{ - required_len = 5u; - if(buf_len < required_len) - return false; - else{ - std::strcpy(buffer, "/tmp"); - } - return true; -} - -inline file_handle_t create_new_file - (const char *name, mode_t mode, const permissions & perm = permissions(), bool temporary = false) -{ - (void)temporary; - int ret = ::open(name, ((int)mode) | O_EXCL | O_CREAT, perm.get_permissions()); - if(ret >= 0){ - ::fchmod(ret, perm.get_permissions()); - } - return ret; -} - -inline file_handle_t create_or_open_file - (const char *name, mode_t mode, const permissions & perm = permissions(), bool temporary = false) -{ - (void)temporary; - int ret = -1; - //We need a loop to change permissions correctly using fchmod, since - //with "O_CREAT only" ::open we don't know if we've created or opened the file. - while(1){ - ret = ::open(name, ((int)mode) | O_EXCL | O_CREAT, perm.get_permissions()); - if(ret >= 0){ - ::fchmod(ret, perm.get_permissions()); - break; - } - else if(errno == EEXIST){ - if((ret = ::open(name, (int)mode)) >= 0 || errno != ENOENT){ - break; - } - } - } - return ret; -} - -inline file_handle_t open_existing_file - (const char *name, mode_t mode, bool temporary = false) -{ - (void)temporary; - return ::open(name, (int)mode); -} - -inline bool delete_file(const char *name) -{ return ::unlink(name) == 0; } - -inline bool truncate_file (file_handle_t hnd, std::size_t size) -{ - typedef boost::make_unsigned<off_t>::type uoff_t; - if(uoff_t((std::numeric_limits<off_t>::max)()) < size){ - errno = EINVAL; - return false; - } - return 0 == ::ftruncate(hnd, off_t(size)); -} - -inline bool get_file_size(file_handle_t hnd, offset_t &size) -{ - struct stat data; - bool ret = 0 == ::fstat(hnd, &data); - if(ret){ - size = data.st_size; - } - return ret; -} - -inline bool set_file_pointer(file_handle_t hnd, offset_t off, file_pos_t pos) -{ return ((off_t)(-1)) != ::lseek(hnd, off, (int)pos); } - -inline bool get_file_pointer(file_handle_t hnd, offset_t &off) -{ - off = ::lseek(hnd, 0, SEEK_CUR); - return off != ((off_t)-1); -} - -inline bool write_file(file_handle_t hnd, const void *data, std::size_t numdata) -{ return (ssize_t(numdata)) == ::write(hnd, data, numdata); } - -inline file_handle_t invalid_file() -{ return -1; } - -inline bool close_file(file_handle_t hnd) -{ return ::close(hnd) == 0; } - -inline bool acquire_file_lock(file_handle_t hnd) -{ - struct ::flock lock; - lock.l_type = F_WRLCK; - lock.l_whence = SEEK_SET; - lock.l_start = 0; - lock.l_len = 0; - return -1 != ::fcntl(hnd, F_SETLKW, &lock); -} - -inline bool try_acquire_file_lock(file_handle_t hnd, bool &acquired) -{ - struct ::flock lock; - lock.l_type = F_WRLCK; - lock.l_whence = SEEK_SET; - lock.l_start = 0; - lock.l_len = 0; - int ret = ::fcntl(hnd, F_SETLK, &lock); - if(ret == -1){ - return (errno == EAGAIN || errno == EACCES) ? - acquired = false, true : false; - } - return (acquired = true); -} - -inline bool release_file_lock(file_handle_t hnd) -{ - struct ::flock lock; - lock.l_type = F_UNLCK; - lock.l_whence = SEEK_SET; - lock.l_start = 0; - lock.l_len = 0; - return -1 != ::fcntl(hnd, F_SETLK, &lock); -} - -inline bool acquire_file_lock_sharable(file_handle_t hnd) -{ - struct ::flock lock; - lock.l_type = F_RDLCK; - lock.l_whence = SEEK_SET; - lock.l_start = 0; - lock.l_len = 0; - return -1 != ::fcntl(hnd, F_SETLKW, &lock); -} - -inline bool try_acquire_file_lock_sharable(file_handle_t hnd, bool &acquired) -{ - struct flock lock; - lock.l_type = F_RDLCK; - lock.l_whence = SEEK_SET; - lock.l_start = 0; - lock.l_len = 0; - int ret = ::fcntl(hnd, F_SETLK, &lock); - if(ret == -1){ - return (errno == EAGAIN || errno == EACCES) ? - acquired = false, true : false; - } - return (acquired = true); -} - -inline bool release_file_lock_sharable(file_handle_t hnd) -{ return release_file_lock(hnd); } - -#if 0 -inline bool acquire_file_lock(file_handle_t hnd) -{ return 0 == ::flock(hnd, LOCK_EX); } - -inline bool try_acquire_file_lock(file_handle_t hnd, bool &acquired) -{ - int ret = ::flock(hnd, LOCK_EX | LOCK_NB); - acquired = ret == 0; - return (acquired || errno == EWOULDBLOCK); -} - -inline bool release_file_lock(file_handle_t hnd) -{ return 0 == ::flock(hnd, LOCK_UN); } - -inline bool acquire_file_lock_sharable(file_handle_t hnd) -{ return 0 == ::flock(hnd, LOCK_SH); } - -inline bool try_acquire_file_lock_sharable(file_handle_t hnd, bool &acquired) -{ - int ret = ::flock(hnd, LOCK_SH | LOCK_NB); - acquired = ret == 0; - return (acquired || errno == EWOULDBLOCK); -} - -inline bool release_file_lock_sharable(file_handle_t hnd) -{ return 0 == ::flock(hnd, LOCK_UN); } -#endif - -inline bool delete_subdirectories_recursive - (const std::string &refcstrRootDirectory, const char *dont_delete_this) -{ - DIR *d = opendir(refcstrRootDirectory.c_str()); - if(!d) { - return false; - } - - struct dir_close - { - DIR *d_; - dir_close(DIR *d) : d_(d) {} - ~dir_close() { ::closedir(d_); } - } dc(d); (void)dc; - - struct ::dirent *de; - struct ::stat st; - std::string fn; - - while((de=::readdir(d))) { - if( de->d_name[0] == '.' && ( de->d_name[1] == '\0' - || (de->d_name[1] == '.' && de->d_name[2] == '\0' )) ){ - continue; - } - if(dont_delete_this && std::strcmp(dont_delete_this, de->d_name) == 0){ - continue; - } - fn = refcstrRootDirectory; - fn += '/'; - fn += de->d_name; - - if(std::remove(fn.c_str())) { - if(::stat(fn.c_str(), & st)) { - return false; - } - if(S_ISDIR(st.st_mode)) { - if(!delete_subdirectories_recursive(fn, 0) ){ - return false; - } - } else { - return false; - } - } - } - return std::remove(refcstrRootDirectory.c_str()) ? false : true; -} - -template<class Function> -inline bool for_each_file_in_dir(const char *dir, Function f) -{ - std::string refcstrRootDirectory(dir); - - DIR *d = opendir(refcstrRootDirectory.c_str()); - if(!d) { - return false; - } - - struct dir_close - { - DIR *d_; - dir_close(DIR *d) : d_(d) {} - ~dir_close() { ::closedir(d_); } - } dc(d); (void)dc; - - struct ::dirent *de; - struct ::stat st; - std::string fn; - - while((de=::readdir(d))) { - if( de->d_name[0] == '.' && ( de->d_name[1] == '\0' - || (de->d_name[1] == '.' && de->d_name[2] == '\0' )) ){ - continue; - } - fn = refcstrRootDirectory; - fn += '/'; - fn += de->d_name; - - if(::stat(fn.c_str(), & st)) { - return false; - } - //If it's a file, apply erase logic - if(!S_ISDIR(st.st_mode)) { - f(fn.c_str(), de->d_name); - } - } - return true; -} - - -//This function erases all the subdirectories of a directory except the one pointed by "dont_delete_this" -inline bool delete_subdirectories(const std::string &refcstrRootDirectory, const char *dont_delete_this) -{ - return delete_subdirectories_recursive(refcstrRootDirectory, dont_delete_this ); -} - -#endif //#if defined (BOOST_INTERPROCESS_WINDOWS) - -inline bool open_or_create_directory(const char *dir_name) -{ - //If fails, check that it's because it already exists - if(!create_directory(dir_name)){ - error_info info(system_error_code()); - if(info.get_error_code() != already_exists_error){ - return false; - } - } - return true; -} - -inline std::string get_temporary_path() -{ - std::size_t required_len = 0; - get_temporary_path(0, 0, required_len); - std::string ret_str(required_len, char(0)); - get_temporary_path(&ret_str[0], ret_str.size(), required_len); - while(!ret_str.empty() && !ret_str[ret_str.size()-1]){ - ret_str.erase(ret_str.size()-1); - } - - return ret_str; -} - -} //namespace ipcdetail{ -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //BOOST_INTERPROCESS_DETAIL_OS_FILE_FUNCTIONS_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/detail/os_thread_functions.hpp b/src/third_party/boost-1.56.0/boost/interprocess/detail/os_thread_functions.hpp deleted file mode 100644 index 934e608de2a..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/detail/os_thread_functions.hpp +++ /dev/null @@ -1,594 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-2013. 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. -// -////////////////////////////////////////////////////////////////////////////// - -//Thread launching functions are adapted from boost/detail/lightweight_thread.hpp -// -// boost/detail/lightweight_thread.hpp -// -// Copyright (c) 2002 Peter Dimov and Multi Media Ltd. -// Copyright (c) 2008 Peter Dimov -// -// 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 - -#ifndef BOOST_INTERPROCESS_DETAIL_OS_THREAD_FUNCTIONS_HPP -#define BOOST_INTERPROCESS_DETAIL_OS_THREAD_FUNCTIONS_HPP - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> -#include <boost/interprocess/streams/bufferstream.hpp> -#include <boost/interprocess/detail/posix_time_types_wrk.hpp> -#include <cstddef> -#include <memory> - -#if defined(BOOST_INTERPROCESS_WINDOWS) -# include <boost/interprocess/detail/win32_api.hpp> -# include <process.h> -#else -# include <pthread.h> -# include <unistd.h> -# include <sched.h> -# include <time.h> -# ifdef BOOST_INTERPROCESS_BSD_DERIVATIVE - //Some *BSD systems (OpenBSD & NetBSD) need sys/param.h before sys/sysctl.h, whereas - //others (FreeBSD & Darwin) need sys/types.h -# include <sys/types.h> -# include <sys/param.h> -# include <sys/sysctl.h> -# endif -//According to the article "C/C++ tip: How to measure elapsed real time for benchmarking" -# if defined(CLOCK_MONOTONIC_PRECISE) //BSD -# define BOOST_INTERPROCESS_CLOCK_MONOTONIC CLOCK_MONOTONIC_PRECISE -# elif defined(CLOCK_MONOTONIC_RAW) //Linux -# define BOOST_INTERPROCESS_CLOCK_MONOTONIC CLOCK_MONOTONIC_RAW -# elif defined(CLOCK_HIGHRES) //Solaris -# define BOOST_INTERPROCESS_CLOCK_MONOTONIC CLOCK_HIGHRES -# elif defined(CLOCK_MONOTONIC) //POSIX (AIX, BSD, Linux, Solaris) -# define BOOST_INTERPROCESS_CLOCK_MONOTONIC CLOCK_MONOTONIC -# elif !defined(CLOCK_MONOTONIC) && (defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__)) -# include <mach/mach_time.h> // mach_absolute_time, mach_timebase_info_data_t -# define BOOST_INTERPROCESS_MATCH_ABSOLUTE_TIME -# else -# error "No high resolution steady clock in your system, please provide a patch" -# endif -#endif - -namespace boost { -namespace interprocess { -namespace ipcdetail{ - -#if defined (BOOST_INTERPROCESS_WINDOWS) - -typedef unsigned long OS_process_id_t; -typedef unsigned long OS_thread_id_t; -typedef void* OS_thread_t; -typedef OS_thread_id_t OS_systemwide_thread_id_t; - -//process -inline OS_process_id_t get_current_process_id() -{ return winapi::get_current_process_id(); } - -inline OS_process_id_t get_invalid_process_id() -{ return OS_process_id_t(0); } - -//thread -inline OS_thread_id_t get_current_thread_id() -{ return winapi::get_current_thread_id(); } - -inline OS_thread_id_t get_invalid_thread_id() -{ return OS_thread_id_t(0xffffffff); } - -inline bool equal_thread_id(OS_thread_id_t id1, OS_thread_id_t id2) -{ return id1 == id2; } - -//return the system tick in ns -inline unsigned long get_system_tick_ns() -{ - unsigned long curres; - winapi::set_timer_resolution(10000, 0, &curres); - //Windows API returns the value in hundreds of ns - return (curres - 1ul)*100ul; -} - -//return the system tick in us -inline unsigned long get_system_tick_us() -{ - unsigned long curres; - winapi::set_timer_resolution(10000, 0, &curres); - //Windows API returns the value in hundreds of ns - return (curres - 1ul)/10ul + 1ul; -} - -typedef unsigned __int64 OS_highres_count_t; - -inline unsigned long get_system_tick_in_highres_counts() -{ - __int64 freq; - unsigned long curres; - winapi::set_timer_resolution(10000, 0, &curres); - //Frequency in counts per second - if(!winapi::query_performance_frequency(&freq)){ - //Tick resolution in ms - return (curres-1ul)/10000ul + 1ul; - } - else{ - //In femtoseconds - __int64 count_fs = (1000000000000000LL - 1LL)/freq + 1LL; - __int64 tick_counts = (static_cast<__int64>(curres)*100000000LL - 1LL)/count_fs + 1LL; - return static_cast<unsigned long>(tick_counts); - } -} - -inline OS_highres_count_t get_current_system_highres_count() -{ - __int64 count; - if(!winapi::query_performance_counter(&count)){ - count = winapi::get_tick_count(); - } - return count; -} - -inline void zero_highres_count(OS_highres_count_t &count) -{ count = 0; } - -inline bool is_highres_count_zero(const OS_highres_count_t &count) -{ return count == 0; } - -template <class Ostream> -inline Ostream &ostream_highres_count(Ostream &ostream, const OS_highres_count_t &count) -{ - ostream << count; - return ostream; -} - -inline OS_highres_count_t system_highres_count_subtract(const OS_highres_count_t &l, const OS_highres_count_t &r) -{ return l - r; } - -inline bool system_highres_count_less(const OS_highres_count_t &l, const OS_highres_count_t &r) -{ return l < r; } - -inline bool system_highres_count_less_ul(const OS_highres_count_t &l, unsigned long r) -{ return l < static_cast<OS_highres_count_t>(r); } - -inline void thread_sleep_tick() -{ winapi::sleep_tick(); } - -inline void thread_yield() -{ winapi::sched_yield(); } - -inline void thread_sleep(unsigned int ms) -{ winapi::sleep(ms); } - -//systemwide thread -inline OS_systemwide_thread_id_t get_current_systemwide_thread_id() -{ - return get_current_thread_id(); -} - -inline void systemwide_thread_id_copy - (const volatile OS_systemwide_thread_id_t &from, volatile OS_systemwide_thread_id_t &to) -{ - to = from; -} - -inline bool equal_systemwide_thread_id(const OS_systemwide_thread_id_t &id1, const OS_systemwide_thread_id_t &id2) -{ - return equal_thread_id(id1, id2); -} - -inline OS_systemwide_thread_id_t get_invalid_systemwide_thread_id() -{ - return get_invalid_thread_id(); -} - -inline long double get_current_process_creation_time() -{ - winapi::interprocess_filetime CreationTime, ExitTime, KernelTime, UserTime; - - get_process_times - ( winapi::get_current_process(), &CreationTime, &ExitTime, &KernelTime, &UserTime); - - typedef long double ldouble_t; - const ldouble_t resolution = (100.0l/1000000000.0l); - return CreationTime.dwHighDateTime*(ldouble_t(1u<<31u)*2.0l*resolution) + - CreationTime.dwLowDateTime*resolution; -} - -inline unsigned int get_num_cores() -{ - winapi::system_info sysinfo; - winapi::get_system_info( &sysinfo ); - //in Windows dw is long which is equal in bits to int - return static_cast<unsigned>(sysinfo.dwNumberOfProcessors); -} - -#else //#if defined (BOOST_INTERPROCESS_WINDOWS) - -typedef pthread_t OS_thread_t; -typedef pthread_t OS_thread_id_t; -typedef pid_t OS_process_id_t; - -struct OS_systemwide_thread_id_t -{ - OS_systemwide_thread_id_t() - : pid(), tid() - {} - - OS_systemwide_thread_id_t(pid_t p, pthread_t t) - : pid(p), tid(t) - {} - - OS_systemwide_thread_id_t(const OS_systemwide_thread_id_t &x) - : pid(x.pid), tid(x.tid) - {} - - OS_systemwide_thread_id_t(const volatile OS_systemwide_thread_id_t &x) - : pid(x.pid), tid(x.tid) - {} - - OS_systemwide_thread_id_t & operator=(const OS_systemwide_thread_id_t &x) - { pid = x.pid; tid = x.tid; return *this; } - - OS_systemwide_thread_id_t & operator=(const volatile OS_systemwide_thread_id_t &x) - { pid = x.pid; tid = x.tid; return *this; } - - void operator=(const OS_systemwide_thread_id_t &x) volatile - { pid = x.pid; tid = x.tid; } - - pid_t pid; - pthread_t tid; -}; - -inline void systemwide_thread_id_copy - (const volatile OS_systemwide_thread_id_t &from, volatile OS_systemwide_thread_id_t &to) -{ - to.pid = from.pid; - to.tid = from.tid; -} - -//process -inline OS_process_id_t get_current_process_id() -{ return ::getpid(); } - -inline OS_process_id_t get_invalid_process_id() -{ return pid_t(0); } - -//thread -inline OS_thread_id_t get_current_thread_id() -{ return ::pthread_self(); } - -inline OS_thread_id_t get_invalid_thread_id() -{ - static pthread_t invalid_id; - return invalid_id; -} - -inline bool equal_thread_id(OS_thread_id_t id1, OS_thread_id_t id2) -{ return 0 != pthread_equal(id1, id2); } - -inline void thread_yield() -{ ::sched_yield(); } - -#ifndef BOOST_INTERPROCESS_MATCH_ABSOLUTE_TIME -typedef struct timespec OS_highres_count_t; -#else -typedef unsigned long long OS_highres_count_t; -#endif - -inline unsigned long get_system_tick_ns() -{ - #ifdef _SC_CLK_TCK - long hz =::sysconf(_SC_CLK_TCK); // ticks per sec - if(hz <= 0){ //Try a typical value on error - hz = 100; - } - return 999999999ul/static_cast<unsigned long>(hz)+1ul; - #else - #error "Can't obtain system tick value for your system, please provide a patch" - #endif -} - -inline unsigned long get_system_tick_in_highres_counts() -{ - #ifndef BOOST_INTERPROCESS_MATCH_ABSOLUTE_TIME - return get_system_tick_ns(); - #else - mach_timebase_info_data_t info; - mach_timebase_info(&info); - //ns - return static_cast<unsigned long> - ( - static_cast<double>(get_system_tick_ns()) - / (static_cast<double>(info.numer) / info.denom) - ); - #endif -} - -//return system ticks in us -inline unsigned long get_system_tick_us() -{ - return (get_system_tick_ns()-1)/1000ul + 1ul; -} - -inline OS_highres_count_t get_current_system_highres_count() -{ - #if defined(BOOST_INTERPROCESS_CLOCK_MONOTONIC) - struct timespec count; - ::clock_gettime(BOOST_INTERPROCESS_CLOCK_MONOTONIC, &count); - return count; - #elif defined(BOOST_INTERPROCESS_MATCH_ABSOLUTE_TIME) - return ::mach_absolute_time(); - #endif -} - -#ifndef BOOST_INTERPROCESS_MATCH_ABSOLUTE_TIME - -inline void zero_highres_count(OS_highres_count_t &count) -{ count.tv_sec = 0; count.tv_nsec = 0; } - -inline bool is_highres_count_zero(const OS_highres_count_t &count) -{ return count.tv_sec == 0 && count.tv_nsec == 0; } - -template <class Ostream> -inline Ostream &ostream_highres_count(Ostream &ostream, const OS_highres_count_t &count) -{ - ostream << count.tv_sec << "s:" << count.tv_nsec << "ns"; - return ostream; -} - -inline OS_highres_count_t system_highres_count_subtract(const OS_highres_count_t &l, const OS_highres_count_t &r) -{ - OS_highres_count_t res; - - if (l.tv_nsec < r.tv_nsec){ - res.tv_nsec = 1000000000 + l.tv_nsec - r.tv_nsec; - res.tv_sec = l.tv_sec - 1 - r.tv_sec; - } - else{ - res.tv_nsec = l.tv_nsec - r.tv_nsec; - res.tv_sec = l.tv_sec - r.tv_sec; - } - - return res; -} - -inline bool system_highres_count_less(const OS_highres_count_t &l, const OS_highres_count_t &r) -{ return l.tv_sec < r.tv_sec || (l.tv_sec == r.tv_sec && l.tv_nsec < r.tv_nsec); } - -inline bool system_highres_count_less_ul(const OS_highres_count_t &l, unsigned long r) -{ return !l.tv_sec && (static_cast<unsigned long>(l.tv_nsec) < r); } - -#else - -inline void zero_highres_count(OS_highres_count_t &count) -{ count = 0; } - -inline bool is_highres_count_zero(const OS_highres_count_t &count) -{ return count == 0; } - -template <class Ostream> -inline Ostream &ostream_highres_count(Ostream &ostream, const OS_highres_count_t &count) -{ - ostream << count ; - return ostream; -} - -inline OS_highres_count_t system_highres_count_subtract(const OS_highres_count_t &l, const OS_highres_count_t &r) -{ return l - r; } - -inline bool system_highres_count_less(const OS_highres_count_t &l, const OS_highres_count_t &r) -{ return l < r; } - -inline bool system_highres_count_less_ul(const OS_highres_count_t &l, unsigned long r) -{ return l < static_cast<OS_highres_count_t>(r); } - -#endif - -inline void thread_sleep_tick() -{ - struct timespec rqt; - //Sleep for the half of the tick time - rqt.tv_sec = 0; - rqt.tv_nsec = get_system_tick_ns()/2; - ::nanosleep(&rqt, 0); -} - -inline void thread_sleep(unsigned int ms) -{ - struct timespec rqt; - rqt.tv_sec = ms/1000u; - rqt.tv_nsec = (ms%1000u)*1000000u; - ::nanosleep(&rqt, 0); -} - -//systemwide thread -inline OS_systemwide_thread_id_t get_current_systemwide_thread_id() -{ - return OS_systemwide_thread_id_t(::getpid(), ::pthread_self()); -} - -inline bool equal_systemwide_thread_id(const OS_systemwide_thread_id_t &id1, const OS_systemwide_thread_id_t &id2) -{ - return (0 != pthread_equal(id1.tid, id2.tid)) && (id1.pid == id2.pid); -} - -inline OS_systemwide_thread_id_t get_invalid_systemwide_thread_id() -{ - return OS_systemwide_thread_id_t(get_invalid_process_id(), get_invalid_thread_id()); -} - -inline long double get_current_process_creation_time() -{ return 0.0L; } - -inline unsigned int get_num_cores() -{ - #ifdef _SC_NPROCESSORS_ONLN - long cores = ::sysconf(_SC_NPROCESSORS_ONLN); - // sysconf returns -1 if the name is invalid, the option does not exist or - // does not have a definite limit. - // if sysconf returns some other negative number, we have no idea - // what is going on. Default to something safe. - if(cores <= 0){ - return 1; - } - //Check for overflow (unlikely) - else if(static_cast<unsigned long>(cores) >= - static_cast<unsigned long>(static_cast<unsigned int>(-1))){ - return static_cast<unsigned int>(-1); - } - else{ - return static_cast<unsigned int>(cores); - } - #elif defined(BOOST_INTERPROCESS_BSD_DERIVATIVE) && defined(HW_NCPU) - int request[2] = { CTL_HW, HW_NCPU }; - int num_cores; - std::size_t result_len = sizeof(num_cores); - if ( (::sysctl (request, 2, &num_cores, &result_len, 0, 0) < 0) || (num_cores <= 0) ){ - //Return a safe value - return 1; - } - else{ - return static_cast<unsigned int>(num_cores); - } - #endif -} - -inline int thread_create(OS_thread_t * thread, void *(*start_routine)(void*), void* arg) -{ return pthread_create(thread, 0, start_routine, arg); } - -inline void thread_join(OS_thread_t thread) -{ (void)pthread_join(thread, 0); } - -#endif //#if defined (BOOST_INTERPROCESS_WINDOWS) - -typedef char pid_str_t[sizeof(OS_process_id_t)*3+1]; - -inline void get_pid_str(pid_str_t &pid_str, OS_process_id_t pid) -{ - bufferstream bstream(pid_str, sizeof(pid_str)); - bstream << pid << std::ends; -} - -inline void get_pid_str(pid_str_t &pid_str) -{ get_pid_str(pid_str, get_current_process_id()); } - -#if defined(BOOST_INTERPROCESS_WINDOWS) - -inline int thread_create( OS_thread_t * thread, unsigned (__stdcall * start_routine) (void*), void* arg ) -{ - void* h = (void*)_beginthreadex( 0, 0, start_routine, arg, 0, 0 ); - - if( h != 0 ){ - *thread = h; - return 0; - } - else{ - return 1; - } -} - -inline void thread_join( OS_thread_t thread) -{ - winapi::wait_for_single_object( thread, winapi::infinite_time ); - winapi::close_handle( thread ); -} - -#endif - -class abstract_thread -{ - public: - virtual ~abstract_thread() {} - virtual void run() = 0; -}; - -template<class T> -class os_thread_func_ptr_deleter -{ - public: - explicit os_thread_func_ptr_deleter(T* p) - : m_p(p) - {} - - T *release() - { T *p = m_p; m_p = 0; return p; } - - T *get() const - { return m_p; } - - T *operator ->() const - { return m_p; } - - ~os_thread_func_ptr_deleter() - { delete m_p; } - - private: - T *m_p; -}; - -#if defined(BOOST_INTERPROCESS_WINDOWS) - -inline unsigned __stdcall launch_thread_routine( void * pv ) -{ - os_thread_func_ptr_deleter<abstract_thread> pt( static_cast<abstract_thread *>( pv ) ); - pt->run(); - return 0; -} - -#else - -extern "C" void * launch_thread_routine( void * pv ); - -inline void * launch_thread_routine( void * pv ) -{ - os_thread_func_ptr_deleter<abstract_thread> pt( static_cast<abstract_thread *>( pv ) ); - pt->run(); - return 0; -} - -#endif - -template<class F> -class launch_thread_impl - : public abstract_thread -{ - public: - explicit launch_thread_impl( F f ) - : f_( f ) - {} - - void run() - { f_(); } - - private: - F f_; -}; - -template<class F> -inline int thread_launch( OS_thread_t & pt, F f ) -{ - os_thread_func_ptr_deleter<abstract_thread> p( new launch_thread_impl<F>( f ) ); - - int r = thread_create(&pt, launch_thread_routine, p.get()); - if( r == 0 ){ - p.release(); - } - - return r; -} - -} //namespace ipcdetail{ -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //BOOST_INTERPROCESS_DETAIL_OS_THREAD_FUNCTIONS_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/detail/pointer_type.hpp b/src/third_party/boost-1.56.0/boost/interprocess/detail/pointer_type.hpp deleted file mode 100644 index 28b053c2aea..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/detail/pointer_type.hpp +++ /dev/null @@ -1,74 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-2012. -// (C) Copyright Gennaro Prota 2003 - 2004. -// -// 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_DETAIL_POINTER_TYPE_HPP -#define BOOST_INTERPROCESS_DETAIL_POINTER_TYPE_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> -#include <boost/interprocess/detail/type_traits.hpp> - -namespace boost { -namespace interprocess { -namespace ipcdetail { - -struct two {char _[2];}; - -namespace pointer_type_imp { - -template <class U> static two test(...); -template <class U> static char test(typename U::pointer* = 0); - -} //namespace pointer_type_imp { - -template <class T> -struct has_pointer_type -{ - static const bool value = sizeof(pointer_type_imp::test<T>(0)) == 1; -}; - -namespace pointer_type_imp { - -template <class T, class D, bool = has_pointer_type<D>::value> -struct pointer_type -{ - typedef typename D::pointer type; -}; - -template <class T, class D> -struct pointer_type<T, D, false> -{ - typedef T* type; -}; - -} //namespace pointer_type_imp { - -template <class T, class D> -struct pointer_type -{ - typedef typename pointer_type_imp::pointer_type<T, - typename remove_reference<D>::type>::type type; -}; - -} //namespace ipcdetail { -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //#ifndef BOOST_INTERPROCESS_DETAIL_POINTER_TYPE_HPP - diff --git a/src/third_party/boost-1.56.0/boost/interprocess/detail/posix_time_types_wrk.hpp b/src/third_party/boost-1.56.0/boost/interprocess/detail/posix_time_types_wrk.hpp deleted file mode 100644 index fa167f576f4..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/detail/posix_time_types_wrk.hpp +++ /dev/null @@ -1,42 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_POSIX_TIMES_WRK_HPP -#define BOOST_INTERPROCESS_POSIX_TIMES_WRK_HPP - -//workaround to avoid winsock redefines when using date-time - -#ifdef _WIN32 -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#define BOOST_INTERPROCESS_WIN32_LEAN_AND_MEAN -#endif //#ifndef WIN32_LEAN_AND_MEAN -#endif //#ifdef _WIN32 - -#include <boost/date_time/posix_time/posix_time_types.hpp> -#include <boost/date_time/posix_time/conversion.hpp> - -namespace boost { -namespace interprocess { - -typedef boost::date_time::microsec_clock<boost::posix_time::ptime> microsec_clock; - -} -} - -#ifdef _WIN32 -#ifdef BOOST_INTERPROCESS_WIN32_LEAN_AND_MEAN -#undef WIN32_LEAN_AND_MEAN -#undef BOOST_INTERPROCESS_WIN32_LEAN_AND_MEAN -#endif //#ifdef BOOST_INTERPROCESS_WIN32_LEAN_AND_MEAN -#endif //#ifdef _WIN32 - -#endif //#ifndef BOOST_INTERPROCESS_POSIX_TIMES_WRK_HPP - diff --git a/src/third_party/boost-1.56.0/boost/interprocess/detail/preprocessor.hpp b/src/third_party/boost-1.56.0/boost/interprocess/detail/preprocessor.hpp deleted file mode 100644 index 06d1354ee1e..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/detail/preprocessor.hpp +++ /dev/null @@ -1,203 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2008-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_DETAIL_PREPROCESSOR_HPP -#define BOOST_INTERPROCESS_DETAIL_PREPROCESSOR_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> - -#ifdef BOOST_INTERPROCESS_PERFECT_FORWARDING -#error "This file is not needed when perfect forwarding is available" -#endif - -#include <boost/preprocessor/iteration/local.hpp> -#include <boost/preprocessor/repetition/enum_params.hpp> -#include <boost/preprocessor/cat.hpp> -#include <boost/preprocessor/repetition/enum.hpp> -#include <boost/preprocessor/repetition/repeat.hpp> - -#define BOOST_INTERPROCESS_MAX_CONSTRUCTOR_PARAMETERS 10 - -//Note: -//We define template parameters as const references to -//be able to bind temporaries. After that we will un-const them. -//This cast is ugly but it is necessary until "perfect forwarding" -//is achieved in C++0x. Meanwhile, if we want to be able to -//bind rvalues with non-const references, we have to be ugly -#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES - #define BOOST_INTERPROCESS_PP_PARAM_LIST(z, n, data) \ - BOOST_PP_CAT(P, n) && BOOST_PP_CAT(p, n) \ - //! -#else - #define BOOST_INTERPROCESS_PP_PARAM_LIST(z, n, data) \ - const BOOST_PP_CAT(P, n) & BOOST_PP_CAT(p, n) \ - //! -#endif - -#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES - #define BOOST_INTERPROCESS_PP_PARAM(U, u) \ - U && u \ - //! -#else - #define BOOST_INTERPROCESS_PP_PARAM(U, u) \ - const U & u \ - //! -#endif - -#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES - - #define BOOST_INTERPROCESS_PP_PARAM_INIT(z, n, data) \ - BOOST_PP_CAT(m_p, n) (::boost::forward< BOOST_PP_CAT(P, n) >( BOOST_PP_CAT(p, n) )) \ - //! - -#else //#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES - - #define BOOST_INTERPROCESS_PP_PARAM_INIT(z, n, data) \ - BOOST_PP_CAT(m_p, n) (const_cast<BOOST_PP_CAT(P, n) &>(BOOST_PP_CAT(p, n))) \ - //! -#endif - -#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES - - #if defined(BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG) - - namespace boost { - namespace interprocess { - namespace ipcdetail { - template<class T> - struct ref_holder; - - template<class T> - struct ref_holder<T &> - { - ref_holder(T &t) - : t_(t) - {} - T &t_; - T & get() { return t_; } - T & get_lvalue() { return t_; } - }; - - template<class T> - struct ref_holder<const T> - { - ref_holder(const T &t) - : t_(t) - {} - const T &t_; - const T & get() { return t_; } - const T & get_lvalue() { return t_; } - }; - - template<class T> - struct ref_holder<const T &&> - { - ref_holder(const T &t) - : t_(t) - {} - const T &t_; - const T & get() { return t_; } - const T & get_lvalue() { return t_; } - }; - - template<class T> - struct ref_holder - { - ref_holder(T &&t) - : t_(t) - {} - T &t_; - T && get() { return ::boost::move(t_); } - T & get_lvalue() { return t_; } - }; - - template<class T> - struct ref_holder<T &&> - { - ref_holder(T &&t) - : t(t) - {} - T &t; - T && get() { return ::boost::move(t_); } - T & get_lvalue() { return t_; } - }; - - } //namespace ipcdetail { - } //namespace interprocess { - } //namespace boost { - - #define BOOST_INTERPROCESS_PP_PARAM_DEFINE(z, n, data) \ - ::boost::interprocess::ipcdetail::ref_holder<BOOST_PP_CAT(P, n)> BOOST_PP_CAT(m_p, n); \ - //! - - #define BOOST_INTERPROCESS_PP_PARAM_INC(z, n, data) \ - BOOST_PP_CAT(++m_p, n).get_lvalue() \ - //! - - #else //BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG - - #define BOOST_INTERPROCESS_PP_PARAM_DEFINE(z, n, data)\ - BOOST_PP_CAT(P, n) && BOOST_PP_CAT(m_p, n); \ - //! - - #define BOOST_INTERPROCESS_PP_PARAM_INC(z, n, data) \ - BOOST_PP_CAT(++m_p, n) \ - //! - - #endif //defined(BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG) - -#else - #define BOOST_INTERPROCESS_PP_PARAM_DEFINE(z, n, data) \ - BOOST_PP_CAT(P, n) & BOOST_PP_CAT(m_p, n); \ - //! - - #define BOOST_INTERPROCESS_PP_PARAM_INC(z, n, data) \ - BOOST_PP_CAT(++m_p, n) \ - //! - -#endif - -#define BOOST_INTERPROCESS_PP_PARAM_FORWARD(z, n, data) \ -::boost::forward< BOOST_PP_CAT(P, n) >( BOOST_PP_CAT(p, n) ) \ -//! - -#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && defined(BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG) - - #define BOOST_INTERPROCESS_PP_MEMBER_FORWARD(z, n, data) BOOST_PP_CAT(this->m_p, n).get() \ - //! - - #define BOOST_INTERPROCESS_PP_MEMBER_IT_FORWARD(z, n, data) \ - BOOST_PP_CAT(*m_p, n).get_lvalue() \ - //! - -#else - - #define BOOST_INTERPROCESS_PP_MEMBER_FORWARD(z, n, data) \ - ::boost::forward< BOOST_PP_CAT(P, n) >( BOOST_PP_CAT(m_p, n) ) \ - //! - - #define BOOST_INTERPROCESS_PP_MEMBER_IT_FORWARD(z, n, data) \ - BOOST_PP_CAT(*m_p, n) \ - //! - - -#endif //!defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && defined(BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG) - -#include <boost/interprocess/detail/config_end.hpp> - -#else -#ifdef BOOST_INTERPROCESS_PERFECT_FORWARDING -#error "This file is not needed when perfect forwarding is available" -#endif -#endif //#ifndef BOOST_INTERPROCESS_DETAIL_PREPROCESSOR_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/detail/segment_manager_helper.hpp b/src/third_party/boost-1.56.0/boost/interprocess/detail/segment_manager_helper.hpp deleted file mode 100644 index 47edbd68d85..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/detail/segment_manager_helper.hpp +++ /dev/null @@ -1,521 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_SEGMENT_MANAGER_BASE_HPP -#define BOOST_INTERPROCESS_SEGMENT_MANAGER_BASE_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> - -#include <boost/intrusive/pointer_traits.hpp> - -#include <boost/detail/no_exceptions_support.hpp> -#include <boost/interprocess/detail/type_traits.hpp> -#include <boost/interprocess/detail/utilities.hpp> -#include <boost/interprocess/detail/in_place_interface.hpp> -#include <boost/interprocess/exceptions.hpp> -#include <boost/type_traits/make_unsigned.hpp> -#include <boost/type_traits/alignment_of.hpp> -#include <boost/intrusive/pointer_traits.hpp> -#include <cstddef> //std::size_t -#include <string> //char_traits -#include <new> //std::nothrow -#include <utility> //std::pair -#include <iterator> //std::iterator_traits -#include <boost/assert.hpp> //BOOST_ASSERT -#include <functional> //unary_function -#ifndef BOOST_NO_EXCEPTIONS -#include <exception> -#endif - -//!\file -//!Describes the object placed in a memory segment that provides -//!named object allocation capabilities. - -namespace boost{ -namespace interprocess{ - -template<class MemoryManager> -class segment_manager_base; - -//!An integer that describes the type of the -//!instance constructed in memory -enum instance_type { anonymous_type, named_type, unique_type, max_allocation_type }; - -namespace ipcdetail{ - -template<class MemoryAlgorithm> -class mem_algo_deallocator -{ - void * m_ptr; - MemoryAlgorithm & m_algo; - - public: - mem_algo_deallocator(void *ptr, MemoryAlgorithm &algo) - : m_ptr(ptr), m_algo(algo) - {} - - void release() - { m_ptr = 0; } - - ~mem_algo_deallocator() - { if(m_ptr) m_algo.deallocate(m_ptr); } -}; - -/// @cond -template<class size_type> -struct block_header -{ - size_type m_value_bytes; - unsigned short m_num_char; - unsigned char m_value_alignment; - unsigned char m_alloc_type_sizeof_char; - - block_header(size_type val_bytes - ,size_type val_alignment - ,unsigned char al_type - ,std::size_t szof_char - ,std::size_t num_char - ) - : m_value_bytes(val_bytes) - , m_num_char((unsigned short)num_char) - , m_value_alignment((unsigned char)val_alignment) - , m_alloc_type_sizeof_char( (al_type << 5u) | ((unsigned char)szof_char & 0x1F) ) - {}; - - template<class T> - block_header &operator= (const T& ) - { return *this; } - - size_type total_size() const - { - if(alloc_type() != anonymous_type){ - return name_offset() + (m_num_char+1)*sizeof_char(); - } - else{ - return this->value_offset() + m_value_bytes; - } - } - - size_type value_bytes() const - { return m_value_bytes; } - - template<class Header> - size_type total_size_with_header() const - { - return get_rounded_size - ( size_type(sizeof(Header)) - , size_type(::boost::alignment_of<block_header<size_type> >::value)) - + total_size(); - } - - unsigned char alloc_type() const - { return (m_alloc_type_sizeof_char >> 5u)&(unsigned char)0x7; } - - unsigned char sizeof_char() const - { return m_alloc_type_sizeof_char & (unsigned char)0x1F; } - - template<class CharType> - CharType *name() const - { - return const_cast<CharType*>(reinterpret_cast<const CharType*> - (reinterpret_cast<const char*>(this) + name_offset())); - } - - unsigned short name_length() const - { return m_num_char; } - - size_type name_offset() const - { - return this->value_offset() + get_rounded_size(size_type(m_value_bytes), size_type(sizeof_char())); - } - - void *value() const - { - return const_cast<char*>((reinterpret_cast<const char*>(this) + this->value_offset())); - } - - size_type value_offset() const - { - return get_rounded_size(size_type(sizeof(block_header<size_type>)), size_type(m_value_alignment)); - } - - template<class CharType> - bool less_comp(const block_header<size_type> &b) const - { - return m_num_char < b.m_num_char || - (m_num_char < b.m_num_char && - std::char_traits<CharType>::compare - (name<CharType>(), b.name<CharType>(), m_num_char) < 0); - } - - template<class CharType> - bool equal_comp(const block_header<size_type> &b) const - { - return m_num_char == b.m_num_char && - std::char_traits<CharType>::compare - (name<CharType>(), b.name<CharType>(), m_num_char) == 0; - } - - template<class T> - static block_header<size_type> *block_header_from_value(T *value) - { return block_header_from_value(value, sizeof(T), ::boost::alignment_of<T>::value); } - - static block_header<size_type> *block_header_from_value(const void *value, std::size_t sz, std::size_t algn) - { - block_header * hdr = - const_cast<block_header*> - (reinterpret_cast<const block_header*>(reinterpret_cast<const char*>(value) - - get_rounded_size(sizeof(block_header), algn))); - (void)sz; - //Some sanity checks - BOOST_ASSERT(hdr->m_value_alignment == algn); - BOOST_ASSERT(hdr->m_value_bytes % sz == 0); - return hdr; - } - - template<class Header> - static block_header<size_type> *from_first_header(Header *header) - { - block_header<size_type> * hdr = - reinterpret_cast<block_header<size_type>*>(reinterpret_cast<char*>(header) + - get_rounded_size(size_type(sizeof(Header)), size_type(::boost::alignment_of<block_header<size_type> >::value))); - //Some sanity checks - return hdr; - } - - template<class Header> - static Header *to_first_header(block_header<size_type> *bheader) - { - Header * hdr = - reinterpret_cast<Header*>(reinterpret_cast<char*>(bheader) - - get_rounded_size(size_type(sizeof(Header)), size_type(::boost::alignment_of<block_header<size_type> >::value))); - //Some sanity checks - return hdr; - } -}; - -inline void array_construct(void *mem, std::size_t num, in_place_interface &table) -{ - //Try constructors - std::size_t constructed = 0; - BOOST_TRY{ - table.construct_n(mem, num, constructed); - } - //If there is an exception call destructors and erase index node - BOOST_CATCH(...){ - std::size_t destroyed = 0; - table.destroy_n(mem, constructed, destroyed); - BOOST_RETHROW - } - BOOST_CATCH_END -} - -template<class CharT> -struct intrusive_compare_key -{ - typedef CharT char_type; - - intrusive_compare_key(const CharT *str, std::size_t len) - : mp_str(str), m_len(len) - {} - - const CharT * mp_str; - std::size_t m_len; -}; - -//!This struct indicates an anonymous object creation -//!allocation -template<instance_type type> -class instance_t -{ - instance_t(){} -}; - -template<class T> -struct char_if_void -{ - typedef T type; -}; - -template<> -struct char_if_void<void> -{ - typedef char type; -}; - -typedef instance_t<anonymous_type> anonymous_instance_t; -typedef instance_t<unique_type> unique_instance_t; - - -template<class Hook, class CharType, class SizeType> -struct intrusive_value_type_impl - : public Hook -{ - private: - //Non-copyable - intrusive_value_type_impl(const intrusive_value_type_impl &); - intrusive_value_type_impl& operator=(const intrusive_value_type_impl &); - - public: - typedef CharType char_type; - typedef SizeType size_type; - - intrusive_value_type_impl(){} - - enum { BlockHdrAlignment = ::boost::alignment_of<block_header<size_type> >::value }; - - block_header<size_type> *get_block_header() const - { - return const_cast<block_header<size_type>*> - (reinterpret_cast<const block_header<size_type> *>(reinterpret_cast<const char*>(this) + - get_rounded_size(size_type(sizeof(*this)), size_type(BlockHdrAlignment)))); - } - - bool operator <(const intrusive_value_type_impl<Hook, CharType, SizeType> & other) const - { return (this->get_block_header())->template less_comp<CharType>(*other.get_block_header()); } - - bool operator ==(const intrusive_value_type_impl<Hook, CharType, SizeType> & other) const - { return (this->get_block_header())->template equal_comp<CharType>(*other.get_block_header()); } - - static intrusive_value_type_impl *get_intrusive_value_type(block_header<size_type> *hdr) - { - return reinterpret_cast<intrusive_value_type_impl *>(reinterpret_cast<char*>(hdr) - - get_rounded_size(size_type(sizeof(intrusive_value_type_impl)), size_type(BlockHdrAlignment))); - } - - CharType *name() const - { return get_block_header()->template name<CharType>(); } - - unsigned short name_length() const - { return get_block_header()->name_length(); } - - void *value() const - { return get_block_header()->value(); } -}; - -template<class CharType> -class char_ptr_holder -{ - public: - char_ptr_holder(const CharType *name) - : m_name(name) - {} - - char_ptr_holder(const anonymous_instance_t *) - : m_name(static_cast<CharType*>(0)) - {} - - char_ptr_holder(const unique_instance_t *) - : m_name(reinterpret_cast<CharType*>(-1)) - {} - - operator const CharType *() - { return m_name; } - - const CharType *get() const - { return m_name; } - - bool is_unique() const - { return m_name == reinterpret_cast<CharType*>(-1); } - - bool is_anonymous() const - { return m_name == static_cast<CharType*>(0); } - - private: - const CharType *m_name; -}; - -//!The key of the the named allocation information index. Stores an offset pointer -//!to a null terminated string and the length of the string to speed up sorting -template<class CharT, class VoidPointer> -struct index_key -{ - typedef typename boost::intrusive:: - pointer_traits<VoidPointer>::template - rebind_pointer<const CharT>::type const_char_ptr_t; - typedef CharT char_type; - typedef typename boost::intrusive::pointer_traits<const_char_ptr_t>::difference_type difference_type; - typedef typename boost::make_unsigned<difference_type>::type size_type; - - private: - //Offset pointer to the object's name - const_char_ptr_t mp_str; - //Length of the name buffer (null NOT included) - size_type m_len; - public: - - //!Constructor of the key - index_key (const char_type *nm, size_type length) - : mp_str(nm), m_len(length) - {} - - //!Less than function for index ordering - bool operator < (const index_key & right) const - { - return (m_len < right.m_len) || - (m_len == right.m_len && - std::char_traits<char_type>::compare - (to_raw_pointer(mp_str) - ,to_raw_pointer(right.mp_str), m_len) < 0); - } - - //!Equal to function for index ordering - bool operator == (const index_key & right) const - { - return m_len == right.m_len && - std::char_traits<char_type>::compare - (to_raw_pointer(mp_str), - to_raw_pointer(right.mp_str), m_len) == 0; - } - - void name(const CharT *nm) - { mp_str = nm; } - - void name_length(size_type len) - { m_len = len; } - - const CharT *name() const - { return to_raw_pointer(mp_str); } - - size_type name_length() const - { return m_len; } -}; - -//!The index_data stores a pointer to a buffer and the element count needed -//!to know how many destructors must be called when calling destroy -template<class VoidPointer> -struct index_data -{ - typedef VoidPointer void_pointer; - void_pointer m_ptr; - index_data(void *ptr) : m_ptr(ptr){} - - void *value() const - { return static_cast<void*>(to_raw_pointer(m_ptr)); } -}; - -template<class MemoryAlgorithm> -struct segment_manager_base_type -{ typedef segment_manager_base<MemoryAlgorithm> type; }; - -template<class CharT, class MemoryAlgorithm> -struct index_config -{ - typedef typename MemoryAlgorithm::void_pointer void_pointer; - typedef CharT char_type; - typedef index_key<CharT, void_pointer> key_type; - typedef index_data<void_pointer> mapped_type; - typedef typename segment_manager_base_type - <MemoryAlgorithm>::type segment_manager_base; - - template<class HeaderBase> - struct intrusive_value_type - { typedef intrusive_value_type_impl<HeaderBase, CharT, typename segment_manager_base::size_type> type; }; - - typedef intrusive_compare_key<CharT> intrusive_compare_key_type; -}; - -template<class Iterator, bool intrusive> -class segment_manager_iterator_value_adaptor -{ - typedef typename Iterator::value_type iterator_val_t; - typedef typename iterator_val_t::char_type char_type; - - public: - segment_manager_iterator_value_adaptor(const typename Iterator::value_type &val) - : m_val(&val) - {} - - const char_type *name() const - { return m_val->name(); } - - unsigned short name_length() const - { return m_val->name_length(); } - - const void *value() const - { return m_val->value(); } - - const typename Iterator::value_type *m_val; -}; - - -template<class Iterator> -class segment_manager_iterator_value_adaptor<Iterator, false> -{ - typedef typename Iterator::value_type iterator_val_t; - typedef typename iterator_val_t::first_type first_type; - typedef typename iterator_val_t::second_type second_type; - typedef typename first_type::char_type char_type; - typedef typename first_type::size_type size_type; - - public: - segment_manager_iterator_value_adaptor(const typename Iterator::value_type &val) - : m_val(&val) - {} - - const char_type *name() const - { return m_val->first.name(); } - - size_type name_length() const - { return m_val->first.name_length(); } - - const void *value() const - { - return reinterpret_cast<block_header<size_type>*> - (to_raw_pointer(m_val->second.m_ptr))->value(); - } - - const typename Iterator::value_type *m_val; -}; - -template<class Iterator, bool intrusive> -struct segment_manager_iterator_transform - : std::unary_function< typename std::iterator_traits<Iterator>::value_type - , segment_manager_iterator_value_adaptor<Iterator, intrusive> > -{ - typedef segment_manager_iterator_value_adaptor<Iterator, intrusive> result_type; - - result_type operator()(const typename std::iterator_traits<Iterator>::value_type &arg) const - { return result_type(arg); } -}; - -} //namespace ipcdetail { - -//These pointers are the ones the user will use to -//indicate previous allocation types -static const ipcdetail::anonymous_instance_t * anonymous_instance = 0; -static const ipcdetail::unique_instance_t * unique_instance = 0; - -namespace ipcdetail_really_deep_namespace { - -//Otherwise, gcc issues a warning of previously defined -//anonymous_instance and unique_instance -struct dummy -{ - dummy() - { - (void)anonymous_instance; - (void)unique_instance; - } -}; - -} //detail_really_deep_namespace - -}} //namespace boost { namespace interprocess - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //#ifndef BOOST_INTERPROCESS_SEGMENT_MANAGER_BASE_HPP - diff --git a/src/third_party/boost-1.56.0/boost/interprocess/detail/shared_dir_helpers.hpp b/src/third_party/boost-1.56.0/boost/interprocess/detail/shared_dir_helpers.hpp deleted file mode 100644 index e3a4065f4d3..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/detail/shared_dir_helpers.hpp +++ /dev/null @@ -1,191 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2007-2014. 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_DETAIL_SHARED_DIR_HELPERS_HPP -#define BOOST_INTERPROCESS_DETAIL_SHARED_DIR_HELPERS_HPP - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> -#include <boost/interprocess/detail/os_file_functions.hpp> -#include <boost/interprocess/errors.hpp> -#include <boost/interprocess/exceptions.hpp> -#include <string> - -#if defined(BOOST_INTERPROCESS_HAS_KERNEL_BOOTTIME) && defined(BOOST_INTERPROCESS_WINDOWS) - #include <boost/interprocess/detail/windows_intermodule_singleton.hpp> -#endif - -namespace boost { -namespace interprocess { -namespace ipcdetail { - -#if defined(BOOST_INTERPROCESS_HAS_KERNEL_BOOTTIME) - #if defined(BOOST_INTERPROCESS_WINDOWS) - //This type will initialize the stamp - struct windows_bootstamp - { - windows_bootstamp() - { - //Throw if bootstamp not available - if(!winapi::get_last_bootup_time(stamp)){ - error_info err = system_error_code(); - throw interprocess_exception(err); - } - } - //Use std::string. Even if this will be constructed in shared memory, all - //modules/dlls are from this process so internal raw pointers to heap are always valid - std::string stamp; - }; - - inline void get_bootstamp(std::string &s, bool add = false) - { - const windows_bootstamp &bootstamp = windows_intermodule_singleton<windows_bootstamp>::get(); - if(add){ - s += bootstamp.stamp; - } - else{ - s = bootstamp.stamp; - } - } - #elif defined(BOOST_INTERPROCESS_HAS_BSD_KERNEL_BOOTTIME) - inline void get_bootstamp(std::string &s, bool add = false) - { - // FreeBSD specific: sysctl "kern.boottime" - int request[2] = { CTL_KERN, KERN_BOOTTIME }; - struct ::timeval result; - std::size_t result_len = sizeof result; - - if (::sysctl (request, 2, &result, &result_len, 0, 0) < 0) - return; - - char bootstamp_str[256]; - - const char Characters [] = - { '0', '1', '2', '3', '4', '5', '6', '7' - , '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; - - std::size_t char_counter = 0; - //32 bit values to allow 32 and 64 bit process IPC - boost::uint32_t fields[2] = { boost::uint32_t(result.tv_sec), boost::uint32_t(result.tv_usec) }; - for(std::size_t field = 0; field != 2; ++field){ - for(std::size_t i = 0; i != sizeof(fields[0]); ++i){ - const char *ptr = (const char *)&fields[field]; - bootstamp_str[char_counter++] = Characters[(ptr[i]&0xF0)>>4]; - bootstamp_str[char_counter++] = Characters[(ptr[i]&0x0F)]; - } - } - bootstamp_str[char_counter] = 0; - if(add){ - s += bootstamp_str; - } - else{ - s = bootstamp_str; - } - } - #else - #error "BOOST_INTERPROCESS_HAS_KERNEL_BOOTTIME defined with no known implementation" - #endif -#endif //#if defined(BOOST_INTERPROCESS_HAS_KERNEL_BOOTTIME) - -inline void get_shared_dir_root(std::string &dir_path) -{ - #if defined (BOOST_INTERPROCESS_WINDOWS) - winapi::get_shared_documents_folder(dir_path); - #else - dir_path = "/tmp"; - #endif - //We always need this path, so throw on error - if(dir_path.empty()){ - error_info err = system_error_code(); - throw interprocess_exception(err); - } - //Remove final null. - dir_path += "/boost_interprocess"; -} - -inline void get_shared_dir(std::string &shared_dir) -{ - #if defined(BOOST_INTERPROCESS_SHARED_DIR_PATH) - shared_dir = BOOST_INTERPROCESS_SHARED_DIR_PATH; - #else - get_shared_dir_root(shared_dir); - #if defined(BOOST_INTERPROCESS_HAS_KERNEL_BOOTTIME) - shared_dir += "/"; - get_bootstamp(shared_dir, true); - #endif - #endif -} - -inline void shared_filepath(const char *filename, std::string &filepath) -{ - get_shared_dir(filepath); - filepath += "/"; - filepath += filename; -} - -inline void create_shared_dir_and_clean_old(std::string &shared_dir) -{ - #if defined(BOOST_INTERPROCESS_SHARED_DIR_PATH) - shared_dir = BOOST_INTERPROCESS_SHARED_DIR_PATH; - #else - //First get the temp directory - std::string root_shared_dir; - get_shared_dir_root(root_shared_dir); - - //If fails, check that it's because already exists - if(!create_directory(root_shared_dir.c_str())){ - error_info info(system_error_code()); - if(info.get_error_code() != already_exists_error){ - throw interprocess_exception(info); - } - } - - #if defined(BOOST_INTERPROCESS_HAS_KERNEL_BOOTTIME) - get_shared_dir(shared_dir); - - //If fails, check that it's because already exists - if(!create_directory(shared_dir.c_str())){ - error_info info(system_error_code()); - if(info.get_error_code() != already_exists_error){ - throw interprocess_exception(info); - } - } - //Now erase all old directories created in the previous boot sessions - std::string subdir = shared_dir; - subdir.erase(0, root_shared_dir.size()+1); - delete_subdirectories(root_shared_dir, subdir.c_str()); - #else - shared_dir = root_shared_dir; - #endif - #endif -} - -inline void create_shared_dir_cleaning_old_and_get_filepath(const char *filename, std::string &shared_dir) -{ - create_shared_dir_and_clean_old(shared_dir); - shared_dir += "/"; - shared_dir += filename; -} - -inline void add_leading_slash(const char *name, std::string &new_name) -{ - if(name[0] != '/'){ - new_name = '/'; - } - new_name += name; -} - -} //namespace boost{ -} //namespace interprocess { -} //namespace ipcdetail { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //ifndef BOOST_INTERPROCESS_DETAIL_SHARED_DIR_HELPERS_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/detail/transform_iterator.hpp b/src/third_party/boost-1.56.0/boost/interprocess/detail/transform_iterator.hpp deleted file mode 100644 index 5496d195685..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/detail/transform_iterator.hpp +++ /dev/null @@ -1,195 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-2012. -// (C) Copyright Gennaro Prota 2003 - 2004. -// -// 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_DETAIL_TRANSFORM_ITERATORS_HPP -#define BOOST_INTERPROCESS_DETAIL_TRANSFORM_ITERATORS_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> - -#include <boost/interprocess/interprocess_fwd.hpp> - -#include <iterator> -#include <boost/interprocess/detail/type_traits.hpp> - -namespace boost { -namespace interprocess { - -template <class PseudoReference> -struct operator_arrow_proxy -{ - operator_arrow_proxy(const PseudoReference &px) - : m_value(px) - {} - - PseudoReference* operator->() const { return &m_value; } - // This function is needed for MWCW and BCC, which won't call operator-> - // again automatically per 13.3.1.2 para 8 -// operator T*() const { return &m_value; } - mutable PseudoReference m_value; -}; - -template <class T> -struct operator_arrow_proxy<T&> -{ - operator_arrow_proxy(T &px) - : m_value(px) - {} - - T* operator->() const { return const_cast<T*>(&m_value); } - // This function is needed for MWCW and BCC, which won't call operator-> - // again automatically per 13.3.1.2 para 8 -// operator T*() const { return &m_value; } - T &m_value; -}; - -template <class Iterator, class UnaryFunction> -class transform_iterator - : public UnaryFunction - , public std::iterator - < typename std::iterator_traits<Iterator>::iterator_category - , typename ipcdetail::remove_reference<typename UnaryFunction::result_type>::type - , typename std::iterator_traits<Iterator>::difference_type - , operator_arrow_proxy<typename UnaryFunction::result_type> - , typename UnaryFunction::result_type> -{ - public: - explicit transform_iterator(const Iterator &it, const UnaryFunction &f = UnaryFunction()) - : UnaryFunction(f), m_it(it) - {} - - explicit transform_iterator() - : UnaryFunction(), m_it() - {} - - //Constructors - transform_iterator& operator++() - { increment(); return *this; } - - transform_iterator operator++(int) - { - transform_iterator result (*this); - increment(); - return result; - } - - transform_iterator& operator--() - { decrement(); return *this; } - - transform_iterator operator--(int) - { - transform_iterator result (*this); - decrement(); - return result; - } - - friend bool operator== (const transform_iterator& i, const transform_iterator& i2) - { return i.equal(i2); } - - friend bool operator!= (const transform_iterator& i, const transform_iterator& i2) - { return !(i == i2); } - - friend bool operator< (const transform_iterator& i, const transform_iterator& i2) - { return i < i2; } - - friend bool operator> (const transform_iterator& i, const transform_iterator& i2) - { return i2 < i; } - - friend bool operator<= (const transform_iterator& i, const transform_iterator& i2) - { return !(i > i2); } - - friend bool operator>= (const transform_iterator& i, const transform_iterator& i2) - { return !(i < i2); } - - friend typename std::iterator_traits<Iterator>::difference_type operator- (const transform_iterator& i, const transform_iterator& i2) - { return i2.distance_to(i); } - - //Arithmetic - transform_iterator& operator+=(typename std::iterator_traits<Iterator>::difference_type off) - { this->advance(off); return *this; } - - transform_iterator operator+(typename std::iterator_traits<Iterator>::difference_type off) const - { - transform_iterator other(*this); - other.advance(off); - return other; - } - - friend transform_iterator operator+(typename std::iterator_traits<Iterator>::difference_type off, const transform_iterator& right) - { return right + off; } - - transform_iterator& operator-=(typename std::iterator_traits<Iterator>::difference_type off) - { this->advance(-off); return *this; } - - transform_iterator operator-(typename std::iterator_traits<Iterator>::difference_type off) const - { return *this + (-off); } - - typename UnaryFunction::result_type operator*() const - { return dereference(); } - - typename UnaryFunction::result_type operator[](typename std::iterator_traits<Iterator>::difference_type off) const - { return UnaryFunction::operator()(m_it[off]); } - - operator_arrow_proxy<typename UnaryFunction::result_type> - operator->() const - { return operator_arrow_proxy<typename UnaryFunction::result_type>(dereference()); } - - Iterator & base() - { return m_it; } - - const Iterator & base() const - { return m_it; } - - private: - Iterator m_it; - - void increment() - { ++m_it; } - - void decrement() - { --m_it; } - - bool equal(const transform_iterator &other) const - { return m_it == other.m_it; } - - bool less(const transform_iterator &other) const - { return other.m_it < m_it; } - - typename UnaryFunction::result_type dereference() const - { return UnaryFunction::operator()(*m_it); } - - void advance(typename std::iterator_traits<Iterator>::difference_type n) - { std::advance(m_it, n); } - - typename std::iterator_traits<Iterator>::difference_type distance_to(const transform_iterator &other)const - { return std::distance(other.m_it, m_it); } -}; - -template <class Iterator, class UnaryFunc> -transform_iterator<Iterator, UnaryFunc> -make_transform_iterator(Iterator it, UnaryFunc fun) -{ - return transform_iterator<Iterator, UnaryFunc>(it, fun); -} - -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //#ifndef BOOST_INTERPROCESS_DETAIL_TRANSFORM_ITERATORS_HPP - diff --git a/src/third_party/boost-1.56.0/boost/interprocess/detail/type_traits.hpp b/src/third_party/boost-1.56.0/boost/interprocess/detail/type_traits.hpp deleted file mode 100644 index e56a495754b..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/detail/type_traits.hpp +++ /dev/null @@ -1,158 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// (C) Copyright John Maddock 2000. -// (C) Copyright Ion Gaztanaga 2005-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_DETAIL_TYPE_TRAITS_HPP -#define BOOST_INTERPROCESS_DETAIL_TYPE_TRAITS_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> - -namespace boost { -namespace interprocess { -namespace ipcdetail { - -struct nat{}; - -template<class T> -struct remove_reference -{ - typedef T type; -}; - -template<class T> -struct remove_reference<T&> -{ - typedef T type; -}; - -template<class T> -struct is_reference -{ - static const bool value = false; -}; - -template<class T> -struct is_reference<T&> -{ - static const bool value = true; -}; - -template<class T> -struct is_pointer -{ - static const bool value = false; -}; - -template<class T> -struct is_pointer<T*> -{ - static const bool value = true; -}; - -template <typename T> -struct add_reference -{ - typedef T& type; -}; - -template<class T> -struct add_reference<T&> -{ - typedef T& type; -}; - -template<> -struct add_reference<void> -{ - typedef nat &type; -}; - -template<> -struct add_reference<const void> -{ - typedef const nat &type; -}; - -template <class T> -struct add_const_reference -{ typedef const T &type; }; - -template <class T> -struct add_const_reference<T&> -{ typedef T& type; }; - -template<class T> -struct remove_const -{ - typedef T type; -}; - -template<class T> -struct remove_const<const T> -{ - typedef T type; -}; - -template<class T> -struct remove_volatile -{ - typedef T type; -}; - -template<class T> -struct remove_volatile<volatile T> -{ - typedef T type; -}; - -template<class T> -struct remove_const_volatile -{ - typedef typename remove_const<typename remove_volatile<T>::type>::type type; -}; - -template <typename T, typename U> -struct is_same -{ - typedef char yes_type; - struct no_type - { - char padding[8]; - }; - - template <typename V> - static yes_type is_same_tester(V*, V*); - static no_type is_same_tester(...); - - static T *t; - static U *u; - - static const bool value = sizeof(yes_type) == sizeof(is_same_tester(t,u)); -}; - -template<class T, class U> -struct is_cv_same -{ - static const bool value = is_same< typename remove_const_volatile<T>::type - , typename remove_const_volatile<U>::type >::value; -}; - -} // namespace ipcdetail -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //#ifndef BOOST_INTERPROCESS_DETAIL_TYPE_TRAITS_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/detail/utilities.hpp b/src/third_party/boost-1.56.0/boost/interprocess/detail/utilities.hpp deleted file mode 100644 index e09f48c1a35..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/detail/utilities.hpp +++ /dev/null @@ -1,220 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-2012. -// (C) Copyright Gennaro Prota 2003 - 2004. -// -// 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_DETAIL_UTILITIES_HPP -#define BOOST_INTERPROCESS_DETAIL_UTILITIES_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> - -#include <boost/interprocess/interprocess_fwd.hpp> -#include <boost/move/move.hpp> -#include <boost/type_traits/has_trivial_destructor.hpp> -#include <boost/interprocess/detail/min_max.hpp> -#include <boost/interprocess/detail/type_traits.hpp> -#include <boost/interprocess/detail/transform_iterator.hpp> -#include <boost/interprocess/detail/mpl.hpp> -#include <boost/interprocess/containers/version_type.hpp> -#include <boost/intrusive/pointer_traits.hpp> -#include <boost/move/move.hpp> -#include <boost/static_assert.hpp> -#include <utility> -#include <algorithm> -#include <climits> - -namespace boost { -namespace interprocess { -namespace ipcdetail { - -template <class T> -inline T* to_raw_pointer(T* p) -{ return p; } - -template <class Pointer> -inline typename boost::intrusive::pointer_traits<Pointer>::element_type* -to_raw_pointer(const Pointer &p) -{ return boost::interprocess::ipcdetail::to_raw_pointer(p.operator->()); } - -//!To avoid ADL problems with swap -template <class T> -inline void do_swap(T& x, T& y) -{ - using std::swap; - swap(x, y); -} - -//Rounds "orig_size" by excess to round_to bytes -template<class SizeType> -inline SizeType get_rounded_size(SizeType orig_size, SizeType round_to) -{ - return ((orig_size-1)/round_to+1)*round_to; -} - -//Truncates "orig_size" to a multiple of "multiple" bytes. -template<class SizeType> -inline SizeType get_truncated_size(SizeType orig_size, SizeType multiple) -{ - return orig_size/multiple*multiple; -} - -//Rounds "orig_size" by excess to round_to bytes. round_to must be power of two -template<class SizeType> -inline SizeType get_rounded_size_po2(SizeType orig_size, SizeType round_to) -{ - return ((orig_size-1)&(~(round_to-1))) + round_to; -} - -//Truncates "orig_size" to a multiple of "multiple" bytes. multiple must be power of two -template<class SizeType> -inline SizeType get_truncated_size_po2(SizeType orig_size, SizeType multiple) -{ - return (orig_size & (~(multiple-1))); -} - -template <std::size_t OrigSize, std::size_t RoundTo> -struct ct_rounded_size -{ - BOOST_STATIC_ASSERT((RoundTo != 0)); - static const std::size_t intermediate_value = (OrigSize-1)/RoundTo+1; - BOOST_STATIC_ASSERT(intermediate_value <= std::size_t(-1)/RoundTo); - static const std::size_t value = intermediate_value*RoundTo; -}; - -// Gennaro Prota wrote this. Thanks! -template <int p, int n = 4> -struct ct_max_pow2_less -{ - static const std::size_t c = 2*n < p; - - static const std::size_t value = - c ? (ct_max_pow2_less< c*p, 2*c*n>::value) : n; -}; - -template <> -struct ct_max_pow2_less<0, 0> -{ - static const std::size_t value = 0; -}; - -} //namespace ipcdetail { - -//!Trait class to detect if an index is a node -//!index. This allows more efficient operations -//!when deallocating named objects. -template <class Index> -struct is_node_index -{ - static const bool value = false; -}; - -//!Trait class to detect if an index is an intrusive -//!index. This will embed the derivation hook in each -//!allocation header, to provide memory for the intrusive -//!container. -template <class Index> -struct is_intrusive_index -{ - static const bool value = false; -}; - -template <typename T> T* -addressof(T& v) -{ - return reinterpret_cast<T*>( - &const_cast<char&>(reinterpret_cast<const volatile char &>(v))); -} - -template<class SizeType> -struct sqrt_size_type_max -{ - static const SizeType value = (SizeType(1) << (sizeof(SizeType)*(CHAR_BIT/2)))-1; -}; - -template<class SizeType> -inline bool multiplication_overflows(SizeType a, SizeType b) -{ - const SizeType sqrt_size_max = sqrt_size_type_max<SizeType>::value; - return //Fast runtime check - ( (a | b) > sqrt_size_max && - //Slow division check - b && a > SizeType(-1)/b - ); -} - -template<std::size_t SztSizeOfType, class SizeType> -inline bool size_overflows(SizeType count) -{ - //Compile time-check - BOOST_STATIC_ASSERT(SztSizeOfType <= SizeType(-1)); - //Runtime check - return multiplication_overflows(SizeType(SztSizeOfType), count); -} - -template<class RawPointer> -class pointer_size_t_caster -{ - public: - BOOST_STATIC_ASSERT(sizeof(std::size_t) == sizeof(void*)); - - explicit pointer_size_t_caster(std::size_t sz) - : m_ptr(reinterpret_cast<RawPointer>(sz)) - {} - - explicit pointer_size_t_caster(RawPointer p) - : m_ptr(p) - {} - - std::size_t size() const - { return reinterpret_cast<std::size_t>(m_ptr); } - - RawPointer pointer() const - { return m_ptr; } - - private: - RawPointer m_ptr; -}; - - -template<class SizeType> -inline bool sum_overflows(SizeType a, SizeType b) -{ return SizeType(-1) - a < b; } - -//Anti-exception node eraser -template<class Cont> -class value_eraser -{ - public: - value_eraser(Cont & cont, typename Cont::iterator it) - : m_cont(cont), m_index_it(it), m_erase(true){} - ~value_eraser() - { if(m_erase) m_cont.erase(m_index_it); } - - void release() { m_erase = false; } - - private: - Cont &m_cont; - typename Cont::iterator m_index_it; - bool m_erase; -}; - -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //#ifndef BOOST_INTERPROCESS_DETAIL_UTILITIES_HPP - diff --git a/src/third_party/boost-1.56.0/boost/interprocess/detail/variadic_templates_tools.hpp b/src/third_party/boost-1.56.0/boost/interprocess/detail/variadic_templates_tools.hpp deleted file mode 100644 index 80154e05d22..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/detail/variadic_templates_tools.hpp +++ /dev/null @@ -1,153 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2008-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_DETAIL_VARIADIC_TEMPLATES_TOOLS_HPP -#define BOOST_INTERPROCESS_DETAIL_VARIADIC_TEMPLATES_TOOLS_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> -#include <boost/interprocess/detail/type_traits.hpp> -#include <cstddef> //std::size_t - -namespace boost { -namespace interprocess { -namespace ipcdetail { - -template<typename... Values> -class tuple; - -template<> class tuple<> -{}; - -template<typename Head, typename... Tail> -class tuple<Head, Tail...> - : private tuple<Tail...> -{ - typedef tuple<Tail...> inherited; - - public: - tuple() { } - - // implicit copy-constructor is okay - // Construct tuple from separate arguments. - tuple(typename add_const_reference<Head>::type v, - typename add_const_reference<Tail>::type... vtail) - : inherited(vtail...), m_head(v) - {} - - // Construct tuple from another tuple. - template<typename... VValues> - tuple(const tuple<VValues...>& other) - : m_head(other.head()), inherited(other.tail()) - {} - - template<typename... VValues> - tuple& operator=(const tuple<VValues...>& other) - { - m_head = other.head(); - tail() = other.tail(); - return this; - } - - typename add_reference<Head>::type head() { return m_head; } - typename add_reference<const Head>::type head() const { return m_head; } - - inherited& tail() { return *this; } - const inherited& tail() const { return *this; } - - protected: - Head m_head; -}; - - -template<typename... Values> -tuple<Values&&...> tie_forward(Values&&... values) -{ return tuple<Values&&...>(values...); } - -template<int I, typename Tuple> -struct tuple_element; - -template<int I, typename Head, typename... Tail> -struct tuple_element<I, tuple<Head, Tail...> > -{ - typedef typename tuple_element<I-1, tuple<Tail...> >::type type; -}; - -template<typename Head, typename... Tail> -struct tuple_element<0, tuple<Head, Tail...> > -{ - typedef Head type; -}; - -template<int I, typename Tuple> -class get_impl; - -template<int I, typename Head, typename... Values> -class get_impl<I, tuple<Head, Values...> > -{ - typedef typename tuple_element<I-1, tuple<Values...> >::type Element; - typedef get_impl<I-1, tuple<Values...> > Next; - - public: - typedef typename add_reference<Element>::type type; - typedef typename add_const_reference<Element>::type const_type; - static type get(tuple<Head, Values...>& t) { return Next::get(t.tail()); } - static const_type get(const tuple<Head, Values...>& t) { return Next::get(t.tail()); } -}; - -template<typename Head, typename... Values> -class get_impl<0, tuple<Head, Values...> > -{ - public: - typedef typename add_reference<Head>::type type; - typedef typename add_const_reference<Head>::type const_type; - static type get(tuple<Head, Values...>& t) { return t.head(); } - static const_type get(const tuple<Head, Values...>& t){ return t.head(); } -}; - -template<int I, typename... Values> -typename get_impl<I, tuple<Values...> >::type get(tuple<Values...>& t) -{ return get_impl<I, tuple<Values...> >::get(t); } - -template<int I, typename... Values> -typename get_impl<I, tuple<Values...> >::const_type get(const tuple<Values...>& t) -{ return get_impl<I, tuple<Values...> >::get(t); } - -//////////////////////////////////////////////////// -// Builds an index_tuple<0, 1, 2, ..., Num-1>, that will -// be used to "unpack" into comma-separated values -// in a function call. -//////////////////////////////////////////////////// - -template<int... Indexes> -struct index_tuple{}; - -template<std::size_t Num, typename Tuple = index_tuple<> > -struct build_number_seq; - -template<std::size_t Num, int... Indexes> -struct build_number_seq<Num, index_tuple<Indexes...> > - : build_number_seq<Num - 1, index_tuple<Indexes..., sizeof...(Indexes)> > -{}; - -template<int... Indexes> -struct build_number_seq<0, index_tuple<Indexes...> > -{ typedef index_tuple<Indexes...> type; }; - - -}}} //namespace boost { namespace interprocess { namespace ipcdetail { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //#ifndef BOOST_INTERPROCESS_DETAIL_VARIADIC_TEMPLATES_TOOLS_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/detail/win32_api.hpp b/src/third_party/boost-1.56.0/boost/interprocess/detail/win32_api.hpp deleted file mode 100644 index 3b4bfb80798..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/detail/win32_api.hpp +++ /dev/null @@ -1,2333 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_WIN32_PRIMITIVES_HPP -#define BOOST_INTERPROCESS_WIN32_PRIMITIVES_HPP - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> -#include <boost/date_time/filetime_functions.hpp> -#include <cstddef> -#include <cstring> -#include <cstdlib> -#include <cstdio> - -#include <boost/assert.hpp> -#include <string> -#include <vector> -#include <memory> - -#ifdef BOOST_USE_WINDOWS_H -#include <windows.h> -#include <Wbemidl.h> -#include <Objbase.h> -#include <Shlobj.h> -#endif - -#if defined(_MSC_VER) -# pragma once -# pragma comment( lib, "Advapi32.lib" ) -# pragma comment( lib, "oleaut32.lib" ) -# pragma comment( lib, "Ole32.lib" ) -# pragma comment( lib, "Psapi.lib" ) -# pragma comment( lib, "Shell32.lib" ) //SHGetSpecialFolderPathA -#endif - -#if defined (BOOST_INTERPROCESS_WINDOWS) -# include <cstdarg> -# include <boost/detail/interlocked.hpp> -#else -# error "This file can only be included in Windows OS" -#endif - -////////////////////////////////////////////////////////////////////////////// -// -// Declaration of Windows structures or typedefs if BOOST_USE_WINDOWS_H is used -// -////////////////////////////////////////////////////////////////////////////// - -namespace boost { -namespace interprocess { -namespace winapi { - -//Own defines -static const unsigned long MaxPath = 260; - -#ifndef BOOST_USE_WINDOWS_H - -struct GUID_BIPC -{ - unsigned long Data1; - unsigned short Data2; - unsigned short Data3; - unsigned char Data4[8]; -}; - -#if defined(_MSC_VER) -#pragma warning (push) -#pragma warning (disable : 4201) // nonstandard extension used -#endif - -struct decimal -{ - unsigned short wReserved; - union { - struct { - unsigned char scale; - unsigned char sign; - }; - unsigned short signscale; - }; - unsigned long Hi32; - union { - struct { - unsigned long Lo32; - unsigned long Mid32; - }; - unsigned __int64 Lo64; - }; -}; - -typedef unsigned short *bstr; - - -struct wchar_variant -{ - union - { - struct - { - unsigned short vt; - unsigned short wReserved1; - unsigned short wReserved2; - unsigned short wReserved3; - union - { - bstr bstrVal; - struct - { - void* pvRecord; - void* pRecInfo; - }; - }; - }; - decimal decVal; - }; -}; - -#if defined(_MSC_VER) -#pragma warning (pop) -#endif - - - - - - - - - - - - - - - - - -struct IUnknown_BIPC -{ - public: - virtual long __stdcall QueryInterface( - const GUID_BIPC &riid, // [in] - void **ppvObject) = 0; // [iid_is][out] - - virtual unsigned long __stdcall AddRef (void) = 0; - virtual unsigned long __stdcall Release(void) = 0; -}; - -struct IWbemClassObject_BIPC : public IUnknown_BIPC -{ - public: - virtual long __stdcall GetQualifierSet( - /* [out] */ void **ppQualSet) = 0; - - virtual long __stdcall Get( - /* [string][in] */ const bstr wszName, - /* [in] */ long lFlags, - /* [unique][in][out] */ wchar_variant *pVal, - /* [unique][in][out] */ long *pType, - /* [unique][in][out] */ long *plFlavor) = 0; - - virtual long __stdcall Put( - /* [string][in] */ const bstr wszName, - /* [in] */ long lFlags, - /* [in] */ wchar_variant *pVal, - /* [in] */ long Type) = 0; - - virtual long __stdcall Delete( - /* [string][in] */ const bstr wszName) = 0; - - virtual long __stdcall GetNames( - /* [string][in] */ const bstr wszQualifierName, - /* [in] */ long lFlags, - /* [in] */ wchar_variant *pQualifierVal, - /* [out] */ void * *pNames) = 0; - - virtual long __stdcall BeginEnumeration( - /* [in] */ long lEnumFlags) = 0; - - virtual long __stdcall Next( - /* [in] */ long lFlags, - /* [unique][in][out] */ bstr *strName, - /* [unique][in][out] */ wchar_variant *pVal, - /* [unique][in][out] */ long *pType, - /* [unique][in][out] */ long *plFlavor) = 0; - - virtual long __stdcall EndEnumeration( void) = 0; - - virtual long __stdcall GetPropertyQualifierSet( - /* [string][in] */ const bstr wszProperty, - /* [out] */ void **ppQualSet) = 0; - - virtual long __stdcall Clone( - /* [out] */ IWbemClassObject_BIPC **ppCopy) = 0; - - virtual long __stdcall GetObjectText( - /* [in] */ long lFlags, - /* [out] */ bstr *pstrObjectText) = 0; - - virtual long __stdcall SpawnDerivedClass( - /* [in] */ long lFlags, - /* [out] */ IWbemClassObject_BIPC **ppNewClass) = 0; - - virtual long __stdcall SpawnInstance( - /* [in] */ long lFlags, - /* [out] */ IWbemClassObject_BIPC **ppNewInstance) = 0; - - virtual long __stdcall CompareTo( - /* [in] */ long lFlags, - /* [in] */ IWbemClassObject_BIPC *pCompareTo) = 0; - - virtual long __stdcall GetPropertyOrigin( - /* [string][in] */ const bstr wszName, - /* [out] */ bstr *pstrClassName) = 0; - - virtual long __stdcall InheritsFrom( - /* [in] */ const bstr strAncestor) = 0; - - virtual long __stdcall GetMethod( - /* [string][in] */ const bstr wszName, - /* [in] */ long lFlags, - /* [out] */ IWbemClassObject_BIPC **ppInSignature, - /* [out] */ IWbemClassObject_BIPC **ppOutSignature) = 0; - - virtual long __stdcall PutMethod( - /* [string][in] */ const bstr wszName, - /* [in] */ long lFlags, - /* [in] */ IWbemClassObject_BIPC *pInSignature, - /* [in] */ IWbemClassObject_BIPC *pOutSignature) = 0; - - virtual long __stdcall DeleteMethod( - /* [string][in] */ const bstr wszName) = 0; - - virtual long __stdcall BeginMethodEnumeration( - /* [in] */ long lEnumFlags) = 0; - - virtual long __stdcall NextMethod( - /* [in] */ long lFlags, - /* [unique][in][out] */ bstr *pstrName, - /* [unique][in][out] */ IWbemClassObject_BIPC **ppInSignature, - /* [unique][in][out] */ IWbemClassObject_BIPC **ppOutSignature) = 0; - - virtual long __stdcall EndMethodEnumeration( void) = 0; - - virtual long __stdcall GetMethodQualifierSet( - /* [string][in] */ const bstr wszMethod, - /* [out] */ void **ppQualSet) = 0; - - virtual long __stdcall GetMethodOrigin( - /* [string][in] */ const bstr wszMethodName, - /* [out] */ bstr *pstrClassName) = 0; - -}; - -struct IWbemContext_BIPC : public IUnknown_BIPC -{ -public: - virtual long __stdcall Clone( - /* [out] */ IWbemContext_BIPC **ppNewCopy) = 0; - - virtual long __stdcall GetNames( - /* [in] */ long lFlags, - /* [out] */ void * *pNames) = 0; - - virtual long __stdcall BeginEnumeration( - /* [in] */ long lFlags) = 0; - - virtual long __stdcall Next( - /* [in] */ long lFlags, - /* [out] */ bstr *pstrName, - /* [out] */ wchar_variant *pValue) = 0; - - virtual long __stdcall EndEnumeration( void) = 0; - - virtual long __stdcall SetValue( - /* [string][in] */ const bstr wszName, - /* [in] */ long lFlags, - /* [in] */ wchar_variant *pValue) = 0; - - virtual long __stdcall GetValue( - /* [string][in] */ const bstr wszName, - /* [in] */ long lFlags, - /* [out] */ wchar_variant *pValue) = 0; - - virtual long __stdcall DeleteValue( - /* [string][in] */ const bstr wszName, - /* [in] */ long lFlags) = 0; - - virtual long __stdcall DeleteAll( void) = 0; - -}; - - -struct IEnumWbemClassObject_BIPC : public IUnknown_BIPC -{ -public: - virtual long __stdcall Reset( void) = 0; - - virtual long __stdcall Next( - /* [in] */ long lTimeout, - /* [in] */ unsigned long uCount, - /* [length_is][size_is][out] */ IWbemClassObject_BIPC **apObjects, - /* [out] */ unsigned long *puReturned) = 0; - - virtual long __stdcall NextAsync( - /* [in] */ unsigned long uCount, - /* [in] */ void *pSink) = 0; - - virtual long __stdcall Clone( - /* [out] */ void **ppEnum) = 0; - - virtual long __stdcall Skip( - /* [in] */ long lTimeout, - /* [in] */ unsigned long nCount) = 0; - -}; - -struct IWbemServices_BIPC : public IUnknown_BIPC -{ -public: - virtual long __stdcall OpenNamespace( - /* [in] */ const bstr strNamespace, - /* [in] */ long lFlags, - /* [in] */ void *pCtx, - /* [unique][in][out] */ void **ppWorkingNamespace, - /* [unique][in][out] */ void **ppResult) = 0; - - virtual long __stdcall CancelAsyncCall( - /* [in] */ void *pSink) = 0; - - virtual long __stdcall QueryObjectSink( - /* [in] */ long lFlags, - /* [out] */ void **ppResponseHandler) = 0; - - virtual long __stdcall GetObject( - /* [in] */ const bstr strObjectPath, - /* [in] */ long lFlags, - /* [in] */ void *pCtx, - /* [unique][in][out] */ void **ppObject, - /* [unique][in][out] */ void **ppCallResult) = 0; - - virtual long __stdcall GetObjectAsync( - /* [in] */ const bstr strObjectPath, - /* [in] */ long lFlags, - /* [in] */ void *pCtx, - /* [in] */ void *pResponseHandler) = 0; - - virtual long __stdcall PutClass( - /* [in] */ IWbemClassObject_BIPC *pObject, - /* [in] */ long lFlags, - /* [in] */ void *pCtx, - /* [unique][in][out] */ void **ppCallResult) = 0; - - virtual long __stdcall PutClassAsync( - /* [in] */ IWbemClassObject_BIPC *pObject, - /* [in] */ long lFlags, - /* [in] */ void *pCtx, - /* [in] */ void *pResponseHandler) = 0; - - virtual long __stdcall DeleteClass( - /* [in] */ const bstr strClass, - /* [in] */ long lFlags, - /* [in] */ void *pCtx, - /* [unique][in][out] */ void **ppCallResult) = 0; - - virtual long __stdcall DeleteClassAsync( - /* [in] */ const bstr strClass, - /* [in] */ long lFlags, - /* [in] */ void *pCtx, - /* [in] */ void *pResponseHandler) = 0; - - virtual long __stdcall CreateClassEnum( - /* [in] */ const bstr strSuperclass, - /* [in] */ long lFlags, - /* [in] */ void *pCtx, - /* [out] */ void **ppEnum) = 0; - - virtual long __stdcall CreateClassEnumAsync( - /* [in] */ const bstr strSuperclass, - /* [in] */ long lFlags, - /* [in] */ void *pCtx, - /* [in] */ void *pResponseHandler) = 0; - - virtual long __stdcall PutInstance( - /* [in] */ void *pInst, - /* [in] */ long lFlags, - /* [in] */ void *pCtx, - /* [unique][in][out] */ void **ppCallResult) = 0; - - virtual long __stdcall PutInstanceAsync( - /* [in] */ void *pInst, - /* [in] */ long lFlags, - /* [in] */ void *pCtx, - /* [in] */ void *pResponseHandler) = 0; - - virtual long __stdcall DeleteInstance( - /* [in] */ const bstr strObjectPath, - /* [in] */ long lFlags, - /* [in] */ void *pCtx, - /* [unique][in][out] */ void **ppCallResult) = 0; - - virtual long __stdcall DeleteInstanceAsync( - /* [in] */ const bstr strObjectPath, - /* [in] */ long lFlags, - /* [in] */ void *pCtx, - /* [in] */ void *pResponseHandler) = 0; - - virtual long __stdcall CreateInstanceEnum( - /* [in] */ const bstr strFilter, - /* [in] */ long lFlags, - /* [in] */ void *pCtx, - /* [out] */ void **ppEnum) = 0; - - virtual long __stdcall CreateInstanceEnumAsync( - /* [in] */ const bstr strFilter, - /* [in] */ long lFlags, - /* [in] */ void *pCtx, - /* [in] */ void *pResponseHandler) = 0; - - virtual long __stdcall ExecQuery( - /* [in] */ const bstr strQueryLanguage, - /* [in] */ const bstr strQuery, - /* [in] */ long lFlags, - /* [in] */ IWbemContext_BIPC *pCtx, - /* [out] */ IEnumWbemClassObject_BIPC **ppEnum) = 0; - - virtual long __stdcall ExecQueryAsync( - /* [in] */ const bstr strQueryLanguage, - /* [in] */ const bstr strQuery, - /* [in] */ long lFlags, - /* [in] */ IWbemContext_BIPC *pCtx, - /* [in] */ void *pResponseHandler) = 0; - - virtual long __stdcall ExecNotificationQuery( - /* [in] */ const bstr strQueryLanguage, - /* [in] */ const bstr strQuery, - /* [in] */ long lFlags, - /* [in] */ IWbemContext_BIPC *pCtx, - /* [out] */ void **ppEnum) = 0; - - virtual long __stdcall ExecNotificationQueryAsync( - /* [in] */ const bstr strQueryLanguage, - /* [in] */ const bstr strQuery, - /* [in] */ long lFlags, - /* [in] */ IWbemContext_BIPC *pCtx, - /* [in] */ void *pResponseHandler) = 0; - - virtual long __stdcall ExecMethod( - /* [in] */ const bstr strObjectPath, - /* [in] */ const bstr strMethodName, - /* [in] */ long lFlags, - /* [in] */ IWbemContext_BIPC *pCtx, - /* [in] */ IWbemClassObject_BIPC *pInParams, - /* [unique][in][out] */ IWbemClassObject_BIPC **ppOutParams, - /* [unique][in][out] */ void **ppCallResult) = 0; - - virtual long __stdcall ExecMethodAsync( - /* [in] */ const bstr strObjectPath, - /* [in] */ const bstr strMethodName, - /* [in] */ long lFlags, - /* [in] */ IWbemContext_BIPC *pCtx, - /* [in] */ IWbemClassObject_BIPC *pInParams, - /* [in] */ void *pResponseHandler) = 0; - -}; - -struct IWbemLocator_BIPC : public IUnknown_BIPC -{ -public: - virtual long __stdcall ConnectServer( - /* [in] */ const bstr strNetworkResource, - /* [in] */ const bstr strUser, - /* [in] */ const bstr strPassword, - /* [in] */ const bstr strLocale, - /* [in] */ long lSecurityFlags, - /* [in] */ const bstr strAuthority, - /* [in] */ void *pCtx, - /* [out] */ IWbemServices_BIPC **ppNamespace) = 0; - -}; - -struct interprocess_overlapped -{ - unsigned long *internal; - unsigned long *internal_high; - union { - struct { - unsigned long offset; - unsigned long offset_high; - }dummy; - void *pointer; - }; - - void *h_event; -}; - - -struct interprocess_filetime -{ - unsigned long dwLowDateTime; - unsigned long dwHighDateTime; -}; - -struct win32_find_data -{ - unsigned long dwFileAttributes; - interprocess_filetime ftCreationTime; - interprocess_filetime ftLastAccessTime; - interprocess_filetime ftLastWriteTime; - unsigned long nFileSizeHigh; - unsigned long nFileSizeLow; - unsigned long dwReserved0; - unsigned long dwReserved1; - char cFileName[MaxPath]; - char cAlternateFileName[14]; -}; - -struct interprocess_security_attributes -{ - unsigned long nLength; - void *lpSecurityDescriptor; - int bInheritHandle; -}; - -struct system_info { - union { - unsigned long dwOemId; // Obsolete field...do not use - struct { - unsigned short wProcessorArchitecture; - unsigned short wReserved; - } dummy; - }; - unsigned long dwPageSize; - void * lpMinimumApplicationAddress; - void * lpMaximumApplicationAddress; - unsigned long * dwActiveProcessorMask; - unsigned long dwNumberOfProcessors; - unsigned long dwProcessorType; - unsigned long dwAllocationGranularity; - unsigned short wProcessorLevel; - unsigned short wProcessorRevision; -}; - -struct interprocess_acl -{ - unsigned char AclRevision; - unsigned char Sbz1; - unsigned short AclSize; - unsigned short AceCount; - unsigned short Sbz2; -}; - -struct interprocess_security_descriptor -{ - unsigned char Revision; - unsigned char Sbz1; - unsigned short Control; - void *Owner; - void *Group; - interprocess_acl *Sacl; - interprocess_acl *Dacl; -}; - -struct interprocess_by_handle_file_information -{ - unsigned long dwFileAttributes; - interprocess_filetime ftCreationTime; - interprocess_filetime ftLastAccessTime; - interprocess_filetime ftLastWriteTime; - unsigned long dwVolumeSerialNumber; - unsigned long nFileSizeHigh; - unsigned long nFileSizeLow; - unsigned long nNumberOfLinks; - unsigned long nFileIndexHigh; - unsigned long nFileIndexLow; -}; - -struct interprocess_eventlogrecord -{ - unsigned long Length; // Length of full record - unsigned long Reserved; // Used by the service - unsigned long RecordNumber; // Absolute record number - unsigned long TimeGenerated; // Seconds since 1-1-1970 - unsigned long TimeWritten; // Seconds since 1-1-1970 - unsigned long EventID; - unsigned short EventType; - unsigned short NumStrings; - unsigned short EventCategory; - unsigned short ReservedFlags; // For use with paired events (auditing) - unsigned long ClosingRecordNumber; // For use with paired events (auditing) - unsigned long StringOffset; // Offset from beginning of record - unsigned long UserSidLength; - unsigned long UserSidOffset; - unsigned long DataLength; - unsigned long DataOffset; // Offset from beginning of record - // - // Then follow: - // - // wchar_t SourceName[] - // wchar_t Computername[] - // SID UserSid - // wchar_t Strings[] - // BYTE Data[] - // CHAR Pad[] - // unsigned long Length; - // -}; - -union large_integer -{ - __int64 QuadPart; -}; - -struct hinstance_struct { int unused; }; -typedef hinstance_struct *hmodule; - -struct hkey_struct; -typedef hkey_struct *hkey; - -#ifdef _WIN64 -typedef __int64 (__stdcall *farproc_t)(); -#else -typedef int (__stdcall *farproc_t)(); -#endif // _WIN64 - -#else //#ifndef BOOST_USE_WINDOWS_H - -typedef GUID GUID_BIPC; -typedef VARIANT wchar_variant; - -typedef IUnknown IUnknown_BIPC; - -typedef IWbemClassObject IWbemClassObject_BIPC; - -typedef IWbemContext IWbemContext_BIPC; - -typedef IEnumWbemClassObject IEnumWbemClassObject_BIPC; - -typedef IWbemServices IWbemServices_BIPC; - -typedef IWbemLocator IWbemLocator_BIPC; - -typedef OVERLAPPED interprocess_overlapped; - -typedef FILETIME interprocess_filetime; - -typedef WIN32_FIND_DATA win32_find_data; - -typedef SECURITY_ATTRIBUTES interprocess_security_attributes; - -typedef SYSTEM_INFO system_info; - -typedef ACL interprocess_acl; - -typedef SECURITY_DESCRIPTOR interprocess_security_descriptor; - -typedef BY_HANDLE_FILE_INFORMATION interprocess_by_handle_file_information; - -typedef EVENTLOGRECORD interprocess_eventlogrecord; - -typedef LARGE_INTEGER large_integer; - -typedef HMODULE hmodule; - -typedef HKEY hkey; - -typedef BSTR bstr; - -typedef FARPROC farproc_t; - -#endif //#ifndef BOOST_USE_WINDOWS_H - -////////////////////////////////////////////////////////////////////////////// -// -// Nt native structures -// -////////////////////////////////////////////////////////////////////////////// - -struct interprocess_semaphore_basic_information -{ - unsigned int count; // current semaphore count - unsigned int limit; // max semaphore count -}; - -struct interprocess_section_basic_information -{ - void * base_address; - unsigned long section_attributes; - __int64 section_size; -}; - -struct file_rename_information_t { - int Replace; - void *RootDir; - unsigned long FileNameLength; - wchar_t FileName[1]; -}; - -struct unicode_string_t { - unsigned short Length; - unsigned short MaximumLength; - wchar_t *Buffer; -}; - -struct object_attributes_t { - unsigned long Length; - void * RootDirectory; - unicode_string_t *ObjectName; - unsigned long Attributes; - void *SecurityDescriptor; - void *SecurityQualityOfService; -}; - -struct io_status_block_t { - union { - long Status; - void *Pointer; - }; - - unsigned long *Information; -}; - -union system_timeofday_information -{ - struct data_t - { - __int64 liKeBootTime; - __int64 liKeSystemTime; - __int64 liExpTimeZoneBias; - unsigned long uCurrentTimeZoneId; - unsigned long dwReserved; - unsigned __int64 ullBootTimeBias; - unsigned __int64 ullSleepTimeBias; - } data; - unsigned char Reserved1[sizeof(data_t)]; -}; - -static const long BootstampLength = sizeof(__int64); -static const long BootAndSystemstampLength = sizeof(__int64)*2; -static const long SystemTimeOfDayInfoLength = sizeof(system_timeofday_information::data_t); - -struct object_name_information_t -{ - unicode_string_t Name; - wchar_t NameBuffer[1]; -}; - -enum file_information_class_t { - file_directory_information = 1, - file_full_directory_information, - file_both_directory_information, - file_basic_information, - file_standard_information, - file_internal_information, - file_ea_information, - file_access_information, - file_name_information, - file_rename_information, - file_link_information, - file_names_information, - file_disposition_information, - file_position_information, - file_full_ea_information, - file_mode_information, - file_alignment_information, - file_all_information, - file_allocation_information, - file_end_of_file_information, - file_alternate_name_information, - file_stream_information, - file_pipe_information, - file_pipe_local_information, - file_pipe_remote_information, - file_mailslot_query_information, - file_mailslot_set_information, - file_compression_information, - file_copy_on_write_information, - file_completion_information, - file_move_cluster_information, - file_quota_information, - file_reparse_point_information, - file_network_open_information, - file_object_id_information, - file_tracking_information, - file_ole_directory_information, - file_content_index_information, - file_inherit_content_index_information, - file_ole_information, - file_maximum_information -}; - -enum semaphore_information_class { - semaphore_basic_information = 0 -}; - - -enum system_information_class { - system_basic_information = 0, - system_performance_information = 2, - system_time_of_day_information = 3, - system_process_information = 5, - system_processor_performance_information = 8, - system_interrupt_information = 23, - system_exception_information = 33, - system_registry_quota_information = 37, - system_lookaside_information = 45 -}; - -enum object_information_class -{ - object_basic_information, - object_name_information, - object_type_information, - object_all_information, - object_data_information -}; - -enum section_information_class -{ - section_basic_information, - section_image_information -}; - -////////////////////////////////////////////////////////////////////////////// -// -// Forward declaration of winapi -// -////////////////////////////////////////////////////////////////////////////// - -#ifndef BOOST_USE_WINDOWS_H - -//Kernel32.dll - -//Some windows API declarations -extern "C" __declspec(dllimport) unsigned long __stdcall GetCurrentProcessId(); -extern "C" __declspec(dllimport) unsigned long __stdcall GetCurrentThreadId(); -extern "C" __declspec(dllimport) int __stdcall GetProcessTimes - ( void *hProcess, interprocess_filetime* lpCreationTime - , interprocess_filetime *lpExitTime,interprocess_filetime *lpKernelTime - , interprocess_filetime *lpUserTime ); -extern "C" __declspec(dllimport) void __stdcall Sleep(unsigned long); -extern "C" __declspec(dllimport) unsigned long __stdcall GetTickCount(void); -extern "C" __declspec(dllimport) int __stdcall SwitchToThread(); -extern "C" __declspec(dllimport) unsigned long __stdcall GetLastError(); -extern "C" __declspec(dllimport) void __stdcall SetLastError(unsigned long); -extern "C" __declspec(dllimport) void * __stdcall GetCurrentProcess(); -extern "C" __declspec(dllimport) int __stdcall CloseHandle(void*); -extern "C" __declspec(dllimport) int __stdcall DuplicateHandle - ( void *hSourceProcessHandle, void *hSourceHandle - , void *hTargetProcessHandle, void **lpTargetHandle - , unsigned long dwDesiredAccess, int bInheritHandle - , unsigned long dwOptions); -extern "C" __declspec(dllimport) long __stdcall GetFileType(void *hFile); -extern "C" __declspec(dllimport) void *__stdcall FindFirstFileA(const char *lpFileName, win32_find_data *lpFindFileData); -extern "C" __declspec(dllimport) int __stdcall FindNextFileA(void *hFindFile, win32_find_data *lpFindFileData); -extern "C" __declspec(dllimport) int __stdcall FindClose(void *hFindFile); -//extern "C" __declspec(dllimport) void __stdcall GetSystemTimeAsFileTime(interprocess_filetime*); -//extern "C" __declspec(dllimport) int __stdcall FileTimeToLocalFileTime(const interprocess_filetime *in, const interprocess_filetime *out); -extern "C" __declspec(dllimport) void * __stdcall CreateMutexA(interprocess_security_attributes*, int, const char *); -extern "C" __declspec(dllimport) void * __stdcall OpenMutexA(unsigned long, int, const char *); -extern "C" __declspec(dllimport) unsigned long __stdcall WaitForSingleObject(void *, unsigned long); -extern "C" __declspec(dllimport) int __stdcall ReleaseMutex(void *); -extern "C" __declspec(dllimport) int __stdcall UnmapViewOfFile(void *); -extern "C" __declspec(dllimport) void * __stdcall CreateSemaphoreA(interprocess_security_attributes*, long, long, const char *); -extern "C" __declspec(dllimport) int __stdcall ReleaseSemaphore(void *, long, long *); -extern "C" __declspec(dllimport) void * __stdcall OpenSemaphoreA(unsigned long, int, const char *); -extern "C" __declspec(dllimport) void * __stdcall CreateFileMappingA (void *, interprocess_security_attributes*, unsigned long, unsigned long, unsigned long, const char *); -extern "C" __declspec(dllimport) void * __stdcall MapViewOfFileEx (void *, unsigned long, unsigned long, unsigned long, std::size_t, void*); -extern "C" __declspec(dllimport) void * __stdcall OpenFileMappingA (unsigned long, int, const char *); -extern "C" __declspec(dllimport) void * __stdcall CreateFileA (const char *, unsigned long, unsigned long, struct interprocess_security_attributes*, unsigned long, unsigned long, void *); -extern "C" __declspec(dllimport) void __stdcall GetSystemInfo (struct system_info *); -extern "C" __declspec(dllimport) int __stdcall FlushViewOfFile (void *, std::size_t); -extern "C" __declspec(dllimport) int __stdcall VirtualUnlock (void *, std::size_t); -extern "C" __declspec(dllimport) int __stdcall VirtualProtect (void *, std::size_t, unsigned long, unsigned long *); -extern "C" __declspec(dllimport) int __stdcall FlushFileBuffers (void *); -extern "C" __declspec(dllimport) int __stdcall GetFileSizeEx (void *, large_integer *size); -extern "C" __declspec(dllimport) unsigned long __stdcall FormatMessageA - (unsigned long dwFlags, const void *lpSource, unsigned long dwMessageId, - unsigned long dwLanguageId, char *lpBuffer, unsigned long nSize, - std::va_list *Arguments); -extern "C" __declspec(dllimport) void *__stdcall LocalFree (void *); -extern "C" __declspec(dllimport) unsigned long __stdcall GetFileAttributesA(const char *); -extern "C" __declspec(dllimport) int __stdcall CreateDirectoryA(const char *, interprocess_security_attributes*); -extern "C" __declspec(dllimport) int __stdcall RemoveDirectoryA(const char *lpPathName); -extern "C" __declspec(dllimport) int __stdcall GetTempPathA(unsigned long length, char *buffer); -extern "C" __declspec(dllimport) int __stdcall CreateDirectory(const char *, interprocess_security_attributes*); -extern "C" __declspec(dllimport) int __stdcall SetFileValidData(void *, __int64 size); -extern "C" __declspec(dllimport) int __stdcall SetEndOfFile(void *); -extern "C" __declspec(dllimport) int __stdcall SetFilePointerEx(void *, large_integer distance, large_integer *new_file_pointer, unsigned long move_method); -extern "C" __declspec(dllimport) int __stdcall LockFile (void *hnd, unsigned long offset_low, unsigned long offset_high, unsigned long size_low, unsigned long size_high); -extern "C" __declspec(dllimport) int __stdcall UnlockFile(void *hnd, unsigned long offset_low, unsigned long offset_high, unsigned long size_low, unsigned long size_high); -extern "C" __declspec(dllimport) int __stdcall LockFileEx(void *hnd, unsigned long flags, unsigned long reserved, unsigned long size_low, unsigned long size_high, interprocess_overlapped* overlapped); -extern "C" __declspec(dllimport) int __stdcall UnlockFileEx(void *hnd, unsigned long reserved, unsigned long size_low, unsigned long size_high, interprocess_overlapped* overlapped); -extern "C" __declspec(dllimport) int __stdcall WriteFile(void *hnd, const void *buffer, unsigned long bytes_to_write, unsigned long *bytes_written, interprocess_overlapped* overlapped); -extern "C" __declspec(dllimport) int __stdcall ReadFile(void *hnd, void *buffer, unsigned long bytes_to_read, unsigned long *bytes_read, interprocess_overlapped* overlapped); -extern "C" __declspec(dllimport) int __stdcall InitializeSecurityDescriptor(interprocess_security_descriptor *pSecurityDescriptor, unsigned long dwRevision); -extern "C" __declspec(dllimport) int __stdcall SetSecurityDescriptorDacl(interprocess_security_descriptor *pSecurityDescriptor, int bDaclPresent, interprocess_acl *pDacl, int bDaclDefaulted); -extern "C" __declspec(dllimport) hmodule __stdcall LoadLibraryA(const char *); -extern "C" __declspec(dllimport) int __stdcall FreeLibrary(hmodule); -extern "C" __declspec(dllimport) farproc_t __stdcall GetProcAddress(void *, const char*); -extern "C" __declspec(dllimport) hmodule __stdcall GetModuleHandleA(const char*); -extern "C" __declspec(dllimport) void *__stdcall GetFileInformationByHandle(void *, interprocess_by_handle_file_information*); - -//Advapi32.dll -extern "C" __declspec(dllimport) long __stdcall RegOpenKeyExA(hkey, const char *, unsigned long, unsigned long, hkey*); -extern "C" __declspec(dllimport) long __stdcall RegQueryValueExA(hkey, const char *, unsigned long*, unsigned long*, unsigned char *, unsigned long*); -extern "C" __declspec(dllimport) long __stdcall RegCloseKey(hkey); - -//Ole32.dll -extern "C" __declspec(dllimport) long __stdcall CoInitializeEx(void *pvReserved, unsigned long dwCoInit); -extern "C" __declspec(dllimport) long __stdcall CoInitializeSecurity( - void* pSecDesc, - long cAuthSvc, - void * asAuthSvc, - void *pReserved1, - unsigned long dwAuthnLevel, - unsigned long dwImpLevel, - void *pAuthList, - unsigned long dwCapabilities, - void *pReserved3 ); - - extern "C" __declspec(dllimport) long __stdcall CoSetProxyBlanket( - IUnknown_BIPC *pProxy, - unsigned long dwAuthnSvc, - unsigned long dwAuthzSvc, - wchar_t *pServerPrincName, - unsigned long dwAuthnLevel, - unsigned long dwImpLevel, - void *pAuthInfo, - unsigned long dwCapabilities); -extern "C" __declspec(dllimport) long __stdcall CoCreateInstance(const GUID_BIPC & rclsid, IUnknown_BIPC *pUnkOuter, - unsigned long dwClsContext, const GUID_BIPC & riid, void** ppv); -extern "C" __declspec(dllimport) void __stdcall CoUninitialize(void); - -//OleAut32.dll -extern "C" __declspec(dllimport) long __stdcall VariantClear(wchar_variant * pvarg); - -//Shell32.dll -extern "C" __declspec(dllimport) int __stdcall SHGetSpecialFolderPathA - (void* hwnd, const char *pszPath, int csidl, int fCreate); - -extern "C" __declspec(dllimport) int __stdcall SHGetFolderPathA(void *hwnd, int csidl, void *hToken, unsigned long dwFlags, const char *pszPath); - -//EventLog access functions - -extern "C" __declspec(dllimport) void* __stdcall OpenEventLogA - (const char* lpUNCServerName, const char* lpSourceName); - -extern "C" __declspec(dllimport) int __stdcall CloseEventLog(void *hEventLog); - -extern "C" __declspec(dllimport) int __stdcall ReadEventLogA - (void *hEventLog, - unsigned long dwReadFlags, - unsigned long dwRecordOffset, - void *lpBuffer, - unsigned long nNumberOfBytesToRead, - unsigned long *pnBytesRead, - unsigned long *pnMinNumberOfBytesNeeded - ); - -#endif //#ifndef BOOST_USE_WINDOWS_H - -//kernel32.dll -typedef int (__stdcall *QueryPerformanceCounter_t) (__int64 *lpPerformanceCount); -typedef int (__stdcall *QueryPerformanceFrequency_t)(__int64 *lpFrequency); - -//ntdll.dll -typedef long (__stdcall *NtDeleteFile_t)(object_attributes_t *ObjectAttributes); -typedef long (__stdcall *NtSetInformationFile_t)(void *FileHandle, io_status_block_t *IoStatusBlock, void *FileInformation, unsigned long Length, int FileInformationClass ); -typedef long (__stdcall *NtOpenFile)(void **FileHandle, unsigned long DesiredAccess, object_attributes_t *ObjectAttributes - , io_status_block_t *IoStatusBlock, unsigned long ShareAccess, unsigned long Length, unsigned long OpenOptions); -typedef long (__stdcall *NtQuerySystemInformation_t)(int, void*, unsigned long, unsigned long *); -typedef long (__stdcall *NtQueryObject_t)(void*, object_information_class, void *, unsigned long, unsigned long *); -typedef long (__stdcall *NtQuerySemaphore_t)(void*, unsigned int info_class, interprocess_semaphore_basic_information *pinfo, unsigned int info_size, unsigned int *ret_len); -typedef long (__stdcall *NtQuerySection_t)(void*, section_information_class, interprocess_section_basic_information *pinfo, unsigned long info_size, unsigned long *ret_len); -typedef long (__stdcall *NtQueryInformationFile_t)(void *,io_status_block_t *,void *, long, int); -typedef long (__stdcall *NtOpenFile_t)(void*,unsigned long ,object_attributes_t*,io_status_block_t*,unsigned long,unsigned long); -typedef long (__stdcall *NtClose_t) (void*); -typedef long (__stdcall *NtQueryTimerResolution_t) (unsigned long* LowestResolution, unsigned long* HighestResolution, unsigned long* CurrentResolution); -typedef long (__stdcall *NtSetTimerResolution_t) (unsigned long RequestedResolution, int Set, unsigned long* ActualResolution); - -} //namespace winapi { -} //namespace interprocess { -} //namespace boost { - -////////////////////////////////////////////////////////////////////////////// -// -// Forward declaration of constants -// -////////////////////////////////////////////////////////////////////////////// - -namespace boost { -namespace interprocess { -namespace winapi { - -//Some used constants -static const unsigned long infinite_time = 0xFFFFFFFF; -static const unsigned long error_already_exists = 183L; -static const unsigned long error_invalid_handle = 6L; -static const unsigned long error_sharing_violation = 32L; -static const unsigned long error_file_not_found = 2u; -static const unsigned long error_no_more_files = 18u; -static const unsigned long error_not_locked = 158L; -//Retries in CreateFile, see http://support.microsoft.com/kb/316609 -static const unsigned long error_sharing_violation_tries = 3L; -static const unsigned long error_sharing_violation_sleep_ms = 250L; -static const unsigned long error_file_too_large = 223L; -static const unsigned long error_insufficient_buffer = 122L; -static const unsigned long error_handle_eof = 38L; -static const unsigned long semaphore_all_access = (0x000F0000L)|(0x00100000L)|0x3; -static const unsigned long mutex_all_access = (0x000F0000L)|(0x00100000L)|0x0001; - -static const unsigned long page_readonly = 0x02; -static const unsigned long page_readwrite = 0x04; -static const unsigned long page_writecopy = 0x08; -static const unsigned long page_noaccess = 0x01; - -static const unsigned long standard_rights_required = 0x000F0000L; -static const unsigned long section_query = 0x0001; -static const unsigned long section_map_write = 0x0002; -static const unsigned long section_map_read = 0x0004; -static const unsigned long section_map_execute = 0x0008; -static const unsigned long section_extend_size = 0x0010; -static const unsigned long section_all_access = standard_rights_required | - section_query | - section_map_write | - section_map_read | - section_map_execute | - section_extend_size; - -static const unsigned long file_map_copy = section_query; -static const unsigned long file_map_write = section_map_write; -static const unsigned long file_map_read = section_map_read; -static const unsigned long file_map_all_access = section_all_access; -static const unsigned long delete_access = 0x00010000L; -static const unsigned long file_flag_backup_semantics = 0x02000000; -static const long file_flag_delete_on_close = 0x04000000; - -//Native API constants -static const unsigned long file_open_for_backup_intent = 0x00004000; -static const int file_share_valid_flags = 0x00000007; -static const long file_delete_on_close = 0x00001000L; -static const long obj_case_insensitive = 0x00000040L; -static const long delete_flag = 0x00010000L; - -static const unsigned long movefile_copy_allowed = 0x02; -static const unsigned long movefile_delay_until_reboot = 0x04; -static const unsigned long movefile_replace_existing = 0x01; -static const unsigned long movefile_write_through = 0x08; -static const unsigned long movefile_create_hardlink = 0x10; -static const unsigned long movefile_fail_if_not_trackable = 0x20; - -static const unsigned long file_share_read = 0x00000001; -static const unsigned long file_share_write = 0x00000002; -static const unsigned long file_share_delete = 0x00000004; - -static const unsigned long file_attribute_readonly = 0x00000001; -static const unsigned long file_attribute_hidden = 0x00000002; -static const unsigned long file_attribute_system = 0x00000004; -static const unsigned long file_attribute_directory = 0x00000010; -static const unsigned long file_attribute_archive = 0x00000020; -static const unsigned long file_attribute_device = 0x00000040; -static const unsigned long file_attribute_normal = 0x00000080; -static const unsigned long file_attribute_temporary = 0x00000100; - -static const unsigned long generic_read = 0x80000000L; -static const unsigned long generic_write = 0x40000000L; - -static const unsigned long wait_object_0 = 0; -static const unsigned long wait_abandoned = 0x00000080L; -static const unsigned long wait_timeout = 258L; -static const unsigned long wait_failed = (unsigned long)0xFFFFFFFF; - -static const unsigned long duplicate_close_source = (unsigned long)0x00000001; -static const unsigned long duplicate_same_access = (unsigned long)0x00000002; - -static const unsigned long format_message_allocate_buffer - = (unsigned long)0x00000100; -static const unsigned long format_message_ignore_inserts - = (unsigned long)0x00000200; -static const unsigned long format_message_from_string - = (unsigned long)0x00000400; -static const unsigned long format_message_from_hmodule - = (unsigned long)0x00000800; -static const unsigned long format_message_from_system - = (unsigned long)0x00001000; -static const unsigned long format_message_argument_array - = (unsigned long)0x00002000; -static const unsigned long format_message_max_width_mask - = (unsigned long)0x000000FF; -static const unsigned long lang_neutral = (unsigned long)0x00; -static const unsigned long sublang_default = (unsigned long)0x01; -static const unsigned long invalid_file_size = (unsigned long)0xFFFFFFFF; -static const unsigned long invalid_file_attributes = ((unsigned long)-1); -static void * const invalid_handle_value = ((void*)(long)(-1)); - -static const unsigned long file_type_char = 0x0002L; -static const unsigned long file_type_disk = 0x0001L; -static const unsigned long file_type_pipe = 0x0003L; -static const unsigned long file_type_remote = 0x8000L; -static const unsigned long file_type_unknown = 0x0000L; - -static const unsigned long create_new = 1; -static const unsigned long create_always = 2; -static const unsigned long open_existing = 3; -static const unsigned long open_always = 4; -static const unsigned long truncate_existing = 5; - -static const unsigned long file_begin = 0; -static const unsigned long file_current = 1; -static const unsigned long file_end = 2; - -static const unsigned long lockfile_fail_immediately = 1; -static const unsigned long lockfile_exclusive_lock = 2; -static const unsigned long error_lock_violation = 33; -static const unsigned long security_descriptor_revision = 1; - -const unsigned long max_record_buffer_size = 0x10000L; // 64K -const unsigned long max_path = 260; - -//Keys -static const hkey hkey_local_machine = (hkey)(unsigned long*)(long)(0x80000002); -static unsigned long key_query_value = 0x0001; - -//COM API -const unsigned long RPC_C_AUTHN_LEVEL_PKT_BIPC = 4; -const unsigned long RPC_C_AUTHN_DEFAULT_BIPC = 0xffffffffL; -const unsigned long RPC_C_AUTHZ_DEFAULT_BIPC = 0xffffffffL; -const unsigned long RPC_C_IMP_LEVEL_IMPERSONATE_BIPC = 3; -const signed long EOAC_NONE_BIPC = 0; -const signed long CLSCTX_INPROC_SERVER_BIPC = 0x1; -const signed long CLSCTX_LOCAL_SERVER_BIPC = 0x4; -const signed long WBEM_FLAG_RETURN_IMMEDIATELY_BIPC = 0x10; -const signed long WBEM_FLAG_RETURN_WHEN_COMPLETE_BIPC = 0x0; -const signed long WBEM_FLAG_FORWARD_ONLY_BIPC = 0x20; -const signed long WBEM_INFINITE_BIPC = 0xffffffffL; -const signed long RPC_E_TOO_LATE_BIPC = 0x80010119L; -const signed long S_OK_BIPC = 0L; -const signed long S_FALSE_BIPC = 1; -const signed long RPC_E_CHANGED_MODE_BIPC = 0x80010106L; -const unsigned long COINIT_APARTMENTTHREADED_BIPC = 0x2; -const unsigned long COINIT_MULTITHREADED_BIPC = 0x0; -const unsigned long COINIT_DISABLE_OLE1DDE_BIPC = 0x4; -const unsigned long COINIT_SPEED_OVER_MEMORY_BIPC = 0x4; - - -//If the user needs to change default COM initialization model, -//it can define BOOST_INTERPROCESS_WINDOWS_COINIT_MODEL to one of these: -// -// COINIT_APARTMENTTHREADED_BIPC -// COINIT_MULTITHREADED_BIPC -// COINIT_DISABLE_OLE1DDE_BIPC -// COINIT_SPEED_OVER_MEMORY_BIPC -#if !defined(BOOST_INTERPROCESS_WINDOWS_COINIT_MODEL) - #define BOOST_INTERPROCESS_WINDOWS_COINIT_MODEL COINIT_APARTMENTTHREADED_BIPC -#elif (BOOST_INTERPROCESS_WINDOWS_COINIT_MODEL != COINIT_APARTMENTTHREADED_BIPC) &&\ - (BOOST_INTERPROCESS_WINDOWS_COINIT_MODEL != COINIT_MULTITHREADED_BIPC) &&\ - (BOOST_INTERPROCESS_WINDOWS_COINIT_MODEL != COINIT_DISABLE_OLE1DDE_BIPC) &&\ - (BOOST_INTERPROCESS_WINDOWS_COINIT_MODEL != COINIT_SPEED_OVER_MEMORY_BIPC) - #error "Wrong value for BOOST_INTERPROCESS_WINDOWS_COINIT_MODEL macro" -#endif - -const GUID_BIPC CLSID_WbemAdministrativeLocator = - { 0xcb8555cc, 0x9128, 0x11d1, {0xad, 0x9b, 0x00, 0xc0, 0x4f, 0xd8, 0xfd, 0xff}}; - -const GUID_BIPC IID_IUnknown = { 0x00000000, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}; - -static const unsigned long eventlog_sequential_read = 0x0001; -static const unsigned long eventlog_backwards_read = 0x0008; - -} //namespace winapi { -} //namespace interprocess { -} //namespace boost { - - -namespace boost { -namespace interprocess { -namespace winapi { - -inline unsigned long get_last_error() -{ return GetLastError(); } - -inline void set_last_error(unsigned long err) -{ return SetLastError(err); } - -inline unsigned long format_message - (unsigned long dwFlags, const void *lpSource, - unsigned long dwMessageId, unsigned long dwLanguageId, - char *lpBuffer, unsigned long nSize, std::va_list *Arguments) -{ - return FormatMessageA - (dwFlags, lpSource, dwMessageId, dwLanguageId, lpBuffer, nSize, Arguments); -} - -//And now, wrapper functions -inline void * local_free(void *hmem) -{ return LocalFree(hmem); } - -inline unsigned long make_lang_id(unsigned long p, unsigned long s) -{ return ((((unsigned short)(s)) << 10) | (unsigned short)(p)); } - -inline void sched_yield() -{ - if(!SwitchToThread()){ - Sleep(0); - } -} - -inline void sleep_tick() -{ Sleep(1); } - -inline void sleep(unsigned long ms) -{ Sleep(ms); } - -inline unsigned long get_current_thread_id() -{ return GetCurrentThreadId(); } - -inline bool get_process_times - ( void *hProcess, interprocess_filetime* lpCreationTime - , interprocess_filetime *lpExitTime, interprocess_filetime *lpKernelTime - , interprocess_filetime *lpUserTime ) -{ return 0 != GetProcessTimes(hProcess, lpCreationTime, lpExitTime, lpKernelTime, lpUserTime); } - -inline unsigned long get_current_process_id() -{ return GetCurrentProcessId(); } - -inline unsigned int close_handle(void* handle) -{ return CloseHandle(handle); } - -inline void * find_first_file(const char *lpFileName, win32_find_data *lpFindFileData) -{ return FindFirstFileA(lpFileName, lpFindFileData); } - -inline bool find_next_file(void *hFindFile, win32_find_data *lpFindFileData) -{ return FindNextFileA(hFindFile, lpFindFileData) != 0; } - -inline bool find_close(void *handle) -{ return FindClose(handle) != 0; } - -inline bool duplicate_current_process_handle - (void *hSourceHandle, void **lpTargetHandle) -{ - return 0 != DuplicateHandle - ( GetCurrentProcess(), hSourceHandle, GetCurrentProcess() - , lpTargetHandle, 0, 0 - , duplicate_same_access); -} - -inline unsigned long get_file_type(void *hFile) -{ - return GetFileType(hFile); -} - -/* -inline void get_system_time_as_file_time(interprocess_filetime *filetime) -{ GetSystemTimeAsFileTime(filetime); } - -inline bool file_time_to_local_file_time - (const interprocess_filetime *in, const interprocess_filetime *out) -{ return 0 != FileTimeToLocalFileTime(in, out); } -*/ -inline void *open_or_create_mutex(const char *name, bool initial_owner, interprocess_security_attributes *attr) -{ return CreateMutexA(attr, (int)initial_owner, name); } - -inline unsigned long wait_for_single_object(void *handle, unsigned long time) -{ return WaitForSingleObject(handle, time); } - -inline int release_mutex(void *handle) -{ return ReleaseMutex(handle); } - -inline int unmap_view_of_file(void *address) -{ return UnmapViewOfFile(address); } - -inline void *open_or_create_semaphore(const char *name, long initial_count, long maximum_count, interprocess_security_attributes *attr) -{ return CreateSemaphoreA(attr, initial_count, maximum_count, name); } - -inline void *open_semaphore(const char *name) -{ return OpenSemaphoreA(semaphore_all_access, 0, name); } - -inline int release_semaphore(void *handle, long release_count, long *prev_count) -{ return ReleaseSemaphore(handle, release_count, prev_count); } - -class interprocess_all_access_security -{ - interprocess_security_attributes sa; - interprocess_security_descriptor sd; - bool initialized; - - public: - interprocess_all_access_security() - : initialized(false) - { - if(!InitializeSecurityDescriptor(&sd, security_descriptor_revision)) - return; - if(!SetSecurityDescriptorDacl(&sd, true, 0, false)) - return; - sa.lpSecurityDescriptor = &sd; - sa.nLength = sizeof(interprocess_security_attributes); - sa.bInheritHandle = false; - initialized = false; - } - - interprocess_security_attributes *get_attributes() - { return &sa; } -}; - -inline void * create_file_mapping (void * handle, unsigned long access, unsigned __int64 file_offset, const char * name, interprocess_security_attributes *psec) -{ - const unsigned long high_size(file_offset >> 32), low_size((boost::uint32_t)file_offset); - return CreateFileMappingA (handle, psec, access, high_size, low_size, name); -} - -inline void * open_file_mapping (unsigned long access, const char *name) -{ return OpenFileMappingA (access, 0, name); } - -inline void *map_view_of_file_ex(void *handle, unsigned long file_access, unsigned __int64 offset, std::size_t numbytes, void *base_addr) -{ - const unsigned long offset_low = (unsigned long)(offset & ((unsigned __int64)0xFFFFFFFF)); - const unsigned long offset_high = offset >> 32; - return MapViewOfFileEx(handle, file_access, offset_high, offset_low, numbytes, base_addr); -} - -inline void *create_file(const char *name, unsigned long access, unsigned long creation_flags, unsigned long attributes, interprocess_security_attributes *psec) -{ - for (unsigned int attempt(0); attempt < error_sharing_violation_tries; ++attempt){ - void * const handle = CreateFileA(name, access, - file_share_read | file_share_write | file_share_delete, - psec, creation_flags, attributes, 0); - bool const invalid(invalid_handle_value == handle); - if (!invalid){ - return handle; - } - if (error_sharing_violation != get_last_error()){ - return handle; - } - sleep(error_sharing_violation_sleep_ms); - } - return invalid_handle_value; -} - -inline void get_system_info(system_info *info) -{ GetSystemInfo(info); } - -inline bool flush_view_of_file(void *base_addr, std::size_t numbytes) -{ return 0 != FlushViewOfFile(base_addr, numbytes); } - -inline bool virtual_unlock(void *base_addr, std::size_t numbytes) -{ return 0 != VirtualUnlock(base_addr, numbytes); } - -inline bool virtual_protect(void *base_addr, std::size_t numbytes, unsigned long flNewProtect, unsigned long &lpflOldProtect) -{ return 0 != VirtualProtect(base_addr, numbytes, flNewProtect, &lpflOldProtect); } - -inline bool flush_file_buffers(void *handle) -{ return 0 != FlushFileBuffers(handle); } - -inline bool get_file_size(void *handle, __int64 &size) -{ return 0 != GetFileSizeEx(handle, (large_integer*)&size); } - -inline bool create_directory(const char *name) -{ - interprocess_all_access_security sec; - return 0 != CreateDirectoryA(name, sec.get_attributes()); -} - -inline bool remove_directory(const char *lpPathName) -{ return 0 != RemoveDirectoryA(lpPathName); } - -inline unsigned long get_temp_path(unsigned long length, char *buffer) -{ return GetTempPathA(length, buffer); } - -inline int set_end_of_file(void *handle) -{ return 0 != SetEndOfFile(handle); } - -inline bool set_file_pointer_ex(void *handle, __int64 distance, __int64 *new_file_pointer, unsigned long move_method) -{ - large_integer d; d.QuadPart = distance; - return 0 != SetFilePointerEx(handle, d, (large_integer*)new_file_pointer, move_method); -} - -inline bool lock_file_ex(void *hnd, unsigned long flags, unsigned long reserved, unsigned long size_low, unsigned long size_high, interprocess_overlapped *overlapped) -{ return 0 != LockFileEx(hnd, flags, reserved, size_low, size_high, overlapped); } - -inline bool unlock_file_ex(void *hnd, unsigned long reserved, unsigned long size_low, unsigned long size_high, interprocess_overlapped *overlapped) -{ return 0 != UnlockFileEx(hnd, reserved, size_low, size_high, overlapped); } - -inline bool write_file(void *hnd, const void *buffer, unsigned long bytes_to_write, unsigned long *bytes_written, interprocess_overlapped* overlapped) -{ return 0 != WriteFile(hnd, buffer, bytes_to_write, bytes_written, overlapped); } - -inline bool read_file(void *hnd, void *buffer, unsigned long bytes_to_read, unsigned long *bytes_read, interprocess_overlapped* overlapped) -{ return 0 != ReadFile(hnd, buffer, bytes_to_read, bytes_read, overlapped); } - -inline bool get_file_information_by_handle(void *hnd, interprocess_by_handle_file_information *info) -{ return 0 != GetFileInformationByHandle(hnd, info); } - -inline long interlocked_increment(long volatile *addr) -{ return BOOST_INTERLOCKED_INCREMENT(addr); } - -inline long interlocked_decrement(long volatile *addr) -{ return BOOST_INTERLOCKED_DECREMENT(addr); } - -inline long interlocked_compare_exchange(long volatile *addr, long val1, long val2) -{ return BOOST_INTERLOCKED_COMPARE_EXCHANGE(addr, val1, val2); } - -inline long interlocked_exchange_add(long volatile* addend, long value) -{ return BOOST_INTERLOCKED_EXCHANGE_ADD(const_cast<long*>(addend), value); } - -inline long interlocked_exchange(long volatile* addend, long value) -{ return BOOST_INTERLOCKED_EXCHANGE(const_cast<long*>(addend), value); } - -//Forward functions -inline hmodule load_library(const char *name) -{ return LoadLibraryA(name); } - -inline bool free_library(hmodule module) -{ return 0 != FreeLibrary(module); } - -inline farproc_t get_proc_address(hmodule module, const char *name) -{ return GetProcAddress(module, name); } - -inline void *get_current_process() -{ return GetCurrentProcess(); } - -inline hmodule get_module_handle(const char *name) -{ return GetModuleHandleA(name); } - -inline long reg_open_key_ex(hkey hKey, const char *lpSubKey, unsigned long ulOptions, unsigned long samDesired, hkey *phkResult) -{ return RegOpenKeyExA(hKey, lpSubKey, ulOptions, samDesired, phkResult); } - -inline long reg_query_value_ex(hkey hKey, const char *lpValueName, unsigned long*lpReserved, unsigned long*lpType, unsigned char *lpData, unsigned long*lpcbData) -{ return RegQueryValueExA(hKey, lpValueName, lpReserved, lpType, lpData, lpcbData); } - -inline long reg_close_key(hkey hKey) -{ return RegCloseKey(hKey); } - -inline void initialize_object_attributes -( object_attributes_t *pobject_attr, unicode_string_t *name - , unsigned long attr, void *rootdir, void *security_descr) - -{ - pobject_attr->Length = sizeof(object_attributes_t); - pobject_attr->RootDirectory = rootdir; - pobject_attr->Attributes = attr; - pobject_attr->ObjectName = name; - pobject_attr->SecurityDescriptor = security_descr; - pobject_attr->SecurityQualityOfService = 0; -} - -inline void rtl_init_empty_unicode_string(unicode_string_t *ucStr, wchar_t *buf, unsigned short bufSize) -{ - ucStr->Buffer = buf; - ucStr->Length = 0; - ucStr->MaximumLength = bufSize; -} - -//A class that locates and caches loaded DLL function addresses. -template<int Dummy> -struct function_address_holder -{ - enum { NtSetInformationFile - , NtQuerySystemInformation - , NtQueryObject - , NtQuerySemaphore - , NtQuerySection - , NtOpenFile - , NtClose - , NtQueryTimerResolution - , NtSetTimerResolution - , QueryPerformanceCounter - , QueryPerformanceFrequency - , NumFunction - }; - enum { NtDll_dll, Kernel32_dll, NumModule }; - - private: - static const char *FunctionNames[NumFunction]; - static const char *ModuleNames[NumModule]; - static farproc_t FunctionAddresses[NumFunction]; - static unsigned int FunctionModules[NumFunction]; - static volatile long FunctionStates[NumFunction]; - static hmodule ModuleAddresses[NumModule]; - static volatile long ModuleStates[NumModule]; - - static hmodule get_module_from_id(unsigned int id) - { - BOOST_ASSERT(id < (unsigned int)NumModule); - hmodule addr = get_module_handle(ModuleNames[id]); - BOOST_ASSERT(addr); - return addr; - } - - static hmodule get_module(const unsigned int id) - { - BOOST_ASSERT(id < (unsigned int)NumModule); - for(unsigned i = 0; ModuleStates[id] < 2; ++i){ - if(interlocked_compare_exchange(&ModuleStates[id], 1, 0) == 0){ - ModuleAddresses[id] = get_module_from_id(id); - interlocked_increment(&ModuleStates[id]); - break; - } - else if(i & 1){ - sched_yield(); - } - else{ - sleep_tick(); - } - } - return ModuleAddresses[id]; - } - - static farproc_t get_address_from_dll(const unsigned int id) - { - BOOST_ASSERT(id < (unsigned int)NumFunction); - farproc_t addr = get_proc_address(get_module(FunctionModules[id]), FunctionNames[id]); - BOOST_ASSERT(addr); - return addr; - } - - public: - static void *get(const unsigned int id) - { - BOOST_ASSERT(id < (unsigned int)NumFunction); - for(unsigned i = 0; FunctionStates[id] < 2; ++i){ - if(interlocked_compare_exchange(&FunctionStates[id], 1, 0) == 0){ - FunctionAddresses[id] = get_address_from_dll(id); - interlocked_increment(&FunctionStates[id]); - break; - } - else if(i & 1){ - sched_yield(); - } - else{ - sleep_tick(); - } - } - return FunctionAddresses[id]; - } -}; - -template<int Dummy> -const char *function_address_holder<Dummy>::FunctionNames[function_address_holder<Dummy>::NumFunction] = -{ - "NtSetInformationFile", - "NtQuerySystemInformation", - "NtQueryObject", - "NtQuerySemaphore", - "NtQuerySection", - "NtOpenFile", - "NtClose", - "NtQueryTimerResolution", - "NtSetTimerResolution", - "QueryPerformanceCounter", - "QueryPerformanceFrequency" -}; - -template<int Dummy> -unsigned int function_address_holder<Dummy>::FunctionModules[function_address_holder<Dummy>::NumFunction] = -{ - NtDll_dll, - NtDll_dll, - NtDll_dll, - NtDll_dll, - NtDll_dll, - NtDll_dll, - NtDll_dll, - NtDll_dll, - NtDll_dll, - Kernel32_dll, - Kernel32_dll -}; - -template<int Dummy> -const char *function_address_holder<Dummy>::ModuleNames[function_address_holder<Dummy>::NumModule] = -{ - "ntdll.dll", - "kernel32.dll" -}; - - -template<int Dummy> -farproc_t function_address_holder<Dummy>::FunctionAddresses[function_address_holder<Dummy>::NumFunction]; - -template<int Dummy> -volatile long function_address_holder<Dummy>::FunctionStates[function_address_holder<Dummy>::NumFunction]; - -template<int Dummy> -hmodule function_address_holder<Dummy>::ModuleAddresses[function_address_holder<Dummy>::NumModule]; - -template<int Dummy> -volatile long function_address_holder<Dummy>::ModuleStates[function_address_holder<Dummy>::NumModule]; - - -struct dll_func - : public function_address_holder<0> -{}; - -//Complex winapi based functions... -struct library_unloader -{ - hmodule lib_; - library_unloader(hmodule module) : lib_(module){} - ~library_unloader(){ free_library(lib_); } -}; - - -inline bool get_system_time_of_day_information(system_timeofday_information &info) -{ - NtQuerySystemInformation_t pNtQuerySystemInformation = (NtQuerySystemInformation_t) - dll_func::get(dll_func::NtQuerySystemInformation); - unsigned long res; - long status = pNtQuerySystemInformation(system_time_of_day_information, &info, sizeof(info), &res); - if(status){ - return false; - } - return true; -} - -inline bool get_boot_time(unsigned char (&bootstamp) [BootstampLength]) -{ - system_timeofday_information info; - bool ret = get_system_time_of_day_information(info); - if(!ret){ - return false; - } - std::memcpy(&bootstamp[0], &info.Reserved1, sizeof(bootstamp)); - return true; -} - -inline bool get_boot_and_system_time(unsigned char (&bootsystemstamp) [BootAndSystemstampLength]) -{ - system_timeofday_information info; - bool ret = get_system_time_of_day_information(info); - if(!ret){ - return false; - } - std::memcpy(&bootsystemstamp[0], &info.Reserved1, sizeof(bootsystemstamp)); - return true; -} - -inline bool get_boot_time_str(char *bootstamp_str, std::size_t &s) - //will write BootstampLength chars -{ - if(s < (BootstampLength*2)) - return false; - system_timeofday_information info; - bool ret = get_system_time_of_day_information(info); - if(!ret){ - return false; - } - const char Characters [] = - { '0', '1', '2', '3', '4', '5', '6', '7' - , '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; - std::size_t char_counter = 0; - for(std::size_t i = 0; i != static_cast<std::size_t>(BootstampLength); ++i){ - bootstamp_str[char_counter++] = Characters[(info.Reserved1[i]&0xF0)>>4]; - bootstamp_str[char_counter++] = Characters[(info.Reserved1[i]&0x0F)]; - } - s = BootstampLength*2; - return true; -} - -//Writes the hexadecimal value of the buffer, in the wide character string. -//str must be twice length -inline void buffer_to_wide_str(const void *buf, std::size_t length, wchar_t *str) -{ - const wchar_t Characters [] = - { L'0', L'1', L'2', L'3', L'4', L'5', L'6', L'7' - , L'8', L'9', L'A', L'B', L'C', L'D', L'E', L'F' }; - std::size_t char_counter = 0; - const char *chbuf = static_cast<const char *>(buf); - for(std::size_t i = 0; i != length; ++i){ - str[char_counter++] = Characters[(chbuf[i]&0xF0)>>4]; - str[char_counter++] = Characters[(chbuf[i]&0x0F)]; - } -} - -inline bool get_boot_and_system_time_wstr(wchar_t *bootsystemstamp, std::size_t &s) - //will write BootAndSystemstampLength chars -{ - if(s < (BootAndSystemstampLength*2)) - return false; - system_timeofday_information info; - bool ret = get_system_time_of_day_information(info); - if(!ret){ - return false; - } - - buffer_to_wide_str(&info.Reserved1[0], BootAndSystemstampLength, bootsystemstamp); - s = BootAndSystemstampLength*2; - return true; -} - -class handle_closer -{ - void *handle_; - handle_closer(const handle_closer &); - handle_closer& operator=(const handle_closer &); - public: - explicit handle_closer(void *handle) : handle_(handle){} - ~handle_closer() - { close_handle(handle_); } -}; - -class eventlog_handle_closer -{ - void *handle_; - eventlog_handle_closer(const handle_closer &); - eventlog_handle_closer& operator=(const eventlog_handle_closer &); - public: - explicit eventlog_handle_closer(void *handle) : handle_(handle){} - ~eventlog_handle_closer() - { CloseEventLog(handle_); } -}; - -union ntquery_mem_t -{ - object_name_information_t name; - struct ren_t - { - file_rename_information_t info; - wchar_t buf[1]; - } ren; -}; - -class nt_query_mem_deleter -{ - static const std::size_t rename_offset = offsetof(ntquery_mem_t, ren.info.FileName) - - offsetof(ntquery_mem_t, name.Name.Buffer); - // Timestamp process id atomic count - static const std::size_t rename_suffix = - (SystemTimeOfDayInfoLength + sizeof(unsigned long) + sizeof(boost::uint32_t))*2; - - public: - nt_query_mem_deleter(std::size_t object_name_information_size) - : m_size(object_name_information_size + rename_offset + rename_suffix) - , m_buf(new char [m_size]) - {} - - ~nt_query_mem_deleter() - { - delete[]m_buf; - } - - void realloc_mem(std::size_t num_bytes) - { - num_bytes += rename_suffix + rename_offset; - char *buf = m_buf; - m_buf = new char[num_bytes]; - delete[]buf; - m_size = num_bytes; - } - - ntquery_mem_t *query_mem() const - { return static_cast<ntquery_mem_t *>(static_cast<void*>(m_buf)); } - - unsigned long object_name_information_size() const - { - return static_cast<unsigned long>(m_size - rename_offset - SystemTimeOfDayInfoLength*2); - } - - std::size_t file_rename_information_size() const - { return static_cast<unsigned long>(m_size); } - - private: - std::size_t m_size; - char *m_buf; -}; - -class c_heap_deleter -{ - public: - c_heap_deleter(std::size_t size) - : m_buf(::malloc(size)) - {} - - ~c_heap_deleter() - { - if(m_buf) ::free(m_buf); - } - - void realloc_mem(std::size_t num_bytes) - { - void *buf = ::realloc(m_buf, num_bytes); - if(!buf){ - free(m_buf); - m_buf = 0; - } - } - - void *get() const - { return m_buf; } - - private: - void *m_buf; -}; - -inline bool unlink_file(const char *filename) -{ - //Don't try to optimize doing a DeleteFile first - //as there are interactions with permissions and - //in-use files. - // - //if(!delete_file(filename)){ - // (...) - // - - //This functions tries to emulate UNIX unlink semantics in windows. - // - //- Open the file and mark the handle as delete-on-close - //- Rename the file to an arbitrary name based on a random number - //- Close the handle. If there are no file users, it will be deleted. - // Otherwise it will be used by already connected handles but the - // file name can't be used to open this file again - try{ - NtSetInformationFile_t pNtSetInformationFile = - (NtSetInformationFile_t)dll_func::get(dll_func::NtSetInformationFile); - - NtQueryObject_t pNtQueryObject = (NtQueryObject_t)dll_func::get(dll_func::NtQueryObject); - - //First step: Obtain a handle to the file using Win32 rules. This resolves relative paths - void *fh = create_file(filename, generic_read | delete_access, open_existing, 0, 0); - if(fh == invalid_handle_value){ - return false; - } - - handle_closer h_closer(fh); - { - //Obtain name length - unsigned long size; - const std::size_t initial_string_mem = 512u; - - nt_query_mem_deleter nt_query_mem(sizeof(ntquery_mem_t)+initial_string_mem); - //Obtain file name with guessed length - if(pNtQueryObject(fh, object_name_information, nt_query_mem.query_mem(), nt_query_mem.object_name_information_size(), &size)){ - //Obtain file name with exact length buffer - nt_query_mem.realloc_mem(size); - if(pNtQueryObject(fh, object_name_information, nt_query_mem.query_mem(), nt_query_mem.object_name_information_size(), &size)){ - return false; - } - } - ntquery_mem_t *pmem = nt_query_mem.query_mem(); - file_rename_information_t *pfri = &pmem->ren.info; - const std::size_t RenMaxNumChars = - (((char*)(pmem) + nt_query_mem.file_rename_information_size()) - (char*)&pmem->ren.info.FileName[0])/sizeof(wchar_t); - - //Copy filename to the rename member - std::memmove(pmem->ren.info.FileName, pmem->name.Name.Buffer, pmem->name.Name.Length); - std::size_t filename_string_length = pmem->name.Name.Length/sizeof(wchar_t); - - //Search '\\' character to replace from it - for(std::size_t i = filename_string_length; i != 0; --filename_string_length){ - if(pmem->ren.info.FileName[--i] == L'\\') - break; - } - - //Add random number - std::size_t s = RenMaxNumChars - filename_string_length; - if(!get_boot_and_system_time_wstr(&pfri->FileName[filename_string_length], s)){ - return false; - } - filename_string_length += s; - - //Sometimes the precission of the timestamp is not enough and we need to add another random number. - //The process id (to exclude concurrent processes) and an atomic count (to exclude concurrent threads). - //should be enough - const unsigned long pid = get_current_process_id(); - buffer_to_wide_str(&pid, sizeof(pid), &pfri->FileName[filename_string_length]); - filename_string_length += sizeof(pid)*2; - - static volatile boost::uint32_t u32_count = 0; - interlocked_decrement(reinterpret_cast<volatile long*>(&u32_count)); - buffer_to_wide_str(const_cast<const boost::uint32_t *>(&u32_count), sizeof(boost::uint32_t), &pfri->FileName[filename_string_length]); - filename_string_length += sizeof(boost::uint32_t)*2; - - //Fill rename information (FileNameLength is in bytes) - pfri->FileNameLength = static_cast<unsigned long>(sizeof(wchar_t)*(filename_string_length)); - pfri->Replace = 1; - pfri->RootDir = 0; - - //Cange the name of the in-use file... - io_status_block_t io; - if(0 != pNtSetInformationFile(fh, &io, pfri, nt_query_mem.file_rename_information_size(), file_rename_information)){ - return false; - } - } - //...and mark it as delete-on-close - { - //Don't use pNtSetInformationFile with file_disposition_information as it can return STATUS_CANNOT_DELETE - //if the file is still mapped. Reopen it with NtOpenFile and file_delete_on_close - NtOpenFile_t pNtOpenFile = (NtOpenFile_t)dll_func::get(dll_func::NtOpenFile); - NtClose_t pNtClose = (NtClose_t)dll_func::get(dll_func::NtClose); - const wchar_t empty_str [] = L""; - unicode_string_t ustring = { sizeof(empty_str) - sizeof (wchar_t) //length in bytes without null - , sizeof(empty_str) //total size in bytes of memory allocated for Buffer. - , const_cast<wchar_t*>(empty_str) - }; - object_attributes_t object_attr; - initialize_object_attributes(&object_attr, &ustring, 0, fh, 0); - void* fh2 = 0; - io_status_block_t io; - pNtOpenFile( &fh2, delete_flag, &object_attr, &io - , file_share_read | file_share_write | file_share_delete, file_delete_on_close); - pNtClose(fh2); - //Even if NtOpenFile fails, the file was renamed and the original no longer exists, so return a success status - return true; - } - } - catch(...){ - return false; - } - return true; -} - -struct reg_closer -{ - hkey key_; - reg_closer(hkey key) : key_(key){} - ~reg_closer(){ reg_close_key(key_); } -}; - -inline void get_shared_documents_folder(std::string &s) -{ - #if 1 //Original registry search code - s.clear(); - hkey key; - if (reg_open_key_ex( hkey_local_machine - , "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders" - , 0 - , key_query_value - , &key) == 0){ - reg_closer key_closer(key); - - //Obtain the value - unsigned long size; - unsigned long type; - const char *const reg_value = "Common AppData"; - //long err = (*pRegQueryValue)( key, reg_value, 0, &type, 0, &size); - long err = reg_query_value_ex( key, reg_value, 0, &type, 0, &size); - if(!err){ - //Size includes terminating NULL - s.resize(size); - //err = (*pRegQueryValue)( key, reg_value, 0, &type, (unsigned char*)(&s[0]), &size); - err = reg_query_value_ex( key, reg_value, 0, &type, (unsigned char*)(&s[0]), &size); - if(!err) - s.erase(s.end()-1); - (void)err; - } - } - #else //registry alternative: SHGetSpecialFolderPathA - const int BIPC_CSIDL_COMMON_APPDATA = 0x0023; // All Users\Application Data - const int BIPC_CSIDL_FLAG_CREATE = 0x8000; // new for Win2K, or this in to force creation of folder - const int BIPC_SHGFP_TYPE_CURRENT = 0; // current value for user, verify it exists - - s.clear(); - char szPath[max_path]; - if(0 == SHGetFolderPathA(0, BIPC_CSIDL_COMMON_APPDATA | BIPC_CSIDL_FLAG_CREATE, 0, BIPC_SHGFP_TYPE_CURRENT, szPath)){ - s = szPath; - } - - #endif -} - -inline void get_registry_value(const char *folder, const char *value_key, std::vector<unsigned char> &s) -{ - s.clear(); - hkey key; - if (reg_open_key_ex( hkey_local_machine - , folder - , 0 - , key_query_value - , &key) == 0){ - reg_closer key_closer(key); - - //Obtain the value - unsigned long size; - unsigned long type; - const char *const reg_value = value_key; - //long err = (*pRegQueryValue)( key, reg_value, 0, &type, 0, &size); - long err = reg_query_value_ex( key, reg_value, 0, &type, 0, &size); - if(!err){ - //Size includes terminating NULL - s.resize(size); - //err = (*pRegQueryValue)( key, reg_value, 0, &type, (unsigned char*)(&s[0]), &size); - err = reg_query_value_ex( key, reg_value, 0, &type, (unsigned char*)(&s[0]), &size); - if(!err) - s.erase(s.end()-1); - (void)err; - } - } -} - -struct co_uninitializer -{ - co_uninitializer(bool b_uninitialize) - : m_b_uninitialize(b_uninitialize) - {} - - ~co_uninitializer() - { - if(m_b_uninitialize){ - CoUninitialize(); - } - } - - private: - const bool m_b_uninitialize; -}; - -template<class Object> -struct com_releaser -{ - Object *&object_; - com_releaser(Object *&object) : object_(object) {} - ~com_releaser() { object_->Release(); object_ = 0; } -}; - -inline bool get_wmi_class_attribute( std::wstring& strValue, const wchar_t *wmi_class, const wchar_t *wmi_class_var) -{ - //See example http://msdn.microsoft.com/en-us/library/aa390423%28v=VS.85%29.aspx - // - //See BOOST_INTERPROCESS_WINDOWS_COINIT_MODEL definition if you need to change the - //default value of this macro in your application - long co_init_ret = CoInitializeEx(0, BOOST_INTERPROCESS_WINDOWS_COINIT_MODEL); - if(co_init_ret != S_OK_BIPC && co_init_ret != S_FALSE_BIPC && co_init_ret != RPC_E_CHANGED_MODE_BIPC) - return false; - co_uninitializer co_initialize_end(co_init_ret != RPC_E_CHANGED_MODE_BIPC); - (void)co_initialize_end; - - bool bRet = false; - long sec_init_ret = CoInitializeSecurity - ( 0 //pVoid - ,-1 //cAuthSvc - , 0 //asAuthSvc - , 0 //pReserved1 - , RPC_C_AUTHN_LEVEL_PKT_BIPC //dwAuthnLevel - , RPC_C_IMP_LEVEL_IMPERSONATE_BIPC //dwImpLevel - , 0 //pAuthList - , EOAC_NONE_BIPC //dwCapabilities - , 0 //pReserved3 - ); - if( 0 == sec_init_ret || RPC_E_TOO_LATE_BIPC == sec_init_ret) - { - IWbemLocator_BIPC * pIWbemLocator = 0; - const wchar_t * bstrNamespace = L"root\\cimv2"; - - if( 0 != CoCreateInstance( - CLSID_WbemAdministrativeLocator, - 0, - CLSCTX_INPROC_SERVER_BIPC | CLSCTX_LOCAL_SERVER_BIPC, - IID_IUnknown, (void **)&pIWbemLocator)){ - return false; - } - - com_releaser<IWbemLocator_BIPC> IWbemLocator_releaser(pIWbemLocator); - - IWbemServices_BIPC *pWbemServices = 0; - - if( 0 != pIWbemLocator->ConnectServer( - (bstr)bstrNamespace, // Namespace - 0, // Userid - 0, // PW - 0, // Locale - 0, // flags - 0, // Authority - 0, // Context - &pWbemServices - ) - ){ - return false; - } - - if( S_OK_BIPC != CoSetProxyBlanket( - pWbemServices, - RPC_C_AUTHN_DEFAULT_BIPC, - RPC_C_AUTHZ_DEFAULT_BIPC, - 0, - RPC_C_AUTHN_LEVEL_PKT_BIPC, - RPC_C_IMP_LEVEL_IMPERSONATE_BIPC, - 0, - EOAC_NONE_BIPC - ) - ){ - return false; - } - - com_releaser<IWbemServices_BIPC> IWbemServices_releaser(pWbemServices); - - strValue.clear(); - strValue += L"Select "; - strValue += wmi_class_var; - strValue += L" from "; - strValue += wmi_class; - - IEnumWbemClassObject_BIPC * pEnumObject = 0; - - if ( 0 != pWbemServices->ExecQuery( - (bstr)L"WQL", - (bstr)strValue.c_str(), - //WBEM_FLAG_RETURN_IMMEDIATELY_BIPC, - WBEM_FLAG_RETURN_WHEN_COMPLETE_BIPC | WBEM_FLAG_FORWARD_ONLY_BIPC, - 0, - &pEnumObject - ) - ){ - return false; - } - - com_releaser<IEnumWbemClassObject_BIPC> IEnumWbemClassObject_releaser(pEnumObject); - - //WBEM_FLAG_FORWARD_ONLY_BIPC incompatible with Reset - //if ( 0 != pEnumObject->Reset() ){ - //return false; - //} - - wchar_variant vwchar; - unsigned long uCount = 1, uReturned; - IWbemClassObject_BIPC * pClassObject = 0; - while( 0 == pEnumObject->Next( WBEM_INFINITE_BIPC, uCount, &pClassObject, &uReturned ) ) - { - com_releaser<IWbemClassObject_BIPC> IWbemClassObject_releaser(pClassObject); - if ( 0 == pClassObject->Get( (bstr)L"LastBootUpTime", 0, &vwchar, 0, 0 ) ){ - bRet = true; - strValue = (wchar_t*)vwchar.bstrVal; - VariantClear(&vwchar ); - break; - } - } - } - return bRet; -} - -#ifdef BOOST_INTERPROCESS_BOOTSTAMP_IS_LASTBOOTUPTIME - -//Obtains the bootup time from WMI LastBootUpTime. -//This time seems to change with hibernation and clock synchronization so avoid it. -inline bool get_last_bootup_time( std::wstring& strValue ) -{ - bool ret = get_wmi_class_attribute(strValue, L"Win32_OperatingSystem", L"LastBootUpTime"); - std::size_t timezone = strValue.find(L'+'); - if(timezone != std::wstring::npos){ - strValue.erase(timezone); - } - timezone = strValue.find(L'-'); - if(timezone != std::wstring::npos){ - strValue.erase(timezone); - } - return ret; -} - -inline bool get_last_bootup_time( std::string& str ) -{ - std::wstring wstr; - bool ret = get_last_bootup_time(wstr); - str.resize(wstr.size()); - for(std::size_t i = 0, max = str.size(); i != max; ++i){ - str[i] = '0' + (wstr[i]-L'0'); - } - return ret; -} - -#else - -// Loop through the buffer and obtain the contents of the -// requested record in the buffer. -inline bool find_record_in_buffer( const void* pBuffer, unsigned long dwBytesRead, const char *provider_name - , unsigned int id_to_find, interprocess_eventlogrecord *&pevent_log_record) -{ - const unsigned char * pRecord = static_cast<const unsigned char*>(pBuffer); - const unsigned char * pEndOfRecords = pRecord + dwBytesRead; - - while (pRecord < pEndOfRecords){ - interprocess_eventlogrecord *pTypedRecord = (interprocess_eventlogrecord*)pRecord; - // Check provider, written at the end of the fixed-part of the record - if (0 == std::strcmp(provider_name, (char*)(pRecord + sizeof(interprocess_eventlogrecord)))) - { - // Check event id - if(id_to_find == (pTypedRecord->EventID & 0xFFFF)){ - pevent_log_record = pTypedRecord; - return true; - } - } - - pRecord += pTypedRecord->Length; - } - pevent_log_record = 0; - return false; -} - -//Obtains the bootup time from the System Event Log, -//event ID == 6005 (event log started). -//Adapted from http://msdn.microsoft.com/en-us/library/windows/desktop/bb427356.aspx -inline bool get_last_bootup_time(std::string &stamp) -{ - const char *source_name = "System"; - const char *provider_name = "EventLog"; - const unsigned short event_id = 6005u; - - unsigned long status = 0; - unsigned long dwBytesToRead = 0; - unsigned long dwBytesRead = 0; - unsigned long dwMinimumBytesToRead = 0; - - // The source name (provider) must exist as a subkey of Application. - void *hEventLog = OpenEventLogA(0, source_name); - if (hEventLog){ - eventlog_handle_closer hnd_closer(hEventLog); (void)hnd_closer; - // Allocate an initial block of memory used to read event records. The number - // of records read into the buffer will vary depending on the size of each event. - // The size of each event will vary based on the size of the user-defined - // data included with each event, the number and length of insertion - // strings, and other data appended to the end of the event record. - dwBytesToRead = max_record_buffer_size; - c_heap_deleter heap_deleter(dwBytesToRead); - - // Read blocks of records until you reach the end of the log or an - // error occurs. The records are read from newest to oldest. If the buffer - // is not big enough to hold a complete event record, reallocate the buffer. - if (heap_deleter.get() != 0){ - while (0 == status){ - if (!ReadEventLogA(hEventLog, - eventlog_sequential_read | eventlog_backwards_read, - 0, - heap_deleter.get(), - dwBytesToRead, - &dwBytesRead, - &dwMinimumBytesToRead)) { - status = get_last_error(); - if (error_insufficient_buffer == status) { - status = 0; - dwBytesToRead = dwMinimumBytesToRead; - heap_deleter.realloc_mem(dwMinimumBytesToRead); - if (!heap_deleter.get()){ - return false; - } - } - else{ //Not found or EOF - return false; - } - } - else - { - interprocess_eventlogrecord *pTypedRecord; - // Print the contents of each record in the buffer. - if(find_record_in_buffer(heap_deleter.get(), dwBytesRead, provider_name, event_id, pTypedRecord)){ - char stamp_str[sizeof(unsigned long)*3+1]; - std::sprintf(&stamp_str[0], "%u", ((unsigned int)pTypedRecord->TimeGenerated)); - stamp = stamp_str; - break; - } - } - } - } - } - return true; -} - -#endif - -inline bool is_directory(const char *path) -{ - unsigned long attrib = GetFileAttributesA(path); - - return (attrib != invalid_file_attributes && - (attrib & file_attribute_directory)); -} - -inline bool get_file_mapping_size(void *file_mapping_hnd, __int64 &size) -{ - NtQuerySection_t pNtQuerySection = - (NtQuerySection_t)dll_func::get(dll_func::NtQuerySection); - //Obtain file name - interprocess_section_basic_information info; - unsigned long ntstatus = - pNtQuerySection(file_mapping_hnd, section_basic_information, &info, sizeof(info), 0); - size = info.section_size; - return !ntstatus; -} - -inline bool get_semaphore_info(void *handle, long &count, long &limit) -{ - winapi::interprocess_semaphore_basic_information info; - winapi::NtQuerySemaphore_t pNtQuerySemaphore = - (winapi::NtQuerySemaphore_t)dll_func::get(winapi::dll_func::NtQuerySemaphore); - unsigned int ret_len; - long status = pNtQuerySemaphore(handle, winapi::semaphore_basic_information, &info, sizeof(info), &ret_len); - count = info.count; - limit = info.limit; - return !status; -} - -inline bool query_timer_resolution(unsigned long *lowres, unsigned long *highres, unsigned long *curres) -{ - winapi::NtQueryTimerResolution_t pNtQueryTimerResolution = - (winapi::NtQueryTimerResolution_t)dll_func::get(winapi::dll_func::NtQueryTimerResolution); - return !pNtQueryTimerResolution(lowres, highres, curres); -} - -inline bool set_timer_resolution(unsigned long RequestedResolution, int Set, unsigned long* ActualResolution) -{ - winapi::NtSetTimerResolution_t pNtSetTimerResolution = - (winapi::NtSetTimerResolution_t)dll_func::get(winapi::dll_func::NtSetTimerResolution); - return !pNtSetTimerResolution(RequestedResolution, Set, ActualResolution); -} - -inline bool query_performance_counter(__int64 *lpPerformanceCount) -{ - QueryPerformanceCounter_t pQueryPerformanceCounter = (QueryPerformanceCounter_t) - dll_func::get(dll_func::QueryPerformanceCounter); - return 0 != pQueryPerformanceCounter(lpPerformanceCount); -} - -inline bool query_performance_frequency(__int64 *lpFrequency) -{ - QueryPerformanceCounter_t pQueryPerformanceFrequency = (QueryPerformanceFrequency_t) - dll_func::get(dll_func::QueryPerformanceFrequency); - return 0 != pQueryPerformanceFrequency(lpFrequency); -} - -inline unsigned long get_tick_count() -{ return GetTickCount(); } - -} //namespace winapi -} //namespace interprocess -} //namespace boost - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //#ifdef BOOST_INTERPROCESS_WIN32_PRIMITIVES_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/detail/windows_intermodule_singleton.hpp b/src/third_party/boost-1.56.0/boost/interprocess/detail/windows_intermodule_singleton.hpp deleted file mode 100644 index 58102689da4..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/detail/windows_intermodule_singleton.hpp +++ /dev/null @@ -1,310 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2009-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_WINDOWS_INTERMODULE_SINGLETON_HPP -#define BOOST_INTERPROCESS_WINDOWS_INTERMODULE_SINGLETON_HPP - -#if defined(_MSC_VER) -#pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> -#include <boost/container/string.hpp> - -#if !defined(BOOST_INTERPROCESS_WINDOWS) - #error "This header can't be included from non-windows operating systems" -#endif - -#include <boost/assert.hpp> -#include <boost/interprocess/detail/intermodule_singleton_common.hpp> -#include <boost/interprocess/sync/windows/winapi_semaphore_wrapper.hpp> -#include <boost/interprocess/sync/windows/winapi_mutex_wrapper.hpp> -#include <boost/interprocess/sync/scoped_lock.hpp> -#include <boost/cstdint.hpp> -#include <string> -#include <boost/container/map.hpp> - -namespace boost{ -namespace interprocess{ -namespace ipcdetail{ - -namespace intermodule_singleton_helpers { - -//This global map will be implemented using 3 sync primitives: -// -//1) A named mutex that will implement global mutual exclusion between -// threads from different modules/dlls -// -//2) A semaphore that will act as a global counter for modules attached to the global map -// so that the global map can be destroyed when the last module is detached. -// -//3) A semaphore that will be hacked to hold the address of a heap-allocated map in the -// max and current semaphore count. -class windows_semaphore_based_map -{ - typedef boost::container::map<boost::container::string, ref_count_ptr> map_type; - - public: - windows_semaphore_based_map() - { - map_type *m = new map_type; - boost::uint32_t initial_count = 0; - boost::uint32_t max_count = 0; - - //Windows user address space sizes: - //32 bit windows: [32 bit processes] 2GB or 3GB (31/32 bits) - //64 bit windows: [32 bit processes] 2GB or 4GB (31/32 bits) - // [64 bit processes] 2GB or 8TB (31/43 bits) - // - //Windows semaphores use 'long' parameters (32 bits in LLP64 data model) and - //those values can't be negative, so we have 31 bits to store something - //in max_count and initial count parameters. - //Also, max count must be bigger than 0 and bigger or equal than initial count. - if(sizeof(void*) == sizeof(boost::uint32_t)){ - //This means that for 32 bit processes, a semaphore count (31 usable bits) is - //enough to store 4 byte aligned memory (4GB -> 32 bits - 2 bits = 30 bits). - //The max count will hold the pointer value and current semaphore count - //will be zero. - // - //Relying in UB with a cast through union, but all known windows compilers - //accept this (C11 also accepts this). - union caster_union - { - void *addr; - boost::uint32_t addr_uint32; - } caster; - caster.addr = m; - //memory is at least 4 byte aligned in windows - BOOST_ASSERT((caster.addr_uint32 & boost::uint32_t(3)) == 0); - max_count = caster.addr_uint32 >> 2; - } - else if(sizeof(void*) == sizeof(boost::uint64_t)){ - //Relying in UB with a cast through union, but all known windows compilers - //accept this (C11 accepts this). - union caster_union - { - void *addr; - boost::uint64_t addr_uint64; - } caster; - caster.addr = m; - //We'll encode the address using 30 bits in each 32 bit high and low parts. - //High part will be the sem max count, low part will be the sem initial count. - //(restrictions: max count > 0, initial count >= 0 and max count >= initial count): - // - // - Low part will be shifted two times (4 byte alignment) so that top - // two bits are cleared (the top one for sign, the next one to - // assure low part value is always less than the high part value. - // - The top bit of the high part will be cleared and the next bit will be 1 - // (so high part is always bigger than low part due to the quasi-top bit). - // - // This means that the addresses we can store must be 4 byte aligned - // and less than 1 ExbiBytes ( 2^60 bytes, ~1 ExaByte). User-level address space in Windows 64 - // is much less than this (8TB, 2^43 bytes): "1 EByte (or it was 640K?) ought to be enough for anybody" ;-). - caster.addr = m; - BOOST_ASSERT((caster.addr_uint64 & boost::uint64_t(3)) == 0); - max_count = boost::uint32_t(caster.addr_uint64 >> 32); - initial_count = boost::uint32_t(caster.addr_uint64); - initial_count = initial_count/4; - //Make sure top two bits are zero - BOOST_ASSERT((max_count & boost::uint32_t(0xC0000000)) == 0); - //Set quasi-top bit - max_count |= boost::uint32_t(0x40000000); - } - bool created = false; - const permissions & perm = permissions(); - std::string pid_creation_time, name; - get_pid_creation_time_str(pid_creation_time); - name = "bipc_gmap_sem_lock_"; - name += pid_creation_time; - bool success = m_mtx_lock.open_or_create(name.c_str(), perm); - name = "bipc_gmap_sem_count_"; - name += pid_creation_time; - scoped_lock<winapi_mutex_wrapper> lck(m_mtx_lock); - { - success = success && m_sem_count.open_or_create - ( name.c_str(), static_cast<long>(0), winapi_semaphore_wrapper::MaxCount, perm, created); - name = "bipc_gmap_sem_map_"; - name += pid_creation_time; - success = success && m_sem_map.open_or_create - (name.c_str(), initial_count, max_count, perm, created); - if(!success){ - delete m; - //winapi_xxx wrappers do the cleanup... - throw int(0); - } - if(!created){ - delete m; - } - else{ - BOOST_ASSERT(&get_map_unlocked() == m); - } - m_sem_count.post(); - } - } - - map_type &get_map_unlocked() - { - if(sizeof(void*) == sizeof(boost::uint32_t)){ - union caster_union - { - void *addr; - boost::uint32_t addr_uint32; - } caster; - caster.addr = 0; - caster.addr_uint32 = m_sem_map.limit(); - caster.addr_uint32 = caster.addr_uint32 << 2; - return *static_cast<map_type*>(caster.addr); - } - else{ - union caster_union - { - void *addr; - boost::uint64_t addr_uint64; - } caster; - boost::uint32_t max_count(m_sem_map.limit()), initial_count(m_sem_map.value()); - //Clear quasi-top bit - max_count &= boost::uint32_t(0xBFFFFFFF); - caster.addr_uint64 = max_count; - caster.addr_uint64 = caster.addr_uint64 << 32; - caster.addr_uint64 |= boost::uint64_t(initial_count) << 2; - return *static_cast<map_type*>(caster.addr); - } - } - - ref_count_ptr *find(const char *name) - { - scoped_lock<winapi_mutex_wrapper> lck(m_mtx_lock); - map_type &map = this->get_map_unlocked(); - map_type::iterator it = map.find(boost::container::string(name)); - if(it != map.end()){ - return &it->second; - } - else{ - return 0; - } - } - - ref_count_ptr * insert(const char *name, const ref_count_ptr &ref) - { - scoped_lock<winapi_mutex_wrapper> lck(m_mtx_lock); - map_type &map = this->get_map_unlocked(); - map_type::iterator it = map.insert(map_type::value_type(boost::container::string(name), ref)).first; - return &it->second; - } - - bool erase(const char *name) - { - scoped_lock<winapi_mutex_wrapper> lck(m_mtx_lock); - map_type &map = this->get_map_unlocked(); - return map.erase(boost::container::string(name)) != 0; - } - - template<class F> - void atomic_func(F &f) - { - scoped_lock<winapi_mutex_wrapper> lck(m_mtx_lock); - f(); - } - - ~windows_semaphore_based_map() - { - scoped_lock<winapi_mutex_wrapper> lck(m_mtx_lock); - m_sem_count.wait(); - if(0 == m_sem_count.value()){ - map_type &map = this->get_map_unlocked(); - BOOST_ASSERT(map.empty()); - delete ↦ - } - //First close sems to protect this with the external mutex - m_sem_map.close(); - m_sem_count.close(); - //Once scoped_lock unlocks the mutex, the destructor will close the handle... - } - - private: - winapi_mutex_wrapper m_mtx_lock; - winapi_semaphore_wrapper m_sem_map; - winapi_semaphore_wrapper m_sem_count; -}; - -template<> -struct thread_safe_global_map_dependant<windows_semaphore_based_map> -{ - static void apply_gmem_erase_logic(const char *, const char *){} - - static bool remove_old_gmem() - { return true; } - - struct lock_file_logic - { - lock_file_logic(windows_semaphore_based_map &) - : retry_with_new_map(false) - {} - - void operator()(void){} - bool retry() const { return retry_with_new_map; } - private: - const bool retry_with_new_map; - }; - - static void construct_map(void *addr) - { - ::new (addr)windows_semaphore_based_map; - } - - struct unlink_map_logic - { - unlink_map_logic(windows_semaphore_based_map &) - {} - void operator()(){} - }; - - static ref_count_ptr *find(windows_semaphore_based_map &map, const char *name) - { - return map.find(name); - } - - static ref_count_ptr * insert(windows_semaphore_based_map &map, const char *name, const ref_count_ptr &ref) - { - return map.insert(name, ref); - } - - static bool erase(windows_semaphore_based_map &map, const char *name) - { - return map.erase(name); - } - - template<class F> - static void atomic_func(windows_semaphore_based_map &map, F &f) - { - map.atomic_func(f); - } -}; - -} //namespace intermodule_singleton_helpers { - -template<typename C, bool LazyInit = true, bool Phoenix = false> -class windows_intermodule_singleton - : public intermodule_singleton_impl - < C - , LazyInit - , Phoenix - , intermodule_singleton_helpers::windows_semaphore_based_map - > -{}; - -} //namespace ipcdetail{ -} //namespace interprocess{ -} //namespace boost{ - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //#ifndef BOOST_INTERPROCESS_WINDOWS_INTERMODULE_SINGLETON_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/detail/workaround.hpp b/src/third_party/boost-1.56.0/boost/interprocess/detail/workaround.hpp deleted file mode 100644 index cb9561179e5..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/detail/workaround.hpp +++ /dev/null @@ -1,194 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_DETAIL_WORKAROUND_HPP -#define BOOST_INTERPROCESS_DETAIL_WORKAROUND_HPP - -#include <boost/interprocess/detail/config_begin.hpp> - -#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) - #define BOOST_INTERPROCESS_WINDOWS - #define BOOST_INTERPROCESS_FORCE_GENERIC_EMULATION - #define BOOST_INTERPROCESS_HAS_KERNEL_BOOTTIME - //Define this to connect with shared memory created with versions < 1.54 - //#define BOOST_INTERPROCESS_BOOTSTAMP_IS_LASTBOOTUPTIME -#else - #include <unistd.h> - - #if defined(_POSIX_THREAD_PROCESS_SHARED) && ((_POSIX_THREAD_PROCESS_SHARED - 0) > 0) - //Cygwin defines _POSIX_THREAD_PROCESS_SHARED but does not implement it. - #if defined(__CYGWIN__) - #define BOOST_INTERPROCESS_BUGGY_POSIX_PROCESS_SHARED - //Mac Os X < Lion (10.7) might define _POSIX_THREAD_PROCESS_SHARED but there is no real support. - #elif defined(__APPLE__) - #include "TargetConditionals.h" - //Check we're on Mac OS target - #if defined(TARGET_OS_MAC) - #include "AvailabilityMacros.h" - //If minimum target for this compilation is older than Mac Os Lion, then we are out of luck - #if MAC_OS_X_VERSION_MIN_REQUIRED < 1070 - #define BOOST_INTERPROCESS_BUGGY_POSIX_PROCESS_SHARED - #endif - #endif - #endif - - //If buggy _POSIX_THREAD_PROCESS_SHARED is detected avoid using it - #if defined(BOOST_INTERPROCESS_BUGGY_POSIX_PROCESS_SHARED) - #undef BOOST_INTERPROCESS_BUGGY_POSIX_PROCESS_SHARED - #else - #define BOOST_INTERPROCESS_POSIX_PROCESS_SHARED - #endif - #endif - - #if defined(_POSIX_BARRIERS) && ((_POSIX_BARRIERS - 0) > 0) - #define BOOST_INTERPROCESS_POSIX_BARRIERS - #endif - - #if defined(_POSIX_SEMAPHORES) && ((_POSIX_SEMAPHORES - 0) > 0) - #define BOOST_INTERPROCESS_POSIX_NAMED_SEMAPHORES - #if defined(__CYGWIN__) - #define BOOST_INTERPROCESS_POSIX_SEMAPHORES_NO_UNLINK - #endif - //Some platforms have a limited (name length) named semaphore support - #elif (defined(__FreeBSD__) && (__FreeBSD__ >= 4)) || defined(__APPLE__) - #define BOOST_INTERPROCESS_POSIX_NAMED_SEMAPHORES - #endif - - #if (defined (_V6_ILP32_OFFBIG) &&(_V6_ILP32_OFFBIG - 0 > 0)) ||\ - (defined (_V6_LP64_OFF64) &&(_V6_LP64_OFF64 - 0 > 0)) ||\ - (defined (_V6_LPBIG_OFFBIG) &&(_V6_LPBIG_OFFBIG - 0 > 0)) ||\ - (defined (_XBS5_ILP32_OFFBIG)&&(_XBS5_ILP32_OFFBIG - 0 > 0)) ||\ - (defined (_XBS5_LP64_OFF64) &&(_XBS5_LP64_OFF64 - 0 > 0)) ||\ - (defined (_XBS5_LPBIG_OFFBIG)&&(_XBS5_LPBIG_OFFBIG - 0 > 0)) ||\ - (defined (_FILE_OFFSET_BITS) &&(_FILE_OFFSET_BITS - 0 >= 64))||\ - (defined (_FILE_OFFSET_BITS) &&(_FILE_OFFSET_BITS - 0 >= 64)) - #define BOOST_INTERPROCESS_UNIX_64_BIT_OR_BIGGER_OFF_T - #endif - - //Check for XSI shared memory objects. They are available in nearly all UNIX platforms - #if !defined(__QNXNTO__) && !defined(__ANDROID__) - #define BOOST_INTERPROCESS_XSI_SHARED_MEMORY_OBJECTS - #endif - - #if defined(_POSIX_SHARED_MEMORY_OBJECTS) && ((_POSIX_SHARED_MEMORY_OBJECTS - 0) > 0) - #define BOOST_INTERPROCESS_POSIX_SHARED_MEMORY_OBJECTS - #else - //VMS and MACOS don't define it but they have shm_open/close interface - #if defined(__vms) - #if __CRTL_VER >= 70200000 - #define BOOST_INTERPROCESS_POSIX_SHARED_MEMORY_OBJECTS - #endif - //Mac OS has some non-conformant features like names limited to SHM_NAME_MAX - #elif defined (__APPLE__) - //#define BOOST_INTERPROCESS_POSIX_SHARED_MEMORY_OBJECTS - //#define BOOST_INTERPROCESS_POSIX_SHARED_MEMORY_OBJECTS_NO_GROW - #endif - #endif - - //Now check if we have only XSI shared memory - #if defined(BOOST_INTERPROCESS_XSI_SHARED_MEMORY_OBJECTS) &&\ - !defined(BOOST_INTERPROCESS_POSIX_SHARED_MEMORY_OBJECTS) - //#define BOOST_INTERPROCESS_XSI_SHARED_MEMORY_OBJECTS_ONLY - #endif - - #if defined(_POSIX_TIMEOUTS) && ((_POSIX_TIMEOUTS - 0) > 0) - #define BOOST_INTERPROCESS_POSIX_TIMEOUTS - #endif - - #ifdef BOOST_INTERPROCESS_POSIX_SHARED_MEMORY_OBJECTS - //Some systems have filesystem-based resources, so the - //portable "/shmname" format does not work due to permission issues - //For those systems we need to form a path to a temporary directory: - // hp-ux tru64 vms freebsd - #if defined(__hpux) || defined(__osf__) || defined(__vms) || (defined(__FreeBSD__) && (__FreeBSD__ < 7)) - #define BOOST_INTERPROCESS_FILESYSTEM_BASED_POSIX_SHARED_MEMORY - //Some systems have "jailed" environments where shm usage is restricted at runtime - //and temporary file file based shm is possible in those executions. - #elif defined(__FreeBSD__) - #define BOOST_INTERPROCESS_RUNTIME_FILESYSTEM_BASED_POSIX_SHARED_MEMORY - #endif - #endif - - #ifdef BOOST_INTERPROCESS_POSIX_NAMED_SEMAPHORES - #if defined(__osf__) || defined(__vms) - #define BOOST_INTERPROCESS_FILESYSTEM_BASED_POSIX_SEMAPHORES - #endif - #endif - - #if defined(_POSIX_VERSION) && defined(_XOPEN_VERSION) && \ - (((_POSIX_VERSION + 0)>= 200112L || (_XOPEN_VERSION + 0)>= 500)) - #define BOOST_INTERPROCESS_POSIX_RECURSIVE_MUTEXES - #endif - - #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__APPLE__) - #define BOOST_INTERPROCESS_BSD_DERIVATIVE - //Some *BSD systems (OpenBSD & NetBSD) need sys/param.h before sys/sysctl.h, whereas - //others (FreeBSD & Darwin) need sys/types.h - #include <sys/types.h> - #include <sys/param.h> - #include <sys/sysctl.h> - #if defined(CTL_KERN) && defined (KERN_BOOTTIME) - //#define BOOST_INTERPROCESS_HAS_KERNEL_BOOTTIME - #endif - #endif -#endif //!defined(BOOST_INTERPROCESS_WINDOWS) - -#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) - #define BOOST_INTERPROCESS_PERFECT_FORWARDING -#endif - -//Now declare some Boost.Interprocess features depending on the implementation -#if defined(BOOST_INTERPROCESS_POSIX_NAMED_SEMAPHORES) && !defined(BOOST_INTERPROCESS_POSIX_SEMAPHORES_NO_UNLINK) - #define BOOST_INTERPROCESS_NAMED_MUTEX_USES_POSIX_SEMAPHORES - #define BOOST_INTERPROCESS_NAMED_SEMAPHORE_USES_POSIX_SEMAPHORES -#endif - -// Timeout duration use if BOOST_INTERPROCESS_ENABLE_TIMEOUT_WHEN_LOCKING is set -#ifndef BOOST_INTERPROCESS_TIMEOUT_WHEN_LOCKING_DURATION_MS - #define BOOST_INTERPROCESS_TIMEOUT_WHEN_LOCKING_DURATION_MS 10000 -#endif - -//Other switches -//BOOST_INTERPROCESS_MSG_QUEUE_USES_CIRC_INDEX -//message queue uses a circular queue as index instead of an array (better performance) -//Boost version < 1.52 uses an array, so undef this if you want to communicate -//with processes compiled with those versions. -#define BOOST_INTERPROCESS_MSG_QUEUE_CIRCULAR_INDEX - -//Inline attributes -#if defined(_MSC_VER) - #define BOOST_INTERPROCESS_ALWAYS_INLINE __forceinline -#elif defined (__GNUC__) - #define BOOST_INTERPROCESS_ALWAYS_INLINE __attribute__((__always_inline__)) -#else - #define BOOST_INTERPROCESS_ALWAYS_INLINE inline -#endif - -#if defined(_MSC_VER) - #define BOOST_INTERPROCESS_NEVER_INLINE __declspec(noinline) -#elif defined (__GNUC__) - #define BOOST_INTERPROCESS_NEVER_INLINE __attribute__((__noinline__)) -#endif - -#if defined(BOOST_NO_CXX11_NOEXCEPT) - #if defined(BOOST_MSVC) - #define BOOST_INTERPROCESS_NOEXCEPT throw() - #else - #define BOOST_INTERPROCESS_NOEXCEPT - #endif - #define BOOST_INTERPROCESS_NOEXCEPT_IF(x) -#else - #define BOOST_INTERPROCESS_NOEXCEPT noexcept - #define BOOST_INTERPROCESS_NOEXCEPT_IF(x) noexcept(x) -#endif - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //#ifndef BOOST_INTERPROCESS_DETAIL_WORKAROUND_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/errors.hpp b/src/third_party/boost-1.56.0/boost/interprocess/errors.hpp deleted file mode 100644 index d829c81b549..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/errors.hpp +++ /dev/null @@ -1,237 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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. -// -// Parts of this code are taken from boost::filesystem library -// -////////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) 2002 Beman Dawes -// Copyright (C) 2001 Dietmar Kuehl -// 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) -// -// See library home page at http://www.boost.org/libs/filesystem -// -////////////////////////////////////////////////////////////////////////////// - - -#ifndef BOOST_INTERPROCESS_ERRORS_HPP -#define BOOST_INTERPROCESS_ERRORS_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> -#include <stdarg.h> -#include <string> - -#if defined (BOOST_INTERPROCESS_WINDOWS) -# include <boost/interprocess/detail/win32_api.hpp> -#else -# ifdef BOOST_HAS_UNISTD_H -# include <errno.h> //Errors -# include <cstring> //strerror -# else //ifdef BOOST_HAS_UNISTD_H -# error Unknown platform -# endif //ifdef BOOST_HAS_UNISTD_H -#endif //#if defined (BOOST_INTERPROCESS_WINDOWS) - -//!\file -//!Describes the error numbering of interprocess classes - -namespace boost { -namespace interprocess { -/// @cond -inline int system_error_code() // artifact of POSIX and WINDOWS error reporting -{ - #if defined (BOOST_INTERPROCESS_WINDOWS) - return winapi::get_last_error(); - #else - return errno; // GCC 3.1 won't accept ::errno - #endif -} - - -#if defined (BOOST_INTERPROCESS_WINDOWS) -inline void fill_system_message(int sys_err_code, std::string &str) -{ - void *lpMsgBuf; - winapi::format_message( - winapi::format_message_allocate_buffer | - winapi::format_message_from_system | - winapi::format_message_ignore_inserts, - 0, - sys_err_code, - winapi::make_lang_id(winapi::lang_neutral, winapi::sublang_default), // Default language - reinterpret_cast<char *>(&lpMsgBuf), - 0, - 0 - ); - str += static_cast<const char*>(lpMsgBuf); - winapi::local_free( lpMsgBuf ); // free the buffer - while ( str.size() - && (str[str.size()-1] == '\n' || str[str.size()-1] == '\r') ) - str.erase( str.size()-1 ); -} -# else -inline void fill_system_message( int system_error, std::string &str) -{ str = std::strerror(system_error); } -# endif -/// @endcond - -enum error_code_t -{ - no_error = 0, - system_error, // system generated error; if possible, is translated - // to one of the more specific errors below. - other_error, // library generated error - security_error, // includes access rights, permissions failures - read_only_error, - io_error, - path_error, - not_found_error, -// not_directory_error, - busy_error, // implies trying again might succeed - already_exists_error, - not_empty_error, - is_directory_error, - out_of_space_error, - out_of_memory_error, - out_of_resource_error, - lock_error, - sem_error, - mode_error, - size_error, - corrupted_error, - not_such_file_or_directory, - invalid_argument, - timeout_when_locking_error, - timeout_when_waiting_error, - owner_dead_error -}; - -typedef int native_error_t; - -/// @cond -struct ec_xlate -{ - native_error_t sys_ec; - error_code_t ec; -}; - -static const ec_xlate ec_table[] = -{ - #if defined (BOOST_INTERPROCESS_WINDOWS) - { /*ERROR_ACCESS_DENIED*/5L, security_error }, - { /*ERROR_INVALID_ACCESS*/12L, security_error }, - { /*ERROR_SHARING_VIOLATION*/32L, security_error }, - { /*ERROR_LOCK_VIOLATION*/33L, security_error }, - { /*ERROR_LOCKED*/212L, security_error }, - { /*ERROR_NOACCESS*/998L, security_error }, - { /*ERROR_WRITE_PROTECT*/19L, read_only_error }, - { /*ERROR_NOT_READY*/21L, io_error }, - { /*ERROR_SEEK*/25L, io_error }, - { /*ERROR_READ_FAULT*/30L, io_error }, - { /*ERROR_WRITE_FAULT*/29L, io_error }, - { /*ERROR_CANTOPEN*/1011L, io_error }, - { /*ERROR_CANTREAD*/1012L, io_error }, - { /*ERROR_CANTWRITE*/1013L, io_error }, - { /*ERROR_DIRECTORY*/267L, path_error }, - { /*ERROR_INVALID_NAME*/123L, path_error }, - { /*ERROR_FILE_NOT_FOUND*/2L, not_found_error }, - { /*ERROR_PATH_NOT_FOUND*/3L, not_found_error }, - { /*ERROR_DEV_NOT_EXIST*/55L, not_found_error }, - { /*ERROR_DEVICE_IN_USE*/2404L, busy_error }, - { /*ERROR_OPEN_FILES*/2401L, busy_error }, - { /*ERROR_BUSY_DRIVE*/142L, busy_error }, - { /*ERROR_BUSY*/170L, busy_error }, - { /*ERROR_FILE_EXISTS*/80L, already_exists_error }, - { /*ERROR_ALREADY_EXISTS*/183L, already_exists_error }, - { /*ERROR_DIR_NOT_EMPTY*/145L, not_empty_error }, - { /*ERROR_HANDLE_DISK_FULL*/39L, out_of_space_error }, - { /*ERROR_DISK_FULL*/112L, out_of_space_error }, - { /*ERROR_OUTOFMEMORY*/14L, out_of_memory_error }, - { /*ERROR_NOT_ENOUGH_MEMORY*/8L, out_of_memory_error }, - { /*ERROR_TOO_MANY_OPEN_FILES*/4L, out_of_resource_error }, - { /*ERROR_INVALID_ADDRESS*/487L, busy_error } - #else //#if defined (BOOST_INTERPROCESS_WINDOWS) - { EACCES, security_error }, - { EROFS, read_only_error }, - { EIO, io_error }, - { ENAMETOOLONG, path_error }, - { ENOENT, not_found_error }, - // { ENOTDIR, not_directory_error }, - { EAGAIN, busy_error }, - { EBUSY, busy_error }, - { ETXTBSY, busy_error }, - { EEXIST, already_exists_error }, - { ENOTEMPTY, not_empty_error }, - { EISDIR, is_directory_error }, - { ENOSPC, out_of_space_error }, - { ENOMEM, out_of_memory_error }, - { EMFILE, out_of_resource_error }, - { ENOENT, not_such_file_or_directory }, - { EINVAL, invalid_argument } - #endif //#if defined (BOOST_INTERPROCESS_WINDOWS) -}; - -inline error_code_t lookup_error(native_error_t err) -{ - const ec_xlate *cur = &ec_table[0], - *end = cur + sizeof(ec_table)/sizeof(ec_xlate); - for (;cur != end; ++cur ){ - if ( err == cur->sys_ec ) return cur->ec; - } - return system_error; // general system error code -} - -struct error_info -{ - error_info(error_code_t ec = other_error ) - : m_nat(0), m_ec(ec) - {} - - error_info(native_error_t sys_err_code) - : m_nat(sys_err_code), m_ec(lookup_error(sys_err_code)) - {} - - error_info & operator =(error_code_t ec) - { - m_nat = 0; - m_ec = ec; - return *this; - } - - error_info & operator =(native_error_t sys_err_code) - { - m_nat = sys_err_code; - m_ec = lookup_error(sys_err_code); - return *this; - } - - native_error_t get_native_error()const - { return m_nat; } - - error_code_t get_error_code()const - { return m_ec; } - - private: - native_error_t m_nat; - error_code_t m_ec; -}; -/// @endcond - -} // namespace interprocess { -} // namespace boost - -#include <boost/interprocess/detail/config_end.hpp> - -#endif // BOOST_INTERPROCESS_ERRORS_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/exceptions.hpp b/src/third_party/boost-1.56.0/boost/interprocess/exceptions.hpp deleted file mode 100644 index cf9d5b4dad7..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/exceptions.hpp +++ /dev/null @@ -1,150 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_EXCEPTIONS_HPP -#define BOOST_INTERPROCESS_EXCEPTIONS_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> -#include <boost/interprocess/errors.hpp> -#include <stdexcept> -#include <new> - -//!\file -//!Describes exceptions thrown by interprocess classes - -namespace boost { - -namespace interprocess { - -//!This class is the base class of all exceptions -//!thrown by boost::interprocess -class interprocess_exception : public std::exception -{ - public: - interprocess_exception(const char *err/*error_code_t ec = other_error*/) - : m_err(other_error) - { -// try { m_str = "boost::interprocess_exception::library_error"; } - try { m_str = err; } - catch (...) {} - } -/* - interprocess_exception(native_error_t sys_err_code) - : m_err(sys_err_code) - { - try { fill_system_message(m_err.get_native_error(), m_str); } - catch (...) {} - }*/ - - interprocess_exception(const error_info &err_info, const char *str = 0) - : m_err(err_info) - { - try{ - if(m_err.get_native_error() != 0){ - fill_system_message(m_err.get_native_error(), m_str); - } - else if(str){ - m_str = str; - } - else{ - m_str = "boost::interprocess_exception::library_error"; - } - } - catch(...){} - } - - virtual ~interprocess_exception() throw(){} - - virtual const char * what() const throw() - { return m_str.c_str(); } - - native_error_t get_native_error()const { return m_err.get_native_error(); } - - // Note: a value of other_error implies a library (rather than system) error - error_code_t get_error_code() const { return m_err.get_error_code(); } - - /// @cond - private: - error_info m_err; - std::string m_str; - /// @endcond -}; - -//!This is the exception thrown by shared interprocess_mutex family when a deadlock situation -//!is detected or when using a interprocess_condition the interprocess_mutex is not locked -class lock_exception : public interprocess_exception -{ - public: - lock_exception() - : interprocess_exception(lock_error) - {} - - virtual const char* what() const throw() - { return "boost::interprocess::lock_exception"; } -}; - -//!This is the exception thrown by named interprocess_semaphore when a deadlock situation -//!is detected or when an error is detected in the post/wait operation -/* -class sem_exception : public interprocess_exception -{ - public: - sem_exception() - : interprocess_exception(lock_error) - {} - - virtual const char* what() const throw() - { return "boost::interprocess::sem_exception"; } -}; -*/ -//!This is the exception thrown by synchronization objects when there is -//!an error in a wait() function -/* -class wait_exception : public interprocess_exception -{ - public: - virtual const char* what() const throw() - { return "boost::interprocess::wait_exception"; } -}; -*/ - -//!This exception is thrown when a named object is created -//!in "open_only" mode and the resource was not already created -/* -class not_previously_created : public interprocess_exception -{ - public: - virtual const char* what() const throw() - { return "boost::interprocess::not_previously_created"; } -}; -*/ - -//!This exception is thrown when a memory request can't be -//!fulfilled. -class bad_alloc : public interprocess_exception -{ - public: - bad_alloc() : interprocess_exception("::boost::interprocess::bad_alloc"){} - virtual const char* what() const throw() - { return "boost::interprocess::bad_alloc"; } -}; - -} // namespace interprocess { - -} // namespace boost - -#include <boost/interprocess/detail/config_end.hpp> - -#endif // BOOST_INTERPROCESS_EXCEPTIONS_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/indexes/iset_index.hpp b/src/third_party/boost-1.56.0/boost/interprocess/indexes/iset_index.hpp deleted file mode 100644 index b1abededf33..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/indexes/iset_index.hpp +++ /dev/null @@ -1,150 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_ISET_INDEX_HPP -#define BOOST_INTERPROCESS_ISET_INDEX_HPP - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> - -#include <string> -#include <functional> -#include <utility> -#include <boost/interprocess/detail/utilities.hpp> -#include <boost/intrusive/set.hpp> - - -//!\file -//!Describes index adaptor of boost::intrusive::set container, to use it -//!as name/shared memory index - -namespace boost { -namespace interprocess { - -/// @cond - -//!Helper class to define typedefs from IndexTraits -template <class MapConfig> -struct iset_index_aux -{ - typedef typename - MapConfig::segment_manager_base segment_manager_base; - - typedef typename - segment_manager_base::void_pointer void_pointer; - typedef typename bi::make_set_base_hook - < bi::void_pointer<void_pointer> - , bi::optimize_size<true> - >::type derivation_hook; - - typedef typename MapConfig::template - intrusive_value_type<derivation_hook>::type value_type; - typedef std::less<value_type> value_compare; - typedef typename bi::make_set - < value_type - , bi::base_hook<derivation_hook> - >::type index_t; -}; -/// @endcond - -//!Index type based in boost::intrusive::set. -//!Just derives from boost::intrusive::set -//!and defines the interface needed by managed memory segments*/ -template <class MapConfig> -class iset_index - //Derive class from map specialization - : public iset_index_aux<MapConfig>::index_t -{ - /// @cond - typedef iset_index_aux<MapConfig> index_aux; - typedef typename index_aux::index_t index_type; - typedef typename MapConfig:: - intrusive_compare_key_type intrusive_compare_key_type; - typedef typename MapConfig::char_type char_type; - /// @endcond - - public: - typedef typename index_type::iterator iterator; - typedef typename index_type::const_iterator const_iterator; - typedef typename index_type::insert_commit_data insert_commit_data; - typedef typename index_type::value_type value_type; - - /// @cond - private: - - struct intrusive_key_value_less - { - bool operator()(const intrusive_compare_key_type &i, const value_type &b) const - { - std::size_t blen = b.name_length(); - return (i.m_len < blen) || - (i.m_len == blen && - std::char_traits<char_type>::compare - (i.mp_str, b.name(), i.m_len) < 0); - } - - bool operator()(const value_type &b, const intrusive_compare_key_type &i) const - { - std::size_t blen = b.name_length(); - return (blen < i.m_len) || - (blen == i.m_len && - std::char_traits<char_type>::compare - (b.name(), i.mp_str, i.m_len) < 0); - } - }; - - /// @endcond - - public: - - //!Constructor. Takes a pointer to the - //!segment manager. Can throw - iset_index(typename MapConfig::segment_manager_base *) - : index_type(/*typename index_aux::value_compare()*/) - {} - - //!This reserves memory to optimize the insertion of n - //!elements in the index - void reserve(typename MapConfig::segment_manager_base::size_type) - { /*Does nothing, map has not reserve or rehash*/ } - - //!This frees all unnecessary memory - void shrink_to_fit() - { /*Does nothing, this intrusive index does not allocate memory;*/ } - - iterator find(const intrusive_compare_key_type &key) - { return index_type::find(key, intrusive_key_value_less()); } - - const_iterator find(const intrusive_compare_key_type &key) const - { return index_type::find(key, intrusive_key_value_less()); } - - std::pair<iterator, bool>insert_check - (const intrusive_compare_key_type &key, insert_commit_data &commit_data) - { return index_type::insert_check(key, intrusive_key_value_less(), commit_data); } -}; - -/// @cond - -//!Trait class to detect if an index is an intrusive -//!index. -template<class MapConfig> -struct is_intrusive_index - <boost::interprocess::iset_index<MapConfig> > -{ - static const bool value = true; -}; -/// @endcond - -} //namespace interprocess { -} //namespace boost - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //#ifndef BOOST_INTERPROCESS_ISET_INDEX_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/interprocess_fwd.hpp b/src/third_party/boost-1.56.0/boost/interprocess/interprocess_fwd.hpp deleted file mode 100644 index b5865d68f7e..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/interprocess_fwd.hpp +++ /dev/null @@ -1,418 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_FWD_HPP -#define BOOST_INTERPROCESS_FWD_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> - -#include <cstddef> - -////////////////////////////////////////////////////////////////////////////// -// Standard predeclarations -////////////////////////////////////////////////////////////////////////////// - -/// @cond - -namespace boost{ -namespace intrusive{ -}} - -namespace boost{ -namespace interprocess{ -namespace bi = boost::intrusive; -}} - -#include <utility> -#include <memory> -#include <functional> -#include <iosfwd> -#include <string> - -/// @endcond - -namespace boost { namespace interprocess { - -////////////////////////////////////////////////////////////////////////////// -// permissions -////////////////////////////////////////////////////////////////////////////// - -class permissions; - -////////////////////////////////////////////////////////////////////////////// -// shared_memory -////////////////////////////////////////////////////////////////////////////// - -class shared_memory_object; - -#if defined (BOOST_INTERPROCESS_WINDOWS) || defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) -class windows_shared_memory; -#endif //#if defined (BOOST_INTERPROCESS_WINDOWS) - -////////////////////////////////////////////////////////////////////////////// -// mapped file/mapped region/mapped_file -////////////////////////////////////////////////////////////////////////////// - -class file_mapping; -class mapped_region; -class mapped_file; - -////////////////////////////////////////////////////////////////////////////// -// Mutexes -////////////////////////////////////////////////////////////////////////////// - -class null_mutex; - -class interprocess_mutex; -class interprocess_recursive_mutex; - -class named_mutex; -class named_recursive_mutex; - -class interprocess_semaphore; -class named_semaphore; - -////////////////////////////////////////////////////////////////////////////// -// Mutex families -////////////////////////////////////////////////////////////////////////////// - -struct mutex_family; -struct null_mutex_family; - -////////////////////////////////////////////////////////////////////////////// -// Other synchronization classes -////////////////////////////////////////////////////////////////////////////// - -class barrier; -class interprocess_sharable_mutex; -class interprocess_condition; - -////////////////////////////////////////////////////////////////////////////// -// Locks -////////////////////////////////////////////////////////////////////////////// - -template <class Mutex> -class scoped_lock; - -template <class SharableMutex> -class sharable_lock; - -template <class UpgradableMutex> -class upgradable_lock; - -////////////////////////////////////////////////////////////////////////////// -// STL compatible allocators -////////////////////////////////////////////////////////////////////////////// - -template<class T, class SegmentManager> -class allocator; - -template<class T, class SegmentManager, std::size_t NodesPerBlock = 64> -class node_allocator; - -template<class T, class SegmentManager, std::size_t NodesPerBlock = 64> -class private_node_allocator; - -template<class T, class SegmentManager, std::size_t NodesPerBlock = 64> -class cached_node_allocator; - -template<class T, class SegmentManager, std::size_t NodesPerBlock = 64, std::size_t MaxFreeBlocks = 2 - , unsigned char OverheadPercent = 5 -> -class adaptive_pool; - -template<class T, class SegmentManager, std::size_t NodesPerBlock = 64, std::size_t MaxFreeBlocks = 2 - , unsigned char OverheadPercent = 5 -> -class private_adaptive_pool; - -template<class T, class SegmentManager, std::size_t NodesPerBlock = 64, std::size_t MaxFreeBlocks = 2 - , unsigned char OverheadPercent = 5 -> -class cached_adaptive_pool; - - -////////////////////////////////////////////////////////////////////////////// -// offset_ptr -////////////////////////////////////////////////////////////////////////////// - -static const std::size_t offset_type_alignment = 0; - -template <class T, class DifferenceType = std::ptrdiff_t, class OffsetType = std::size_t, std::size_t Alignment = offset_type_alignment> -class offset_ptr; - -////////////////////////////////////////////////////////////////////////////// -// Memory allocation algorithms -////////////////////////////////////////////////////////////////////////////// - -//Single segment memory allocation algorithms -template<class MutexFamily, class VoidMutex = offset_ptr<void> > -class simple_seq_fit; - -template<class MutexFamily, class VoidMutex = offset_ptr<void>, std::size_t MemAlignment = 0> -class rbtree_best_fit; - -////////////////////////////////////////////////////////////////////////////// -// Index Types -////////////////////////////////////////////////////////////////////////////// - -template<class IndexConfig> class flat_map_index; -template<class IndexConfig> class iset_index; -template<class IndexConfig> class iunordered_set_index; -template<class IndexConfig> class map_index; -template<class IndexConfig> class null_index; -template<class IndexConfig> class unordered_map_index; - -////////////////////////////////////////////////////////////////////////////// -// Segment manager -////////////////////////////////////////////////////////////////////////////// - -template <class CharType - ,class MemoryAlgorithm - ,template<class IndexConfig> class IndexType> -class segment_manager; - -////////////////////////////////////////////////////////////////////////////// -// External buffer managed memory classes -////////////////////////////////////////////////////////////////////////////// - -template <class CharType - ,class MemoryAlgorithm - ,template<class IndexConfig> class IndexType> -class basic_managed_external_buffer; - -typedef basic_managed_external_buffer - <char - ,rbtree_best_fit<null_mutex_family> - ,iset_index> -managed_external_buffer; - -typedef basic_managed_external_buffer - <wchar_t - ,rbtree_best_fit<null_mutex_family> - ,iset_index> -wmanaged_external_buffer; - -////////////////////////////////////////////////////////////////////////////// -// managed memory classes -////////////////////////////////////////////////////////////////////////////// - -template <class CharType - ,class MemoryAlgorithm - ,template<class IndexConfig> class IndexType> -class basic_managed_shared_memory; - -typedef basic_managed_shared_memory - <char - ,rbtree_best_fit<mutex_family> - ,iset_index> -managed_shared_memory; - -typedef basic_managed_shared_memory - <wchar_t - ,rbtree_best_fit<mutex_family> - ,iset_index> -wmanaged_shared_memory; - - -////////////////////////////////////////////////////////////////////////////// -// Windows shared memory managed memory classes -////////////////////////////////////////////////////////////////////////////// - -#if defined (BOOST_INTERPROCESS_WINDOWS) || defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) - -template <class CharType - ,class MemoryAlgorithm - ,template<class IndexConfig> class IndexType> -class basic_managed_windows_shared_memory; - -typedef basic_managed_windows_shared_memory - <char - ,rbtree_best_fit<mutex_family> - ,iset_index> -managed_windows_shared_memory; - -typedef basic_managed_windows_shared_memory - <wchar_t - ,rbtree_best_fit<mutex_family> - ,iset_index> -wmanaged_windows_shared_memory; - -#endif //#if defined (BOOST_INTERPROCESS_WINDOWS) - -#if defined(BOOST_INTERPROCESS_XSI_SHARED_MEMORY_OBJECTS) || defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) - -template <class CharType - ,class MemoryAlgorithm - ,template<class IndexConfig> class IndexType> -class basic_managed_xsi_shared_memory; - -typedef basic_managed_xsi_shared_memory - <char - ,rbtree_best_fit<mutex_family> - ,iset_index> -managed_xsi_shared_memory; - -typedef basic_managed_xsi_shared_memory - <wchar_t - ,rbtree_best_fit<mutex_family> - ,iset_index> -wmanaged_xsi_shared_memory; - -#endif //#if defined(BOOST_INTERPROCESS_XSI_SHARED_MEMORY_OBJECTS) - -////////////////////////////////////////////////////////////////////////////// -// Fixed address shared memory -////////////////////////////////////////////////////////////////////////////// - -typedef basic_managed_shared_memory - <char - ,rbtree_best_fit<mutex_family, void*> - ,iset_index> -fixed_managed_shared_memory; - -typedef basic_managed_shared_memory - <wchar_t - ,rbtree_best_fit<mutex_family, void*> - ,iset_index> -wfixed_managed_shared_memory; - -////////////////////////////////////////////////////////////////////////////// -// Heap memory managed memory classes -////////////////////////////////////////////////////////////////////////////// - -template - <class CharType - ,class MemoryAlgorithm - ,template<class IndexConfig> class IndexType> -class basic_managed_heap_memory; - -typedef basic_managed_heap_memory - <char - ,rbtree_best_fit<null_mutex_family> - ,iset_index> -managed_heap_memory; - -typedef basic_managed_heap_memory - <wchar_t - ,rbtree_best_fit<null_mutex_family> - ,iset_index> -wmanaged_heap_memory; - -////////////////////////////////////////////////////////////////////////////// -// Mapped file managed memory classes -////////////////////////////////////////////////////////////////////////////// - -template - <class CharType - ,class MemoryAlgorithm - ,template<class IndexConfig> class IndexType> -class basic_managed_mapped_file; - -typedef basic_managed_mapped_file - <char - ,rbtree_best_fit<mutex_family> - ,iset_index> -managed_mapped_file; - -typedef basic_managed_mapped_file - <wchar_t - ,rbtree_best_fit<mutex_family> - ,iset_index> -wmanaged_mapped_file; - -////////////////////////////////////////////////////////////////////////////// -// Exceptions -////////////////////////////////////////////////////////////////////////////// - -class interprocess_exception; -class lock_exception; -class bad_alloc; - -////////////////////////////////////////////////////////////////////////////// -// Bufferstream -////////////////////////////////////////////////////////////////////////////// - -//bufferstream -template <class CharT - ,class CharTraits = std::char_traits<CharT> > -class basic_bufferbuf; - -template <class CharT - ,class CharTraits = std::char_traits<CharT> > -class basic_ibufferstream; - -template <class CharT - ,class CharTraits = std::char_traits<CharT> > -class basic_obufferstream; - -template <class CharT - ,class CharTraits = std::char_traits<CharT> > -class basic_bufferstream; - -////////////////////////////////////////////////////////////////////////////// -// Vectorstream -////////////////////////////////////////////////////////////////////////////// - -template <class CharVector - ,class CharTraits = std::char_traits<typename CharVector::value_type> > -class basic_vectorbuf; - -template <class CharVector - ,class CharTraits = std::char_traits<typename CharVector::value_type> > -class basic_ivectorstream; - -template <class CharVector - ,class CharTraits = std::char_traits<typename CharVector::value_type> > -class basic_ovectorstream; - -template <class CharVector - ,class CharTraits = std::char_traits<typename CharVector::value_type> > -class basic_vectorstream; - -////////////////////////////////////////////////////////////////////////////// -// Smart pointers -////////////////////////////////////////////////////////////////////////////// - -template<class T, class Deleter> -class scoped_ptr; - -template<class T, class VoidPointer> -class intrusive_ptr; - -template<class T, class VoidAllocator, class Deleter> -class shared_ptr; - -template<class T, class VoidAllocator, class Deleter> -class weak_ptr; - -////////////////////////////////////////////////////////////////////////////// -// IPC -////////////////////////////////////////////////////////////////////////////// - -template<class VoidPointer> -class message_queue_t; - -typedef message_queue_t<offset_ptr<void> > message_queue; - -}} //namespace boost { namespace interprocess { - -////////////////////////////////////////////////////////////////////////////// -// CONTAINERS -////////////////////////////////////////////////////////////////////////////// - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //#ifndef BOOST_INTERPROCESS_FWD_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/managed_shared_memory.hpp b/src/third_party/boost-1.56.0/boost/interprocess/managed_shared_memory.hpp deleted file mode 100644 index 348fe9148a0..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/managed_shared_memory.hpp +++ /dev/null @@ -1,221 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_SHARED_MEMORY_HPP -#define BOOST_INTERPROCESS_MANAGED_SHARED_MEMORY_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> - -#include <boost/interprocess/detail/managed_memory_impl.hpp> -#include <boost/interprocess/detail/managed_open_or_create_impl.hpp> -#include <boost/interprocess/shared_memory_object.hpp> -#include <boost/interprocess/creation_tags.hpp> -#include <boost/interprocess/permissions.hpp> -//These includes needed to fulfill default template parameters of -//predeclarations in interprocess_fwd.hpp -#include <boost/interprocess/mem_algo/rbtree_best_fit.hpp> -#include <boost/interprocess/sync/mutex_family.hpp> - -namespace boost { -namespace interprocess { - -namespace ipcdetail { - -template<class AllocationAlgorithm> -struct shmem_open_or_create -{ - typedef ipcdetail::managed_open_or_create_impl - < shared_memory_object, AllocationAlgorithm::Alignment, true, false> type; -}; - -} //namespace ipcdetail { - -//!A basic shared memory named object creation class. Initializes the -//!shared memory segment. Inherits all basic functionality from -//!basic_managed_memory_impl<CharType, AllocationAlgorithm, IndexType>*/ -template - < - class CharType, - class AllocationAlgorithm, - template<class IndexConfig> class IndexType - > -class basic_managed_shared_memory - : public ipcdetail::basic_managed_memory_impl - <CharType, AllocationAlgorithm, IndexType - ,ipcdetail::shmem_open_or_create<AllocationAlgorithm>::type::ManagedOpenOrCreateUserOffset> - , private ipcdetail::shmem_open_or_create<AllocationAlgorithm>::type -{ - /// @cond - typedef ipcdetail::basic_managed_memory_impl - <CharType, AllocationAlgorithm, IndexType, - ipcdetail::shmem_open_or_create<AllocationAlgorithm>::type::ManagedOpenOrCreateUserOffset> base_t; - typedef typename ipcdetail::shmem_open_or_create<AllocationAlgorithm>::type base2_t; - - typedef ipcdetail::create_open_func<base_t> create_open_func_t; - - basic_managed_shared_memory *get_this_pointer() - { return this; } - - public: - typedef shared_memory_object device_type; - typedef typename base_t::size_type size_type; - - private: - typedef typename base_t::char_ptr_holder_t char_ptr_holder_t; - BOOST_MOVABLE_BUT_NOT_COPYABLE(basic_managed_shared_memory) - /// @endcond - - public: //functions - - //!Destroys *this and indicates that the calling process is finished using - //!the resource. The destructor function will deallocate - //!any system resources allocated by the system for use by this process for - //!this resource. The resource can still be opened again calling - //!the open constructor overload. To erase the resource from the system - //!use remove(). - ~basic_managed_shared_memory() - {} - - //!Default constructor. Does nothing. - //!Useful in combination with move semantics - basic_managed_shared_memory() - {} - - //!Creates shared memory and creates and places the segment manager. - //!This can throw. - basic_managed_shared_memory(create_only_t, const char *name, - size_type size, const void *addr = 0, const permissions& perm = permissions()) - : base_t() - , base2_t(create_only, name, size, read_write, addr, - create_open_func_t(get_this_pointer(), ipcdetail::DoCreate), perm) - {} - - //!Creates shared memory and creates and places the segment manager if - //!segment was not created. If segment was created it connects to the - //!segment. - //!This can throw. - basic_managed_shared_memory (open_or_create_t, - const char *name, size_type size, - const void *addr = 0, const permissions& perm = permissions()) - : base_t() - , base2_t(open_or_create, name, size, read_write, addr, - create_open_func_t(get_this_pointer(), - ipcdetail::DoOpenOrCreate), perm) - {} - - //!Connects to a created shared memory and its segment manager. - //!in copy_on_write mode. - //!This can throw. - basic_managed_shared_memory (open_copy_on_write_t, const char* name, - const void *addr = 0) - : base_t() - , base2_t(open_only, name, copy_on_write, addr, - create_open_func_t(get_this_pointer(), - ipcdetail::DoOpen)) - {} - - //!Connects to a created shared memory and its segment manager. - //!in read-only mode. - //!This can throw. - basic_managed_shared_memory (open_read_only_t, const char* name, - const void *addr = 0) - : base_t() - , base2_t(open_only, name, read_only, addr, - create_open_func_t(get_this_pointer(), - ipcdetail::DoOpen)) - {} - - //!Connects to a created shared memory and its segment manager. - //!This can throw. - basic_managed_shared_memory (open_only_t, const char* name, - const void *addr = 0) - : base_t() - , base2_t(open_only, name, read_write, addr, - create_open_func_t(get_this_pointer(), - ipcdetail::DoOpen)) - {} - - //!Moves the ownership of "moved"'s managed memory to *this. - //!Does not throw - basic_managed_shared_memory(BOOST_RV_REF(basic_managed_shared_memory) moved) - { - basic_managed_shared_memory tmp; - this->swap(moved); - tmp.swap(moved); - } - - //!Moves the ownership of "moved"'s managed memory to *this. - //!Does not throw - basic_managed_shared_memory &operator=(BOOST_RV_REF(basic_managed_shared_memory) moved) - { - basic_managed_shared_memory tmp(boost::move(moved)); - this->swap(tmp); - return *this; - } - - //!Swaps the ownership of the managed shared memories managed by *this and other. - //!Never throws. - void swap(basic_managed_shared_memory &other) - { - base_t::swap(other); - base2_t::swap(other); - } - - //!Tries to resize the managed shared memory object so that we have - //!room for more objects. - //! - //!This function is not synchronized so no other thread or process should - //!be reading or writing the file - static bool grow(const char *shmname, size_type extra_bytes) - { - return base_t::template grow - <basic_managed_shared_memory>(shmname, extra_bytes); - } - - //!Tries to resize the managed shared memory to minimized the size of the file. - //! - //!This function is not synchronized so no other thread or process should - //!be reading or writing the file - static bool shrink_to_fit(const char *shmname) - { - return base_t::template shrink_to_fit - <basic_managed_shared_memory>(shmname); - } - /// @cond - - //!Tries to find a previous named allocation address. Returns a memory - //!buffer and the object count. If not found returned pointer is 0. - //!Never throws. - template <class T> - std::pair<T*, size_type> find (char_ptr_holder_t name) - { - if(base2_t::get_mapped_region().get_mode() == read_only){ - return base_t::template find_no_lock<T>(name); - } - else{ - return base_t::template find<T>(name); - } - } - - /// @endcond -}; - -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //BOOST_INTERPROCESS_MANAGED_SHARED_MEMORY_HPP - diff --git a/src/third_party/boost-1.56.0/boost/interprocess/mapped_region.hpp b/src/third_party/boost-1.56.0/boost/interprocess/mapped_region.hpp deleted file mode 100644 index 4513bd61493..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/mapped_region.hpp +++ /dev/null @@ -1,910 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_MAPPED_REGION_HPP -#define BOOST_INTERPROCESS_MAPPED_REGION_HPP - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> - -#include <boost/interprocess/interprocess_fwd.hpp> -#include <boost/interprocess/exceptions.hpp> -#include <boost/move/move.hpp> -#include <boost/interprocess/detail/utilities.hpp> -#include <boost/interprocess/detail/os_file_functions.hpp> -#include <string> -#include <boost/cstdint.hpp> -#include <boost/assert.hpp> -//Some Unixes use caddr_t instead of void * in madvise -// SunOS Tru64 HP-UX AIX -#if defined(sun) || defined(__sun) || defined(__osf__) || defined(__osf) || defined(_hpux) || defined(hpux) || defined(_AIX) -#define BOOST_INTERPROCESS_MADVISE_USES_CADDR_T -#include <sys/types.h> -#endif - -//A lot of UNIXes have destructive semantics for MADV_DONTNEED, so -//we need to be careful to allow it. -#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__) -#define BOOST_INTERPROCESS_MADV_DONTNEED_HAS_NONDESTRUCTIVE_SEMANTICS -#endif - -#if defined (BOOST_INTERPROCESS_WINDOWS) -# include <boost/interprocess/detail/win32_api.hpp> -# include <boost/interprocess/sync/windows/sync_utils.hpp> -#else -# ifdef BOOST_HAS_UNISTD_H -# include <fcntl.h> -# include <sys/mman.h> //mmap -# include <unistd.h> -# include <sys/stat.h> -# include <sys/types.h> -# if defined(BOOST_INTERPROCESS_XSI_SHARED_MEMORY_OBJECTS) -# include <sys/shm.h> //System V shared memory... -# endif -# include <boost/assert.hpp> -# else -# error Unknown platform -# endif - -#endif //#if defined (BOOST_INTERPROCESS_WINDOWS) - -//!\file -//!Describes mapped region class - -namespace boost { -namespace interprocess { - -/// @cond - -//Solaris declares madvise only in some configurations but defines MADV_XXX, a bit confusing. -//Predeclare it here to avoid any compilation error -#if (defined(sun) || defined(__sun)) && defined(MADV_NORMAL) -extern "C" int madvise(caddr_t, size_t, int); -#endif - -namespace ipcdetail{ class interprocess_tester; } -namespace ipcdetail{ class raw_mapped_region_creator; } - -/// @endcond - -//!The mapped_region class represents a portion or region created from a -//!memory_mappable object. -//! -//!The OS can map a region bigger than the requested one, as region must -//!be multiple of the page size, but mapped_region will always refer to -//!the region specified by the user. -class mapped_region -{ - /// @cond - //Non-copyable - BOOST_MOVABLE_BUT_NOT_COPYABLE(mapped_region) - /// @endcond - - public: - - //!Creates a mapping region of the mapped memory "mapping", starting in - //!offset "offset", and the mapping's size will be "size". The mapping - //!can be opened for read only, read-write or copy-on-write. - //! - //!If an address is specified, both the offset and the address must be - //!multiples of the page size. - //! - //!The map is created using "default_map_options". This flag is OS - //!dependant and it should not be changed unless the user needs to - //!specify special options. - //! - //!In Windows systems "map_options" is a DWORD value passed as - //!"dwDesiredAccess" to "MapViewOfFileEx". If "default_map_options" is passed - //!it's initialized to zero. "map_options" is XORed with FILE_MAP_[COPY|READ|WRITE]. - //! - //!In UNIX systems and POSIX mappings "map_options" is an int value passed as "flags" - //!to "mmap". If "default_map_options" is specified it's initialized to MAP_NOSYNC - //!if that option exists and to zero otherwise. "map_options" XORed with MAP_PRIVATE or MAP_SHARED. - //! - //!In UNIX systems and XSI mappings "map_options" is an int value passed as "shmflg" - //!to "shmat". If "default_map_options" is specified it's initialized to zero. - //!"map_options" is XORed with SHM_RDONLY if needed. - //! - //!The OS could allocate more pages than size/page_size(), but get_address() - //!will always return the address passed in this function (if not null) and - //!get_size() will return the specified size. - template<class MemoryMappable> - mapped_region(const MemoryMappable& mapping - ,mode_t mode - ,offset_t offset = 0 - ,std::size_t size = 0 - ,const void *address = 0 - ,map_options_t map_options = default_map_options); - - //!Default constructor. Address will be 0 (nullptr). - //!Size will be 0. - //!Does not throw - mapped_region(); - - //!Move constructor. *this will be constructed taking ownership of "other"'s - //!region and "other" will be left in default constructor state. - mapped_region(BOOST_RV_REF(mapped_region) other) - #if defined (BOOST_INTERPROCESS_WINDOWS) - : m_base(0), m_size(0) - , m_page_offset(0) - , m_mode(read_only) - , m_file_or_mapping_hnd(ipcdetail::invalid_file()) - #else - : m_base(0), m_size(0), m_page_offset(0), m_mode(read_only), m_is_xsi(false) - #endif - { this->swap(other); } - - //!Destroys the mapped region. - //!Does not throw - ~mapped_region(); - - //!Move assignment. If *this owns a memory mapped region, it will be - //!destroyed and it will take ownership of "other"'s memory mapped region. - mapped_region &operator=(BOOST_RV_REF(mapped_region) other) - { - mapped_region tmp(boost::move(other)); - this->swap(tmp); - return *this; - } - - //!Swaps the mapped_region with another - //!mapped region - void swap(mapped_region &other); - - //!Returns the size of the mapping. Never throws. - std::size_t get_size() const; - - //!Returns the base address of the mapping. - //!Never throws. - void* get_address() const; - - //!Returns the mode of the mapping used to construct the mapped region. - //!Never throws. - mode_t get_mode() const; - - //!Flushes to the disk a byte range within the mapped memory. - //!If 'async' is true, the function will return before flushing operation is completed - //!If 'async' is false, function will return once data has been written into the underlying - //!device (i.e., in mapped files OS cached information is written to disk). - //!Never throws. Returns false if operation could not be performed. - bool flush(std::size_t mapping_offset = 0, std::size_t numbytes = 0, bool async = true); - - //!Shrinks current mapped region. If after shrinking there is no longer need for a previously - //!mapped memory page, accessing that page can trigger a segmentation fault. - //!Depending on the OS, this operation might fail (XSI shared memory), it can decommit storage - //!and free a portion of the virtual address space (e.g.POSIX) or this - //!function can release some physical memory wihout freeing any virtual address space(Windows). - //!Returns true on success. Never throws. - bool shrink_by(std::size_t bytes, bool from_back = true); - - //!This enum specifies region usage behaviors that an application can specify - //!to the mapped region implementation. - enum advice_types{ - //!Specifies that the application has no advice to give on its behavior with respect to - //!the region. It is the default characteristic if no advice is given for a range of memory. - advice_normal, - //!Specifies that the application expects to access the region sequentially from - //!lower addresses to higher addresses. The implementation can lower the priority of - //!preceding pages within the region once a page have been accessed. - advice_sequential, - //!Specifies that the application expects to access the region in a random order, - //!and prefetching is likely not advantageous. - advice_random, - //!Specifies that the application expects to access the region in the near future. - //!The implementation can prefetch pages of the region. - advice_willneed, - //!Specifies that the application expects that it will not access the region in the near future. - //!The implementation can unload pages within the range to save system resources. - advice_dontneed - }; - - //!Advises the implementation on the expected behavior of the application with respect to the data - //!in the region. The implementation may use this information to optimize handling of the region data. - //!This function has no effect on the semantics of access to memory in the region, although it may affect - //!the performance of access. - //!If the advise type is not known to the implementation, the function returns false. True otherwise. - bool advise(advice_types advise); - - //!Returns the size of the page. This size is the minimum memory that - //!will be used by the system when mapping a memory mappable source and - //!will restrict the address and the offset to map. - static std::size_t get_page_size(); - - /// @cond - private: - //!Closes a previously opened memory mapping. Never throws - void priv_close(); - - void* priv_map_address() const; - std::size_t priv_map_size() const; - bool priv_flush_param_check(std::size_t mapping_offset, void *&addr, std::size_t &numbytes) const; - bool priv_shrink_param_check(std::size_t bytes, bool from_back, void *&shrink_page_start, std::size_t &shrink_page_bytes); - static void priv_size_from_mapping_size - (offset_t mapping_size, offset_t offset, offset_t page_offset, std::size_t &size); - static offset_t priv_page_offset_addr_fixup(offset_t page_offset, const void *&addr); - - template<int dummy> - struct page_size_holder - { - static const std::size_t PageSize; - static std::size_t get_page_size(); - }; - - void* m_base; - std::size_t m_size; - std::size_t m_page_offset; - mode_t m_mode; - #if defined(BOOST_INTERPROCESS_WINDOWS) - file_handle_t m_file_or_mapping_hnd; - #else - bool m_is_xsi; - #endif - - friend class ipcdetail::interprocess_tester; - friend class ipcdetail::raw_mapped_region_creator; - void dont_close_on_destruction(); - #if defined(BOOST_INTERPROCESS_WINDOWS) && !defined(BOOST_INTERPROCESS_FORCE_GENERIC_EMULATION) - template<int Dummy> - static void destroy_syncs_in_range(const void *addr, std::size_t size); - #endif - /// @endcond -}; - -///@cond - -inline void swap(mapped_region &x, mapped_region &y) -{ x.swap(y); } - -inline mapped_region::~mapped_region() -{ this->priv_close(); } - -inline std::size_t mapped_region::get_size() const -{ return m_size; } - -inline mode_t mapped_region::get_mode() const -{ return m_mode; } - -inline void* mapped_region::get_address() const -{ return m_base; } - -inline void* mapped_region::priv_map_address() const -{ return static_cast<char*>(m_base) - m_page_offset; } - -inline std::size_t mapped_region::priv_map_size() const -{ return m_size + m_page_offset; } - -inline bool mapped_region::priv_flush_param_check - (std::size_t mapping_offset, void *&addr, std::size_t &numbytes) const -{ - //Check some errors - if(m_base == 0) - return false; - - if(mapping_offset >= m_size || (mapping_offset + numbytes) > m_size){ - return false; - } - - //Update flush size if the user does not provide it - if(numbytes == 0){ - numbytes = m_size - mapping_offset; - } - addr = (char*)this->priv_map_address() + mapping_offset; - numbytes += m_page_offset; - return true; -} - -inline bool mapped_region::priv_shrink_param_check - (std::size_t bytes, bool from_back, void *&shrink_page_start, std::size_t &shrink_page_bytes) -{ - //Check some errors - if(m_base == 0 || bytes > m_size){ - return false; - } - else if(bytes == m_size){ - this->priv_close(); - return true; - } - else{ - const std::size_t page_size = mapped_region::get_page_size(); - if(from_back){ - const std::size_t new_pages = (m_size + m_page_offset - bytes - 1)/page_size + 1; - shrink_page_start = static_cast<char*>(this->priv_map_address()) + new_pages*page_size; - shrink_page_bytes = m_page_offset + m_size - new_pages*page_size; - m_size -= bytes; - } - else{ - shrink_page_start = this->priv_map_address(); - m_page_offset += bytes; - shrink_page_bytes = (m_page_offset/page_size)*page_size; - m_page_offset = m_page_offset % page_size; - m_size -= bytes; - m_base = static_cast<char *>(m_base) + bytes; - BOOST_ASSERT(shrink_page_bytes%page_size == 0); - } - return true; - } -} - -inline void mapped_region::priv_size_from_mapping_size - (offset_t mapping_size, offset_t offset, offset_t page_offset, std::size_t &size) -{ - //Check if mapping size fits in the user address space - //as offset_t is the maximum file size and its signed. - if(mapping_size < offset || - boost::uintmax_t(mapping_size - (offset - page_offset)) > - boost::uintmax_t(std::size_t(-1))){ - error_info err(size_error); - throw interprocess_exception(err); - } - size = static_cast<std::size_t>(mapping_size - (offset - page_offset)); -} - -inline offset_t mapped_region::priv_page_offset_addr_fixup(offset_t offset, const void *&address) -{ - //We can't map any offset so we have to obtain system's - //memory granularity - const std::size_t page_size = mapped_region::get_page_size(); - - //We calculate the difference between demanded and valid offset - //(always less than a page in std::size_t, thus, representable by std::size_t) - const std::size_t page_offset = - static_cast<std::size_t>(offset - (offset / page_size) * page_size); - //Update the mapping address - if(address){ - address = static_cast<const char*>(address) - page_offset; - } - return page_offset; -} - -#if defined (BOOST_INTERPROCESS_WINDOWS) - -inline mapped_region::mapped_region() - : m_base(0), m_size(0), m_page_offset(0), m_mode(read_only) - , m_file_or_mapping_hnd(ipcdetail::invalid_file()) -{} - -template<int dummy> -inline std::size_t mapped_region::page_size_holder<dummy>::get_page_size() -{ - winapi::system_info info; - get_system_info(&info); - return std::size_t(info.dwAllocationGranularity); -} - -template<class MemoryMappable> -inline mapped_region::mapped_region - (const MemoryMappable &mapping - ,mode_t mode - ,offset_t offset - ,std::size_t size - ,const void *address - ,map_options_t map_options) - : m_base(0), m_size(0), m_page_offset(0), m_mode(mode) - , m_file_or_mapping_hnd(ipcdetail::invalid_file()) -{ - mapping_handle_t mhandle = mapping.get_mapping_handle(); - { - file_handle_t native_mapping_handle = 0; - - //Set accesses - //For "create_file_mapping" - unsigned long protection = 0; - //For "mapviewoffile" - unsigned long map_access = map_options == default_map_options ? 0 : map_options; - - switch(mode) - { - case read_only: - case read_private: - protection |= winapi::page_readonly; - map_access |= winapi::file_map_read; - break; - case read_write: - protection |= winapi::page_readwrite; - map_access |= winapi::file_map_write; - break; - case copy_on_write: - protection |= winapi::page_writecopy; - map_access |= winapi::file_map_copy; - break; - default: - { - error_info err(mode_error); - throw interprocess_exception(err); - } - break; - } - - //For file mapping (including emulated shared memory through temporary files), - //the device is a file handle so we need to obtain file's size and call create_file_mapping - //to obtain the mapping handle. - //For files we don't need the file mapping after mapping the memory, as the file is there - //so we'll program the handle close - void * handle_to_close = winapi::invalid_handle_value; - if(!mhandle.is_shm){ - //Create mapping handle - native_mapping_handle = winapi::create_file_mapping - ( ipcdetail::file_handle_from_mapping_handle(mapping.get_mapping_handle()) - , protection, 0, 0, 0); - - //Check if all is correct - if(!native_mapping_handle){ - error_info err = winapi::get_last_error(); - throw interprocess_exception(err); - } - handle_to_close = native_mapping_handle; - } - else{ - //For windows_shared_memory the device handle is already a mapping handle - //and we need to maintain it - native_mapping_handle = mhandle.handle; - } - //RAII handle close on scope exit - const winapi::handle_closer close_handle(handle_to_close); - (void)close_handle; - - const offset_t page_offset = priv_page_offset_addr_fixup(offset, address); - - //Obtain mapping size if user provides 0 size - if(size == 0){ - offset_t mapping_size; - if(!winapi::get_file_mapping_size(native_mapping_handle, mapping_size)){ - error_info err = winapi::get_last_error(); - throw interprocess_exception(err); - } - //This can throw - priv_size_from_mapping_size(mapping_size, offset, page_offset, size); - } - - //Map with new offsets and size - void *base = winapi::map_view_of_file_ex - (native_mapping_handle, - map_access, - offset - page_offset, - static_cast<std::size_t>(page_offset + size), - const_cast<void*>(address)); - //Check error - if(!base){ - error_info err = winapi::get_last_error(); - throw interprocess_exception(err); - } - - //Calculate new base for the user - m_base = static_cast<char*>(base) + page_offset; - m_page_offset = page_offset; - m_size = size; - } - //Windows shared memory needs the duplication of the handle if we want to - //make mapped_region independent from the mappable device - // - //For mapped files, we duplicate the file handle to be able to FlushFileBuffers - if(!winapi::duplicate_current_process_handle(mhandle.handle, &m_file_or_mapping_hnd)){ - error_info err = winapi::get_last_error(); - this->priv_close(); - throw interprocess_exception(err); - } -} - -inline bool mapped_region::flush(std::size_t mapping_offset, std::size_t numbytes, bool async) -{ - void *addr; - if(!this->priv_flush_param_check(mapping_offset, addr, numbytes)){ - return false; - } - //Flush it all - if(!winapi::flush_view_of_file(addr, numbytes)){ - return false; - } - //m_file_or_mapping_hnd can be a file handle or a mapping handle. - //so flushing file buffers has only sense for files... - else if(!async && m_file_or_mapping_hnd != winapi::invalid_handle_value && - winapi::get_file_type(m_file_or_mapping_hnd) == winapi::file_type_disk){ - return winapi::flush_file_buffers(m_file_or_mapping_hnd); - } - return true; -} - -inline bool mapped_region::shrink_by(std::size_t bytes, bool from_back) -{ - void *shrink_page_start; - std::size_t shrink_page_bytes; - if(!this->priv_shrink_param_check(bytes, from_back, shrink_page_start, shrink_page_bytes)){ - return false; - } - else if(shrink_page_bytes){ - //In Windows, we can't decommit the storage or release the virtual address space, - //the best we can do is try to remove some memory from the process working set. - //With a bit of luck we can free some physical memory. - unsigned long old_protect_ignored; - bool b_ret = winapi::virtual_unlock(shrink_page_start, shrink_page_bytes) - || (winapi::get_last_error() == winapi::error_not_locked); - (void)old_protect_ignored; - //Change page protection to forbid any further access - b_ret = b_ret && winapi::virtual_protect - (shrink_page_start, shrink_page_bytes, winapi::page_noaccess, old_protect_ignored); - return b_ret; - } - else{ - return true; - } -} - -inline bool mapped_region::advise(advice_types) -{ - //Windows has no madvise/posix_madvise equivalent - return false; -} - -inline void mapped_region::priv_close() -{ - if(m_base){ - void *addr = this->priv_map_address(); - #if !defined(BOOST_INTERPROCESS_FORCE_GENERIC_EMULATION) - mapped_region::destroy_syncs_in_range<0>(addr, m_size); - #endif - winapi::unmap_view_of_file(addr); - m_base = 0; - } - if(m_file_or_mapping_hnd != ipcdetail::invalid_file()){ - winapi::close_handle(m_file_or_mapping_hnd); - m_file_or_mapping_hnd = ipcdetail::invalid_file(); - } -} - -inline void mapped_region::dont_close_on_destruction() -{} - -#else //#if defined (BOOST_INTERPROCESS_WINDOWS) - -inline mapped_region::mapped_region() - : m_base(0), m_size(0), m_page_offset(0), m_mode(read_only), m_is_xsi(false) -{} - -template<int dummy> -inline std::size_t mapped_region::page_size_holder<dummy>::get_page_size() -{ return std::size_t(sysconf(_SC_PAGESIZE)); } - -template<class MemoryMappable> -inline mapped_region::mapped_region - ( const MemoryMappable &mapping - , mode_t mode - , offset_t offset - , std::size_t size - , const void *address - , map_options_t map_options) - : m_base(0), m_size(0), m_page_offset(0), m_mode(mode), m_is_xsi(false) -{ - mapping_handle_t map_hnd = mapping.get_mapping_handle(); - - //Some systems dont' support XSI shared memory - #ifdef BOOST_INTERPROCESS_XSI_SHARED_MEMORY_OBJECTS - if(map_hnd.is_xsi){ - //Get the size - ::shmid_ds xsi_ds; - int ret = ::shmctl(map_hnd.handle, IPC_STAT, &xsi_ds); - if(ret == -1){ - error_info err(system_error_code()); - throw interprocess_exception(err); - } - //Compare sizess - if(size == 0){ - size = (std::size_t)xsi_ds.shm_segsz; - } - else if(size != (std::size_t)xsi_ds.shm_segsz){ - error_info err(size_error); - throw interprocess_exception(err); - } - //Calculate flag - int flag = map_options == default_map_options ? 0 : map_options; - if(m_mode == read_only){ - flag |= SHM_RDONLY; - } - else if(m_mode != read_write){ - error_info err(mode_error); - throw interprocess_exception(err); - } - //Attach memory - void *base = ::shmat(map_hnd.handle, (void*)address, flag); - if(base == (void*)-1){ - error_info err(system_error_code()); - throw interprocess_exception(err); - } - //Update members - m_base = base; - m_size = size; - m_mode = mode; - m_page_offset = 0; - m_is_xsi = true; - return; - } - #endif //ifdef BOOST_INTERPROCESS_XSI_SHARED_MEMORY_OBJECTS - - //We calculate the difference between demanded and valid offset - const offset_t page_offset = priv_page_offset_addr_fixup(offset, address); - - if(size == 0){ - struct ::stat buf; - if(0 != fstat(map_hnd.handle, &buf)){ - error_info err(system_error_code()); - throw interprocess_exception(err); - } - //This can throw - priv_size_from_mapping_size(buf.st_size, offset, page_offset, size); - } - - #ifdef MAP_NOSYNC - #define BOOST_INTERPROCESS_MAP_NOSYNC MAP_NOSYNC - #else - #define BOOST_INTERPROCESS_MAP_NOSYNC 0 - #endif //MAP_NOSYNC - - //Create new mapping - int prot = 0; - int flags = map_options == default_map_options ? BOOST_INTERPROCESS_MAP_NOSYNC : map_options; - - #undef BOOST_INTERPROCESS_MAP_NOSYNC - - switch(mode) - { - case read_only: - prot |= PROT_READ; - flags |= MAP_SHARED; - break; - - case read_private: - prot |= (PROT_READ); - flags |= MAP_PRIVATE; - break; - - case read_write: - prot |= (PROT_WRITE | PROT_READ); - flags |= MAP_SHARED; - break; - - case copy_on_write: - prot |= (PROT_WRITE | PROT_READ); - flags |= MAP_PRIVATE; - break; - - default: - { - error_info err(mode_error); - throw interprocess_exception(err); - } - break; - } - - //Map it to the address space - void* base = mmap ( const_cast<void*>(address) - , static_cast<std::size_t>(page_offset + size) - , prot - , flags - , mapping.get_mapping_handle().handle - , offset - page_offset); - - //Check if mapping was successful - if(base == MAP_FAILED){ - error_info err = system_error_code(); - throw interprocess_exception(err); - } - - //Calculate new base for the user - m_base = static_cast<char*>(base) + page_offset; - m_page_offset = page_offset; - m_size = size; - - //Check for fixed mapping error - if(address && (base != address)){ - error_info err(busy_error); - this->priv_close(); - throw interprocess_exception(err); - } -} - -inline bool mapped_region::shrink_by(std::size_t bytes, bool from_back) -{ - void *shrink_page_start = 0; - std::size_t shrink_page_bytes = 0; - if(m_is_xsi || !this->priv_shrink_param_check(bytes, from_back, shrink_page_start, shrink_page_bytes)){ - return false; - } - else if(shrink_page_bytes){ - //In UNIX we can decommit and free virtual address space. - return 0 == munmap(shrink_page_start, shrink_page_bytes); - } - else{ - return true; - } -} - -inline bool mapped_region::flush(std::size_t mapping_offset, std::size_t numbytes, bool async) -{ - void *addr; - if(m_is_xsi || !this->priv_flush_param_check(mapping_offset, addr, numbytes)){ - return false; - } - //Flush it all - return msync(addr, numbytes, async ? MS_ASYNC : MS_SYNC) == 0; -} - -inline bool mapped_region::advise(advice_types advice) -{ - int unix_advice = 0; - //Modes; 0: none, 2: posix, 1: madvise - const unsigned int mode_none = 0; - const unsigned int mode_padv = 1; - const unsigned int mode_madv = 2; - // Suppress "unused variable" warnings - (void)mode_padv; - (void)mode_madv; - unsigned int mode = mode_none; - //Choose advice either from POSIX (preferred) or native Unix - switch(advice){ - case advice_normal: - #if defined(POSIX_MADV_NORMAL) - unix_advice = POSIX_MADV_NORMAL; - mode = mode_padv; - #elif defined(MADV_NORMAL) - unix_advice = MADV_NORMAL; - mode = mode_madv; - #endif - break; - case advice_sequential: - #if defined(POSIX_MADV_SEQUENTIAL) - unix_advice = POSIX_MADV_SEQUENTIAL; - mode = mode_padv; - #elif defined(MADV_SEQUENTIAL) - unix_advice = MADV_SEQUENTIAL; - mode = mode_madv; - #endif - break; - case advice_random: - #if defined(POSIX_MADV_RANDOM) - unix_advice = POSIX_MADV_RANDOM; - mode = mode_padv; - #elif defined(MADV_RANDOM) - unix_advice = MADV_RANDOM; - mode = mode_madv; - #endif - break; - case advice_willneed: - #if defined(POSIX_MADV_WILLNEED) - unix_advice = POSIX_MADV_WILLNEED; - mode = mode_padv; - #elif defined(MADV_WILLNEED) - unix_advice = MADV_WILLNEED; - mode = mode_madv; - #endif - break; - case advice_dontneed: - #if defined(POSIX_MADV_DONTNEED) - unix_advice = POSIX_MADV_DONTNEED; - mode = mode_padv; - #elif defined(MADV_DONTNEED) && defined(BOOST_INTERPROCESS_MADV_DONTNEED_HAS_NONDESTRUCTIVE_SEMANTICS) - unix_advice = MADV_DONTNEED; - mode = mode_madv; - #endif - break; - default: - return false; - } - switch(mode){ - #if defined(POSIX_MADV_NORMAL) - case mode_padv: - return 0 == posix_madvise(this->priv_map_address(), this->priv_map_size(), unix_advice); - #endif - #if defined(MADV_NORMAL) - case mode_madv: - return 0 == madvise( - #if defined(BOOST_INTERPROCESS_MADVISE_USES_CADDR_T) - (caddr_t) - #endif - this->priv_map_address(), this->priv_map_size(), unix_advice); - #endif - default: - return false; - - } -} - -inline void mapped_region::priv_close() -{ - if(m_base != 0){ - #ifdef BOOST_INTERPROCESS_XSI_SHARED_MEMORY_OBJECTS - if(m_is_xsi){ - int ret = ::shmdt(m_base); - BOOST_ASSERT(ret == 0); - (void)ret; - return; - } - #endif //#ifdef BOOST_INTERPROCESS_XSI_SHARED_MEMORY_OBJECTS - munmap(this->priv_map_address(), this->priv_map_size()); - m_base = 0; - } -} - -inline void mapped_region::dont_close_on_destruction() -{ m_base = 0; } - -#endif //#if defined (BOOST_INTERPROCESS_WINDOWS) - -template<int dummy> -const std::size_t mapped_region::page_size_holder<dummy>::PageSize - = mapped_region::page_size_holder<dummy>::get_page_size(); - -inline std::size_t mapped_region::get_page_size() -{ - if(!page_size_holder<0>::PageSize) - return page_size_holder<0>::get_page_size(); - else - return page_size_holder<0>::PageSize; -} - -inline void mapped_region::swap(mapped_region &other) -{ - ipcdetail::do_swap(this->m_base, other.m_base); - ipcdetail::do_swap(this->m_size, other.m_size); - ipcdetail::do_swap(this->m_page_offset, other.m_page_offset); - ipcdetail::do_swap(this->m_mode, other.m_mode); - #if defined (BOOST_INTERPROCESS_WINDOWS) - ipcdetail::do_swap(this->m_file_or_mapping_hnd, other.m_file_or_mapping_hnd); - #else - ipcdetail::do_swap(this->m_is_xsi, other.m_is_xsi); - #endif -} - -//!No-op functor -struct null_mapped_region_function -{ - bool operator()(void *, std::size_t , bool) const - { return true; } - - std::size_t get_min_size() const - { return 0; } -}; - -/// @endcond - -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //BOOST_INTERPROCESS_MAPPED_REGION_HPP - -#if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) - -#ifndef BOOST_INTERPROCESS_MAPPED_REGION_EXT_HPP -#define BOOST_INTERPROCESS_MAPPED_REGION_EXT_HPP - -#if defined(BOOST_INTERPROCESS_WINDOWS) && !defined(BOOST_INTERPROCESS_FORCE_GENERIC_EMULATION) -# include <boost/interprocess/sync/windows/sync_utils.hpp> -# include <boost/interprocess/detail/windows_intermodule_singleton.hpp> - -namespace boost { -namespace interprocess { - -template<int Dummy> -inline void mapped_region::destroy_syncs_in_range(const void *addr, std::size_t size) -{ - ipcdetail::sync_handles &handles = - ipcdetail::windows_intermodule_singleton<ipcdetail::sync_handles>::get(); - handles.destroy_syncs_in_range(addr, size); -} - -} //namespace interprocess { -} //namespace boost { - -#endif //defined(BOOST_INTERPROCESS_WINDOWS) && !defined(BOOST_INTERPROCESS_FORCE_GENERIC_EMULATION) - -#endif //#ifdef BOOST_INTERPROCESS_MAPPED_REGION_EXT_HPP - -#endif //#if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) - diff --git a/src/third_party/boost-1.56.0/boost/interprocess/mem_algo/detail/mem_algo_common.hpp b/src/third_party/boost-1.56.0/boost/interprocess/mem_algo/detail/mem_algo_common.hpp deleted file mode 100644 index 6200b373e3e..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/mem_algo/detail/mem_algo_common.hpp +++ /dev/null @@ -1,591 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_DETAIL_MEM_ALGO_COMMON_HPP -#define BOOST_INTERPROCESS_DETAIL_MEM_ALGO_COMMON_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> - -#include <boost/interprocess/interprocess_fwd.hpp> -#include <boost/interprocess/containers/allocation_type.hpp> -#include <boost/interprocess/detail/utilities.hpp> -#include <boost/interprocess/detail/type_traits.hpp> -#include <boost/interprocess/detail/math_functions.hpp> -#include <boost/interprocess/detail/utilities.hpp> -#include <boost/move/move.hpp> -#include <boost/interprocess/detail/min_max.hpp> -#include <boost/container/detail/multiallocation_chain.hpp> -#include <boost/assert.hpp> -#include <boost/static_assert.hpp> -#include <algorithm> -#include <utility> -#include <iterator> -#include <boost/assert.hpp> - -//!\file -//!Implements common operations for memory algorithms. - -namespace boost { -namespace interprocess { -namespace ipcdetail { - -template<class VoidPointer> -class basic_multiallocation_chain - : public boost::container::container_detail:: - basic_multiallocation_chain<VoidPointer> -{ - BOOST_MOVABLE_BUT_NOT_COPYABLE(basic_multiallocation_chain) - typedef boost::container::container_detail:: - basic_multiallocation_chain<VoidPointer> base_t; - public: - - basic_multiallocation_chain() - : base_t() - {} - - basic_multiallocation_chain(BOOST_RV_REF(basic_multiallocation_chain) other) - : base_t(::boost::move(static_cast<base_t&>(other))) - {} - - basic_multiallocation_chain& operator=(BOOST_RV_REF(basic_multiallocation_chain) other) - { - this->base_t::operator=(::boost::move(static_cast<base_t&>(other))); - return *this; - } - - void *pop_front() - { - return boost::interprocess::ipcdetail::to_raw_pointer(this->base_t::pop_front()); - } -}; - - -//!This class implements several allocation functions shared by different algorithms -//!(aligned allocation, multiple allocation...). -template<class MemoryAlgorithm> -class memory_algorithm_common -{ - public: - typedef typename MemoryAlgorithm::void_pointer void_pointer; - typedef typename MemoryAlgorithm::block_ctrl block_ctrl; - typedef typename MemoryAlgorithm::multiallocation_chain multiallocation_chain; - typedef memory_algorithm_common<MemoryAlgorithm> this_type; - typedef typename MemoryAlgorithm::size_type size_type; - - static const size_type Alignment = MemoryAlgorithm::Alignment; - static const size_type MinBlockUnits = MemoryAlgorithm::MinBlockUnits; - static const size_type AllocatedCtrlBytes = MemoryAlgorithm::AllocatedCtrlBytes; - static const size_type AllocatedCtrlUnits = MemoryAlgorithm::AllocatedCtrlUnits; - static const size_type BlockCtrlBytes = MemoryAlgorithm::BlockCtrlBytes; - static const size_type BlockCtrlUnits = MemoryAlgorithm::BlockCtrlUnits; - static const size_type UsableByPreviousChunk = MemoryAlgorithm::UsableByPreviousChunk; - - static void assert_alignment(const void *ptr) - { assert_alignment((std::size_t)ptr); } - - static void assert_alignment(size_type uint_ptr) - { - (void)uint_ptr; - BOOST_ASSERT(uint_ptr % Alignment == 0); - } - - static bool check_alignment(const void *ptr) - { return (((std::size_t)ptr) % Alignment == 0); } - - static size_type ceil_units(size_type size) - { return get_rounded_size(size, Alignment)/Alignment; } - - static size_type floor_units(size_type size) - { return size/Alignment; } - - static size_type multiple_of_units(size_type size) - { return get_rounded_size(size, Alignment); } - - static void allocate_many - (MemoryAlgorithm *memory_algo, size_type elem_bytes, size_type n_elements, multiallocation_chain &chain) - { - return this_type::priv_allocate_many(memory_algo, &elem_bytes, n_elements, 0, chain); - } - - static void deallocate_many(MemoryAlgorithm *memory_algo, multiallocation_chain &chain) - { - return this_type::priv_deallocate_many(memory_algo, chain); - } - - static bool calculate_lcm_and_needs_backwards_lcmed - (size_type backwards_multiple, size_type received_size, size_type size_to_achieve, - size_type &lcm_out, size_type &needs_backwards_lcmed_out) - { - // Now calculate lcm_val - size_type max = backwards_multiple; - size_type min = Alignment; - size_type needs_backwards; - size_type needs_backwards_lcmed; - size_type lcm_val; - size_type current_forward; - //Swap if necessary - if(max < min){ - size_type tmp = min; - min = max; - max = tmp; - } - //Check if it's power of two - if((backwards_multiple & (backwards_multiple-1)) == 0){ - if(0 != (size_to_achieve & ((backwards_multiple-1)))){ - return false; - } - - lcm_val = max; - //If we want to use minbytes data to get a buffer between maxbytes - //and minbytes if maxbytes can't be achieved, calculate the - //biggest of all possibilities - current_forward = get_truncated_size_po2(received_size, backwards_multiple); - needs_backwards = size_to_achieve - current_forward; - BOOST_ASSERT((needs_backwards % backwards_multiple) == 0); - needs_backwards_lcmed = get_rounded_size_po2(needs_backwards, lcm_val); - lcm_out = lcm_val; - needs_backwards_lcmed_out = needs_backwards_lcmed; - return true; - } - //Check if it's multiple of alignment - else if((backwards_multiple & (Alignment - 1u)) == 0){ - lcm_val = backwards_multiple; - current_forward = get_truncated_size(received_size, backwards_multiple); - //No need to round needs_backwards because backwards_multiple == lcm_val - needs_backwards_lcmed = needs_backwards = size_to_achieve - current_forward; - BOOST_ASSERT((needs_backwards_lcmed & (Alignment - 1u)) == 0); - lcm_out = lcm_val; - needs_backwards_lcmed_out = needs_backwards_lcmed; - return true; - } - //Check if it's multiple of the half of the alignmment - else if((backwards_multiple & ((Alignment/2u) - 1u)) == 0){ - lcm_val = backwards_multiple*2u; - current_forward = get_truncated_size(received_size, backwards_multiple); - needs_backwards_lcmed = needs_backwards = size_to_achieve - current_forward; - if(0 != (needs_backwards_lcmed & (Alignment-1))) - //while(0 != (needs_backwards_lcmed & (Alignment-1))) - needs_backwards_lcmed += backwards_multiple; - BOOST_ASSERT((needs_backwards_lcmed % lcm_val) == 0); - lcm_out = lcm_val; - needs_backwards_lcmed_out = needs_backwards_lcmed; - return true; - } - //Check if it's multiple of the quarter of the alignmment - else if((backwards_multiple & ((Alignment/4u) - 1u)) == 0){ - size_type remainder; - lcm_val = backwards_multiple*4u; - current_forward = get_truncated_size(received_size, backwards_multiple); - needs_backwards_lcmed = needs_backwards = size_to_achieve - current_forward; - //while(0 != (needs_backwards_lcmed & (Alignment-1))) - //needs_backwards_lcmed += backwards_multiple; - if(0 != (remainder = ((needs_backwards_lcmed & (Alignment-1))>>(Alignment/8u)))){ - if(backwards_multiple & Alignment/2u){ - needs_backwards_lcmed += (remainder)*backwards_multiple; - } - else{ - needs_backwards_lcmed += (4-remainder)*backwards_multiple; - } - } - BOOST_ASSERT((needs_backwards_lcmed % lcm_val) == 0); - lcm_out = lcm_val; - needs_backwards_lcmed_out = needs_backwards_lcmed; - return true; - } - else{ - lcm_val = lcm(max, min); - } - //If we want to use minbytes data to get a buffer between maxbytes - //and minbytes if maxbytes can't be achieved, calculate the - //biggest of all possibilities - current_forward = get_truncated_size(received_size, backwards_multiple); - needs_backwards = size_to_achieve - current_forward; - BOOST_ASSERT((needs_backwards % backwards_multiple) == 0); - needs_backwards_lcmed = get_rounded_size(needs_backwards, lcm_val); - lcm_out = lcm_val; - needs_backwards_lcmed_out = needs_backwards_lcmed; - return true; - } - - static void allocate_many - ( MemoryAlgorithm *memory_algo - , const size_type *elem_sizes - , size_type n_elements - , size_type sizeof_element - , multiallocation_chain &chain) - { - this_type::priv_allocate_many(memory_algo, elem_sizes, n_elements, sizeof_element, chain); - } - - static void* allocate_aligned - (MemoryAlgorithm *memory_algo, size_type nbytes, size_type alignment) - { - - //Ensure power of 2 - if ((alignment & (alignment - size_type(1u))) != 0){ - //Alignment is not power of two - BOOST_ASSERT((alignment & (alignment - size_type(1u))) == 0); - return 0; - } - - size_type real_size; - if(alignment <= Alignment){ - return memory_algo->priv_allocate - (boost::interprocess::allocate_new, nbytes, nbytes, real_size).first; - } - - if(nbytes > UsableByPreviousChunk) - nbytes -= UsableByPreviousChunk; - - //We can find a aligned portion if we allocate a block that has alignment - //nbytes + alignment bytes or more. - size_type minimum_allocation = max_value - (nbytes + alignment, size_type(MinBlockUnits*Alignment)); - //Since we will split that block, we must request a bit more memory - //if the alignment is near the beginning of the buffer, because otherwise, - //there is no space for a new block before the alignment. - // - // ____ Aligned here - // | - // ----------------------------------------------------- - // | MBU | - // ----------------------------------------------------- - size_type request = - minimum_allocation + (2*MinBlockUnits*Alignment - AllocatedCtrlBytes - //prevsize - UsableByPreviousChunk - ); - - //Now allocate the buffer - void *buffer = memory_algo->priv_allocate - (boost::interprocess::allocate_new, request, request, real_size).first; - if(!buffer){ - return 0; - } - else if ((((std::size_t)(buffer)) % alignment) == 0){ - //If we are lucky and the buffer is aligned, just split it and - //return the high part - block_ctrl *first = memory_algo->priv_get_block(buffer); - size_type old_size = first->m_size; - const size_type first_min_units = - max_value(ceil_units(nbytes) + AllocatedCtrlUnits, size_type(MinBlockUnits)); - //We can create a new block in the end of the segment - if(old_size >= (first_min_units + MinBlockUnits)){ - block_ctrl *second = reinterpret_cast<block_ctrl *> - (reinterpret_cast<char*>(first) + Alignment*first_min_units); - first->m_size = first_min_units; - second->m_size = old_size - first->m_size; - BOOST_ASSERT(second->m_size >= MinBlockUnits); - memory_algo->priv_mark_new_allocated_block(first); - //memory_algo->priv_tail_size(first, first->m_size); - memory_algo->priv_mark_new_allocated_block(second); - memory_algo->priv_deallocate(memory_algo->priv_get_user_buffer(second)); - } - return buffer; - } - - //Buffer not aligned, find the aligned part. - // - // ____ Aligned here - // | - // ----------------------------------------------------- - // | MBU +more | ACB | - // ----------------------------------------------------- - char *pos = reinterpret_cast<char*> - (reinterpret_cast<std::size_t>(static_cast<char*>(buffer) + - //This is the minimum size of (2) - (MinBlockUnits*Alignment - AllocatedCtrlBytes) + - //This is the next MBU for the aligned memory - AllocatedCtrlBytes + - //This is the alignment trick - alignment - 1) & -alignment); - - //Now obtain the address of the blocks - block_ctrl *first = memory_algo->priv_get_block(buffer); - block_ctrl *second = memory_algo->priv_get_block(pos); - BOOST_ASSERT(pos <= (reinterpret_cast<char*>(first) + first->m_size*Alignment)); - BOOST_ASSERT(first->m_size >= 2*MinBlockUnits); - BOOST_ASSERT((pos + MinBlockUnits*Alignment - AllocatedCtrlBytes + nbytes*Alignment/Alignment) <= - (reinterpret_cast<char*>(first) + first->m_size*Alignment)); - //Set the new size of the first block - size_type old_size = first->m_size; - first->m_size = (size_type)(reinterpret_cast<char*>(second) - reinterpret_cast<char*>(first))/Alignment; - memory_algo->priv_mark_new_allocated_block(first); - - //Now check if we can create a new buffer in the end - // - // __"second" block - // | __Aligned here - // | | __"third" block - // -----------|-----|-----|------------------------------ - // | MBU +more | ACB | (3) | BCU | - // ----------------------------------------------------- - //This size will be the minimum size to be able to create a - //new block in the end. - const size_type second_min_units = max_value(size_type(MinBlockUnits), - ceil_units(nbytes) + AllocatedCtrlUnits ); - - //Check if we can create a new block (of size MinBlockUnits) in the end of the segment - if((old_size - first->m_size) >= (second_min_units + MinBlockUnits)){ - //Now obtain the address of the end block - block_ctrl *third = new (reinterpret_cast<char*>(second) + Alignment*second_min_units)block_ctrl; - second->m_size = second_min_units; - third->m_size = old_size - first->m_size - second->m_size; - BOOST_ASSERT(third->m_size >= MinBlockUnits); - memory_algo->priv_mark_new_allocated_block(second); - memory_algo->priv_mark_new_allocated_block(third); - memory_algo->priv_deallocate(memory_algo->priv_get_user_buffer(third)); - } - else{ - second->m_size = old_size - first->m_size; - BOOST_ASSERT(second->m_size >= MinBlockUnits); - memory_algo->priv_mark_new_allocated_block(second); - } - - memory_algo->priv_deallocate(memory_algo->priv_get_user_buffer(first)); - return memory_algo->priv_get_user_buffer(second); - } - - static bool try_shrink - (MemoryAlgorithm *memory_algo, void *ptr - ,const size_type max_size, const size_type preferred_size - ,size_type &received_size) - { - (void)memory_algo; - //Obtain the real block - block_ctrl *block = memory_algo->priv_get_block(ptr); - size_type old_block_units = (size_type)block->m_size; - - //The block must be marked as allocated - BOOST_ASSERT(memory_algo->priv_is_allocated_block(block)); - - //Check if alignment and block size are right - assert_alignment(ptr); - - //Put this to a safe value - received_size = (old_block_units - AllocatedCtrlUnits)*Alignment + UsableByPreviousChunk; - - //Now translate it to Alignment units - const size_type max_user_units = floor_units(max_size - UsableByPreviousChunk); - const size_type preferred_user_units = ceil_units(preferred_size - UsableByPreviousChunk); - - //Check if rounded max and preferred are possible correct - if(max_user_units < preferred_user_units) - return false; - - //Check if the block is smaller than the requested minimum - size_type old_user_units = old_block_units - AllocatedCtrlUnits; - - if(old_user_units < preferred_user_units) - return false; - - //If the block is smaller than the requested minimum - if(old_user_units == preferred_user_units) - return true; - - size_type shrunk_user_units = - ((BlockCtrlUnits - AllocatedCtrlUnits) >= preferred_user_units) - ? (BlockCtrlUnits - AllocatedCtrlUnits) - : preferred_user_units; - - //Some parameter checks - if(max_user_units < shrunk_user_units) - return false; - - //We must be able to create at least a new empty block - if((old_user_units - shrunk_user_units) < BlockCtrlUnits ){ - return false; - } - - //Update new size - received_size = shrunk_user_units*Alignment + UsableByPreviousChunk; - return true; - } - - static bool shrink - (MemoryAlgorithm *memory_algo, void *ptr - ,const size_type max_size, const size_type preferred_size - ,size_type &received_size) - { - //Obtain the real block - block_ctrl *block = memory_algo->priv_get_block(ptr); - size_type old_block_units = (size_type)block->m_size; - - if(!try_shrink - (memory_algo, ptr, max_size, preferred_size, received_size)){ - return false; - } - - //Check if the old size was just the shrunk size (no splitting) - if((old_block_units - AllocatedCtrlUnits) == ceil_units(preferred_size - UsableByPreviousChunk)) - return true; - - //Now we can just rewrite the size of the old buffer - block->m_size = (received_size-UsableByPreviousChunk)/Alignment + AllocatedCtrlUnits; - BOOST_ASSERT(block->m_size >= BlockCtrlUnits); - - //We create the new block - block_ctrl *new_block = reinterpret_cast<block_ctrl*> - (reinterpret_cast<char*>(block) + block->m_size*Alignment); - //Write control data to simulate this new block was previously allocated - //and deallocate it - new_block->m_size = old_block_units - block->m_size; - BOOST_ASSERT(new_block->m_size >= BlockCtrlUnits); - memory_algo->priv_mark_new_allocated_block(block); - memory_algo->priv_mark_new_allocated_block(new_block); - memory_algo->priv_deallocate(memory_algo->priv_get_user_buffer(new_block)); - return true; - } - - private: - static void priv_allocate_many - ( MemoryAlgorithm *memory_algo - , const size_type *elem_sizes - , size_type n_elements - , size_type sizeof_element - , multiallocation_chain &chain) - { - //Note: sizeof_element == 0 indicates that we want to - //allocate n_elements of the same size "*elem_sizes" - - //Calculate the total size of all requests - size_type total_request_units = 0; - size_type elem_units = 0; - const size_type ptr_size_units = memory_algo->priv_get_total_units(sizeof(void_pointer)); - if(!sizeof_element){ - elem_units = memory_algo->priv_get_total_units(*elem_sizes); - elem_units = ptr_size_units > elem_units ? ptr_size_units : elem_units; - total_request_units = n_elements*elem_units; - } - else{ - for(size_type i = 0; i < n_elements; ++i){ - if(multiplication_overflows(elem_sizes[i], sizeof_element)){ - total_request_units = 0; - break; - } - elem_units = memory_algo->priv_get_total_units(elem_sizes[i]*sizeof_element); - elem_units = ptr_size_units > elem_units ? ptr_size_units : elem_units; - if(sum_overflows(total_request_units, elem_units)){ - total_request_units = 0; - break; - } - total_request_units += elem_units; - } - } - - if(total_request_units && !multiplication_overflows(total_request_units, Alignment)){ - size_type low_idx = 0; - while(low_idx < n_elements){ - size_type total_bytes = total_request_units*Alignment - AllocatedCtrlBytes + UsableByPreviousChunk; - size_type min_allocation = (!sizeof_element) - ? elem_units - : memory_algo->priv_get_total_units(elem_sizes[low_idx]*sizeof_element); - min_allocation = min_allocation*Alignment - AllocatedCtrlBytes + UsableByPreviousChunk; - - size_type received_size; - std::pair<void *, bool> ret = memory_algo->priv_allocate - (boost::interprocess::allocate_new, min_allocation, total_bytes, received_size, 0); - if(!ret.first){ - break; - } - - block_ctrl *block = memory_algo->priv_get_block(ret.first); - size_type received_units = (size_type)block->m_size; - char *block_address = reinterpret_cast<char*>(block); - - size_type total_used_units = 0; - while(total_used_units < received_units){ - if(sizeof_element){ - elem_units = memory_algo->priv_get_total_units(elem_sizes[low_idx]*sizeof_element); - elem_units = ptr_size_units > elem_units ? ptr_size_units : elem_units; - } - if(total_used_units + elem_units > received_units) - break; - total_request_units -= elem_units; - //This is the position where the new block must be created - block_ctrl *new_block = reinterpret_cast<block_ctrl *>(block_address); - assert_alignment(new_block); - - //The last block should take all the remaining space - if((low_idx + 1) == n_elements || - (total_used_units + elem_units + - ((!sizeof_element) - ? elem_units - : std::max(memory_algo->priv_get_total_units(elem_sizes[low_idx+1]*sizeof_element), ptr_size_units)) - ) > received_units){ - //By default, the new block will use the rest of the buffer - new_block->m_size = received_units - total_used_units; - memory_algo->priv_mark_new_allocated_block(new_block); - - //If the remaining units are bigger than needed and we can - //split it obtaining a new free memory block do it. - if((received_units - total_used_units) >= (elem_units + MemoryAlgorithm::BlockCtrlUnits)){ - size_type shrunk_received; - size_type shrunk_request = elem_units*Alignment - AllocatedCtrlBytes + UsableByPreviousChunk; - bool shrink_ok = shrink - (memory_algo - ,memory_algo->priv_get_user_buffer(new_block) - ,shrunk_request - ,shrunk_request - ,shrunk_received); - (void)shrink_ok; - //Shrink must always succeed with passed parameters - BOOST_ASSERT(shrink_ok); - //Some sanity checks - BOOST_ASSERT(shrunk_request == shrunk_received); - BOOST_ASSERT(elem_units == ((shrunk_request-UsableByPreviousChunk)/Alignment + AllocatedCtrlUnits)); - //"new_block->m_size" must have been reduced to elem_units by "shrink" - BOOST_ASSERT(new_block->m_size == elem_units); - //Now update the total received units with the reduction - received_units = elem_units + total_used_units; - } - } - else{ - new_block->m_size = elem_units; - memory_algo->priv_mark_new_allocated_block(new_block); - } - - block_address += new_block->m_size*Alignment; - total_used_units += (size_type)new_block->m_size; - //Check we have enough room to overwrite the intrusive pointer - BOOST_ASSERT((new_block->m_size*Alignment - AllocatedCtrlUnits) >= sizeof(void_pointer)); - void_pointer p = new(memory_algo->priv_get_user_buffer(new_block))void_pointer(0); - chain.push_back(p); - ++low_idx; - } - //Sanity check - BOOST_ASSERT(total_used_units == received_units); - } - - if(low_idx != n_elements){ - priv_deallocate_many(memory_algo, chain); - } - } - } - - static void priv_deallocate_many(MemoryAlgorithm *memory_algo, multiallocation_chain &chain) - { - while(!chain.empty()){ - memory_algo->priv_deallocate(to_raw_pointer(chain.pop_front())); - } - } -}; - -} //namespace ipcdetail { -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //#ifndef BOOST_INTERPROCESS_DETAIL_MEM_ALGO_COMMON_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/mem_algo/rbtree_best_fit.hpp b/src/third_party/boost-1.56.0/boost/interprocess/mem_algo/rbtree_best_fit.hpp deleted file mode 100644 index 6ed18ab7039..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/mem_algo/rbtree_best_fit.hpp +++ /dev/null @@ -1,1414 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_MEM_ALGO_RBTREE_BEST_FIT_HPP -#define BOOST_INTERPROCESS_MEM_ALGO_RBTREE_BEST_FIT_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> - -#include <boost/intrusive/pointer_traits.hpp> - -#include <boost/interprocess/interprocess_fwd.hpp> -#include <boost/interprocess/mem_algo/detail/mem_algo_common.hpp> -#include <boost/interprocess/containers/allocation_type.hpp> -#include <boost/container/detail/multiallocation_chain.hpp> -#include <boost/interprocess/offset_ptr.hpp> -#include <boost/interprocess/exceptions.hpp> -#include <boost/interprocess/detail/utilities.hpp> -#include <boost/interprocess/detail/min_max.hpp> -#include <boost/interprocess/detail/math_functions.hpp> -#include <boost/interprocess/detail/type_traits.hpp> -#include <boost/interprocess/sync/scoped_lock.hpp> -#include <boost/type_traits/alignment_of.hpp> -#include <boost/type_traits/type_with_alignment.hpp> -#include <boost/type_traits/make_unsigned.hpp> -#include <boost/intrusive/pointer_traits.hpp> -#include <boost/assert.hpp> -#include <boost/static_assert.hpp> -#include <algorithm> -#include <utility> -#include <climits> -#include <cstring> -#include <iterator> - -#include <boost/assert.hpp> -#include <new> - -#include <boost/intrusive/set.hpp> - -//#define BOOST_INTERPROCESS_RBTREE_BEST_FIT_ABI_V1_HPP -//to maintain ABI compatible with the original version -//ABI had to be updated to fix compatibility issues when -//sharing shared memory between 32 adn 64 bit processes. - -//!\file -//!Describes a best-fit algorithm based in an intrusive red-black tree used to allocate -//!objects in shared memory. This class is intended as a base class for single segment -//!and multi-segment implementations. - -namespace boost { -namespace interprocess { - -//!This class implements an algorithm that stores the free nodes in a red-black tree -//!to have logarithmic search/insert times. -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> -class rbtree_best_fit -{ - /// @cond - //Non-copyable - rbtree_best_fit(); - rbtree_best_fit(const rbtree_best_fit &); - rbtree_best_fit &operator=(const rbtree_best_fit &); - - private: - struct block_ctrl; - typedef typename boost::intrusive:: - pointer_traits<VoidPointer>::template - rebind_pointer<block_ctrl>::type block_ctrl_ptr; - - typedef typename boost::intrusive:: - pointer_traits<VoidPointer>::template - rebind_pointer<char>::type char_ptr; - - /// @endcond - - public: - //!Shared mutex family used for the rest of the Interprocess framework - typedef MutexFamily mutex_family; - //!Pointer type to be used with the rest of the Interprocess framework - typedef VoidPointer void_pointer; - typedef ipcdetail::basic_multiallocation_chain<VoidPointer> multiallocation_chain; - - typedef typename boost::intrusive::pointer_traits<char_ptr>::difference_type difference_type; - typedef typename boost::make_unsigned<difference_type>::type size_type; - - /// @cond - - private: - - typedef typename bi::make_set_base_hook - < bi::void_pointer<VoidPointer> - , bi::optimize_size<true> - , bi::link_mode<bi::normal_link> >::type TreeHook; - - struct SizeHolder - { - //!This block's memory size (including block_ctrl - //!header) in Alignment units - size_type m_prev_size : sizeof(size_type)*CHAR_BIT; - size_type m_size : sizeof(size_type)*CHAR_BIT - 2; - size_type m_prev_allocated : 1; - size_type m_allocated : 1; - }; - - //!Block control structure - struct block_ctrl - : public SizeHolder, public TreeHook - { - block_ctrl() - { this->m_size = 0; this->m_allocated = 0, this->m_prev_allocated = 0; } - - friend bool operator<(const block_ctrl &a, const block_ctrl &b) - { return a.m_size < b.m_size; } - friend bool operator==(const block_ctrl &a, const block_ctrl &b) - { return a.m_size == b.m_size; } - }; - - struct size_block_ctrl_compare - { - bool operator()(size_type size, const block_ctrl &block) const - { return size < block.m_size; } - - bool operator()(const block_ctrl &block, size_type size) const - { return block.m_size < size; } - }; - - //!Shared mutex to protect memory allocate/deallocate - typedef typename MutexFamily::mutex_type mutex_type; - typedef typename bi::make_multiset - <block_ctrl, bi::base_hook<TreeHook> >::type Imultiset; - - typedef typename Imultiset::iterator imultiset_iterator; - - //!This struct includes needed data and derives from - //!mutex_type to allow EBO when using null mutex_type - struct header_t : public mutex_type - { - Imultiset m_imultiset; - - //!The extra size required by the segment - size_type m_extra_hdr_bytes; - //!Allocated bytes for internal checking - size_type m_allocated; - //!The size of the memory segment - size_type m_size; - } m_header; - - friend class ipcdetail::memory_algorithm_common<rbtree_best_fit>; - - typedef ipcdetail::memory_algorithm_common<rbtree_best_fit> algo_impl_t; - - public: - /// @endcond - - //!Constructor. "size" is the total size of the managed memory segment, - //!"extra_hdr_bytes" indicates the extra bytes beginning in the sizeof(rbtree_best_fit) - //!offset that the allocator should not use at all. - rbtree_best_fit (size_type size, size_type extra_hdr_bytes); - - //!Destructor. - ~rbtree_best_fit(); - - //!Obtains the minimum size needed by the algorithm - static size_type get_min_size (size_type extra_hdr_bytes); - - //Functions for single segment management - - //!Allocates bytes, returns 0 if there is not more memory - void* allocate (size_type nbytes); - - /// @cond - - //Experimental. Dont' use - - //!Multiple element allocation, same size - void allocate_many(size_type elem_bytes, size_type num_elements, multiallocation_chain &chain) - { - //----------------------- - boost::interprocess::scoped_lock<mutex_type> guard(m_header); - //----------------------- - algo_impl_t::allocate_many(this, elem_bytes, num_elements, chain); - } - - //!Multiple element allocation, different size - void allocate_many(const size_type *elem_sizes, size_type n_elements, size_type sizeof_element, multiallocation_chain &chain) - { - //----------------------- - boost::interprocess::scoped_lock<mutex_type> guard(m_header); - //----------------------- - algo_impl_t::allocate_many(this, elem_sizes, n_elements, sizeof_element, chain); - } - - //!Multiple element allocation, different size - void deallocate_many(multiallocation_chain &chain); - - /// @endcond - - //!Deallocates previously allocated bytes - void deallocate (void *addr); - - //!Returns the size of the memory segment - size_type get_size() const; - - //!Returns the number of free bytes of the segment - size_type get_free_memory() const; - - //!Initializes to zero all the memory that's not in use. - //!This function is normally used for security reasons. - void zero_free_memory(); - - //!Increases managed memory in - //!extra_size bytes more - void grow(size_type extra_size); - - //!Decreases managed memory as much as possible - void shrink_to_fit(); - - //!Returns true if all allocated memory has been deallocated - bool all_memory_deallocated(); - - //!Makes an internal sanity check - //!and returns true if success - bool check_sanity(); - - template<class T> - std::pair<T *, bool> - allocation_command (boost::interprocess::allocation_type command, size_type limit_size, - size_type preferred_size,size_type &received_size, - T *reuse_ptr = 0); - - std::pair<void *, bool> - raw_allocation_command (boost::interprocess::allocation_type command, size_type limit_object, - size_type preferred_object,size_type &received_object, - void *reuse_ptr = 0, size_type sizeof_object = 1); - - //!Returns the size of the buffer previously allocated pointed by ptr - size_type size(const void *ptr) const; - - //!Allocates aligned bytes, returns 0 if there is not more memory. - //!Alignment must be power of 2 - void* allocate_aligned (size_type nbytes, size_type alignment); - - /// @cond - private: - static size_type priv_first_block_offset_from_this(const void *this_ptr, size_type extra_hdr_bytes); - - block_ctrl *priv_first_block(); - - block_ctrl *priv_end_block(); - - std::pair<void*, bool> - priv_allocation_command(boost::interprocess::allocation_type command, size_type limit_size, - size_type preferred_size,size_type &received_size, - void *reuse_ptr, size_type sizeof_object); - - - //!Real allocation algorithm with min allocation option - std::pair<void *, bool> priv_allocate(boost::interprocess::allocation_type command - ,size_type limit_size - ,size_type preferred_size - ,size_type &received_size - ,void *reuse_ptr = 0 - ,size_type backwards_multiple = 1); - - //!Obtains the block control structure of the user buffer - static block_ctrl *priv_get_block(const void *ptr); - - //!Obtains the pointer returned to the user from the block control - static void *priv_get_user_buffer(const block_ctrl *block); - - //!Returns the number of total units that a user buffer - //!of "userbytes" bytes really occupies (including header) - static size_type priv_get_total_units(size_type userbytes); - - //!Real expand function implementation - bool priv_expand(void *ptr - ,const size_type min_size, const size_type preferred_size - ,size_type &received_size); - - //!Real expand to both sides implementation - void* priv_expand_both_sides(boost::interprocess::allocation_type command - ,size_type min_size - ,size_type preferred_size - ,size_type &received_size - ,void *reuse_ptr - ,bool only_preferred_backwards - ,size_type backwards_multiple); - - //!Returns true if the previous block is allocated - bool priv_is_prev_allocated(block_ctrl *ptr); - - //!Get a pointer of the "end" block from the first block of the segment - static block_ctrl * priv_end_block(block_ctrl *first_segment_block); - - //!Get a pointer of the "first" block from the end block of the segment - static block_ctrl * priv_first_block(block_ctrl *end_segment_block); - - //!Get poitner of the previous block (previous block must be free) - static block_ctrl * priv_prev_block(block_ctrl *ptr); - - //!Get the size in the tail of the previous block - static block_ctrl * priv_next_block(block_ctrl *ptr); - - //!Check if this block is free (not allocated) - bool priv_is_allocated_block(block_ctrl *ptr); - - //!Marks the block as allocated - void priv_mark_as_allocated_block(block_ctrl *ptr); - - //!Marks the block as allocated - void priv_mark_new_allocated_block(block_ctrl *ptr) - { return priv_mark_as_allocated_block(ptr); } - - //!Marks the block as allocated - void priv_mark_as_free_block(block_ctrl *ptr); - - //!Checks if block has enough memory and splits/unlinks the block - //!returning the address to the users - void* priv_check_and_allocate(size_type units - ,block_ctrl* block - ,size_type &received_size); - //!Real deallocation algorithm - void priv_deallocate(void *addr); - - //!Makes a new memory portion available for allocation - void priv_add_segment(void *addr, size_type size); - - public: - - static const size_type Alignment = !MemAlignment - ? size_type(::boost::alignment_of< ::boost::detail::max_align>::value) - : size_type(MemAlignment) - ; - - private: - //Due to embedded bits in size, Alignment must be at least 4 - BOOST_STATIC_ASSERT((Alignment >= 4)); - //Due to rbtree size optimizations, Alignment must have at least pointer alignment - BOOST_STATIC_ASSERT((Alignment >= ::boost::alignment_of<void_pointer>::value)); - static const size_type AlignmentMask = (Alignment - 1); - static const size_type BlockCtrlBytes = ipcdetail::ct_rounded_size<sizeof(block_ctrl), Alignment>::value; - static const size_type BlockCtrlUnits = BlockCtrlBytes/Alignment; - static const size_type AllocatedCtrlBytes = ipcdetail::ct_rounded_size<sizeof(SizeHolder), Alignment>::value; - static const size_type AllocatedCtrlUnits = AllocatedCtrlBytes/Alignment; - static const size_type EndCtrlBlockBytes = ipcdetail::ct_rounded_size<sizeof(SizeHolder), Alignment>::value; - static const size_type EndCtrlBlockUnits = EndCtrlBlockBytes/Alignment; - static const size_type MinBlockUnits = BlockCtrlUnits; - static const size_type UsableByPreviousChunk = sizeof(size_type); - - //Make sure the maximum alignment is power of two - BOOST_STATIC_ASSERT((0 == (Alignment & (Alignment - size_type(1u))))); - /// @endcond - public: - static const size_type PayloadPerAllocation = AllocatedCtrlBytes - UsableByPreviousChunk; -}; - -/// @cond - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> -inline typename rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::size_type - rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment> - ::priv_first_block_offset_from_this(const void *this_ptr, size_type extra_hdr_bytes) -{ - size_type uint_this = (std::size_t)this_ptr; - size_type main_hdr_end = uint_this + sizeof(rbtree_best_fit) + extra_hdr_bytes; - size_type aligned_main_hdr_end = ipcdetail::get_rounded_size(main_hdr_end, Alignment); - size_type block1_off = aligned_main_hdr_end - uint_this; - algo_impl_t::assert_alignment(aligned_main_hdr_end); - algo_impl_t::assert_alignment(uint_this + block1_off); - return block1_off; -} - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> -void rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>:: - priv_add_segment(void *addr, size_type segment_size) -{ - //Check alignment - algo_impl_t::check_alignment(addr); - //Check size - BOOST_ASSERT(segment_size >= (BlockCtrlBytes + EndCtrlBlockBytes)); - - //Initialize the first big block and the "end" node - block_ctrl *first_big_block = new(addr)block_ctrl; - first_big_block->m_size = segment_size/Alignment - EndCtrlBlockUnits; - BOOST_ASSERT(first_big_block->m_size >= BlockCtrlUnits); - - //The "end" node is just a node of size 0 with the "end" bit set - block_ctrl *end_block = static_cast<block_ctrl*> - (new (reinterpret_cast<char*>(addr) + first_big_block->m_size*Alignment)SizeHolder); - - //This will overwrite the prev part of the "end" node - priv_mark_as_free_block (first_big_block); - #ifdef BOOST_INTERPROCESS_RBTREE_BEST_FIT_ABI_V1_HPP - first_big_block->m_prev_size = end_block->m_size = - (reinterpret_cast<char*>(first_big_block) - reinterpret_cast<char*>(end_block))/Alignment; - #else - first_big_block->m_prev_size = end_block->m_size = - (reinterpret_cast<char*>(end_block) - reinterpret_cast<char*>(first_big_block))/Alignment; - #endif - end_block->m_allocated = 1; - first_big_block->m_prev_allocated = 1; - - BOOST_ASSERT(priv_next_block(first_big_block) == end_block); - BOOST_ASSERT(priv_prev_block(end_block) == first_big_block); - BOOST_ASSERT(priv_first_block() == first_big_block); - BOOST_ASSERT(priv_end_block() == end_block); - - //Some check to validate the algorithm, since it makes some assumptions - //to optimize the space wasted in bookkeeping: - - //Check that the sizes of the header are placed before the rbtree - BOOST_ASSERT(static_cast<void*>(static_cast<SizeHolder*>(first_big_block)) - < static_cast<void*>(static_cast<TreeHook*>(first_big_block))); - //Insert it in the intrusive containers - m_header.m_imultiset.insert(*first_big_block); -} - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> -inline typename rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::block_ctrl * - rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment> - ::priv_first_block() -{ - size_type block1_off = priv_first_block_offset_from_this(this, m_header.m_extra_hdr_bytes); - return reinterpret_cast<block_ctrl *>(reinterpret_cast<char*>(this) + block1_off); -} - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> -inline typename rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::block_ctrl * - rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment> - ::priv_end_block() -{ - size_type block1_off = priv_first_block_offset_from_this(this, m_header.m_extra_hdr_bytes); - const size_type original_first_block_size = m_header.m_size/Alignment*Alignment - block1_off/Alignment*Alignment - EndCtrlBlockBytes; - block_ctrl *end_block = reinterpret_cast<block_ctrl*> - (reinterpret_cast<char*>(this) + block1_off + original_first_block_size); - return end_block; -} - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> -inline rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>:: - rbtree_best_fit(size_type segment_size, size_type extra_hdr_bytes) -{ - //Initialize the header - m_header.m_allocated = 0; - m_header.m_size = segment_size; - m_header.m_extra_hdr_bytes = extra_hdr_bytes; - - //Now write calculate the offset of the first big block that will - //cover the whole segment - BOOST_ASSERT(get_min_size(extra_hdr_bytes) <= segment_size); - size_type block1_off = priv_first_block_offset_from_this(this, extra_hdr_bytes); - priv_add_segment(reinterpret_cast<char*>(this) + block1_off, segment_size - block1_off); -} - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> -inline rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::~rbtree_best_fit() -{ - //There is a memory leak! -// BOOST_ASSERT(m_header.m_allocated == 0); -// BOOST_ASSERT(m_header.m_root.m_next->m_next == block_ctrl_ptr(&m_header.m_root)); -} - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> -void rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::grow(size_type extra_size) -{ - //Get the address of the first block - block_ctrl *first_block = priv_first_block(); - block_ctrl *old_end_block = priv_end_block(); - size_type old_border_offset = (size_type)(reinterpret_cast<char*>(old_end_block) - - reinterpret_cast<char*>(this)) + EndCtrlBlockBytes; - - //Update managed buffer's size - m_header.m_size += extra_size; - - //We need at least MinBlockUnits blocks to create a new block - if((m_header.m_size - old_border_offset) < MinBlockUnits){ - return; - } - - //Now create a new block between the old end and the new end - size_type align_offset = (m_header.m_size - old_border_offset)/Alignment; - block_ctrl *new_end_block = reinterpret_cast<block_ctrl*> - (reinterpret_cast<char*>(old_end_block) + align_offset*Alignment); - - //the last and first block are special: - //new_end_block->m_size & first_block->m_prev_size store the absolute value - //between them - new_end_block->m_allocated = 1; - #ifdef BOOST_INTERPROCESS_RBTREE_BEST_FIT_ABI_V1_HPP - new_end_block->m_size = (reinterpret_cast<char*>(first_block) - - reinterpret_cast<char*>(new_end_block))/Alignment; - #else - new_end_block->m_size = (reinterpret_cast<char*>(new_end_block) - - reinterpret_cast<char*>(first_block))/Alignment; - #endif - first_block->m_prev_size = new_end_block->m_size; - first_block->m_prev_allocated = 1; - BOOST_ASSERT(new_end_block == priv_end_block()); - - //The old end block is the new block - block_ctrl *new_block = old_end_block; - new_block->m_size = (reinterpret_cast<char*>(new_end_block) - - reinterpret_cast<char*>(new_block))/Alignment; - BOOST_ASSERT(new_block->m_size >= BlockCtrlUnits); - priv_mark_as_allocated_block(new_block); - BOOST_ASSERT(priv_next_block(new_block) == new_end_block); - - m_header.m_allocated += (size_type)new_block->m_size*Alignment; - - //Now deallocate the newly created block - this->priv_deallocate(priv_get_user_buffer(new_block)); -} - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> -void rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::shrink_to_fit() -{ - //Get the address of the first block - block_ctrl *first_block = priv_first_block(); - algo_impl_t::assert_alignment(first_block); - - //block_ctrl *old_end_block = priv_end_block(first_block); - block_ctrl *old_end_block = priv_end_block(); - algo_impl_t::assert_alignment(old_end_block); - size_type old_end_block_size = old_end_block->m_size; - - void *unique_buffer = 0; - block_ctrl *last_block; - //Check if no memory is allocated between the first and last block - if(priv_next_block(first_block) == old_end_block){ - //If so check if we can allocate memory - size_type ignore; - unique_buffer = priv_allocate(boost::interprocess::allocate_new, 0, 0, ignore).first; - //If not, return, we can't shrink - if(!unique_buffer) - return; - //If we can, mark the position just after the new allocation as the new end - algo_impl_t::assert_alignment(unique_buffer); - block_ctrl *unique_block = priv_get_block(unique_buffer); - BOOST_ASSERT(priv_is_allocated_block(unique_block)); - algo_impl_t::assert_alignment(unique_block); - last_block = priv_next_block(unique_block); - BOOST_ASSERT(!priv_is_allocated_block(last_block)); - algo_impl_t::assert_alignment(last_block); - } - else{ - //If memory is allocated, check if the last block is allocated - if(priv_is_prev_allocated(old_end_block)) - return; - //If not, mark last block after the free block - last_block = priv_prev_block(old_end_block); - } - - size_type last_block_size = last_block->m_size; - - //Erase block from the free tree, since we will erase it - m_header.m_imultiset.erase(Imultiset::s_iterator_to(*last_block)); - - size_type shrunk_border_offset = (size_type)(reinterpret_cast<char*>(last_block) - - reinterpret_cast<char*>(this)) + EndCtrlBlockBytes; - - block_ctrl *new_end_block = last_block; - algo_impl_t::assert_alignment(new_end_block); - - //Write new end block attributes - #ifdef BOOST_INTERPROCESS_RBTREE_BEST_FIT_ABI_V1_HPP - new_end_block->m_size = first_block->m_prev_size = - (reinterpret_cast<char*>(first_block) - reinterpret_cast<char*>(new_end_block))/Alignment; - #else - new_end_block->m_size = first_block->m_prev_size = - (reinterpret_cast<char*>(new_end_block) - reinterpret_cast<char*>(first_block))/Alignment; - #endif - - new_end_block->m_allocated = 1; - (void)last_block_size; - (void)old_end_block_size; - BOOST_ASSERT(new_end_block->m_size == (old_end_block_size - last_block_size)); - - //Update managed buffer's size - m_header.m_size = shrunk_border_offset; - BOOST_ASSERT(priv_end_block() == new_end_block); - if(unique_buffer) - priv_deallocate(unique_buffer); -} - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> -inline typename rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::size_type -rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::get_size() const -{ return m_header.m_size; } - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> -typename rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::size_type -rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::get_free_memory() const -{ - return m_header.m_size - m_header.m_allocated - - priv_first_block_offset_from_this(this, m_header.m_extra_hdr_bytes); -} - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> -typename rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::size_type -rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>:: - get_min_size (size_type extra_hdr_bytes) -{ - return (algo_impl_t::ceil_units(sizeof(rbtree_best_fit)) + - algo_impl_t::ceil_units(extra_hdr_bytes) + - MinBlockUnits + EndCtrlBlockUnits)*Alignment; -} - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> -inline bool rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>:: - all_memory_deallocated() -{ - //----------------------- - boost::interprocess::scoped_lock<mutex_type> guard(m_header); - //----------------------- - size_type block1_off = - priv_first_block_offset_from_this(this, m_header.m_extra_hdr_bytes); - - return m_header.m_allocated == 0 && - m_header.m_imultiset.begin() != m_header.m_imultiset.end() && - (++m_header.m_imultiset.begin()) == m_header.m_imultiset.end() - && m_header.m_imultiset.begin()->m_size == - (m_header.m_size - block1_off - EndCtrlBlockBytes)/Alignment; -} - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> -bool rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>:: - check_sanity() -{ - //----------------------- - boost::interprocess::scoped_lock<mutex_type> guard(m_header); - //----------------------- - imultiset_iterator ib(m_header.m_imultiset.begin()), ie(m_header.m_imultiset.end()); - - size_type free_memory = 0; - - //Iterate through all blocks obtaining their size - for(; ib != ie; ++ib){ - free_memory += (size_type)ib->m_size*Alignment; - algo_impl_t::assert_alignment(&*ib); - if(!algo_impl_t::check_alignment(&*ib)) - return false; - } - - //Check allocated bytes are less than size - if(m_header.m_allocated > m_header.m_size){ - return false; - } - - size_type block1_off = - priv_first_block_offset_from_this(this, m_header.m_extra_hdr_bytes); - - //Check free bytes are less than size - if(free_memory > (m_header.m_size - block1_off)){ - return false; - } - return true; -} - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> -inline void* rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>:: - allocate(size_type nbytes) -{ - //----------------------- - boost::interprocess::scoped_lock<mutex_type> guard(m_header); - //----------------------- - size_type ignore; - void * ret = priv_allocate(boost::interprocess::allocate_new, nbytes, nbytes, ignore).first; - return ret; -} - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> -inline void* rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>:: - allocate_aligned(size_type nbytes, size_type alignment) -{ - //----------------------- - boost::interprocess::scoped_lock<mutex_type> guard(m_header); - //----------------------- - return algo_impl_t::allocate_aligned(this, nbytes, alignment); -} - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> -template<class T> -inline std::pair<T*, bool> rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>:: - allocation_command (boost::interprocess::allocation_type command, size_type limit_size, - size_type preferred_size,size_type &received_size, - T *reuse_ptr) -{ - std::pair<void*, bool> ret = priv_allocation_command - (command, limit_size, preferred_size, received_size, static_cast<void*>(reuse_ptr), sizeof(T)); - - BOOST_ASSERT(0 == ((std::size_t)ret.first % ::boost::alignment_of<T>::value)); - return std::pair<T *, bool>(static_cast<T*>(ret.first), ret.second); -} - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> -inline std::pair<void*, bool> rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>:: - raw_allocation_command (boost::interprocess::allocation_type command, size_type limit_objects, - size_type preferred_objects,size_type &received_objects, - void *reuse_ptr, size_type sizeof_object) -{ - if(!sizeof_object) - return std::pair<void *, bool>(static_cast<void*>(0), false); - if(command & boost::interprocess::try_shrink_in_place){ - bool success = algo_impl_t::try_shrink - ( this, reuse_ptr, limit_objects*sizeof_object - , preferred_objects*sizeof_object, received_objects); - received_objects /= sizeof_object; - return std::pair<void *, bool> ((success ? reuse_ptr : 0), true); - } - return priv_allocation_command - (command, limit_objects, preferred_objects, received_objects, reuse_ptr, sizeof_object); -} - - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> -inline std::pair<void*, bool> rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>:: - priv_allocation_command (boost::interprocess::allocation_type command, size_type limit_size, - size_type preferred_size,size_type &received_size, - void *reuse_ptr, size_type sizeof_object) -{ - std::pair<void*, bool> ret; - size_type max_count = m_header.m_size/sizeof_object; - if(limit_size > max_count || preferred_size > max_count){ - ret.first = 0; return ret; - } - size_type l_size = limit_size*sizeof_object; - size_type p_size = preferred_size*sizeof_object; - size_type r_size; - { - //----------------------- - boost::interprocess::scoped_lock<mutex_type> guard(m_header); - //----------------------- - ret = priv_allocate(command, l_size, p_size, r_size, reuse_ptr, sizeof_object); - } - received_size = r_size/sizeof_object; - return ret; -} - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> -typename rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::size_type -rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>:: - size(const void *ptr) const -{ - //We need no synchronization since this block's size is not going - //to be modified by anyone else - //Obtain the real size of the block - return ((size_type)priv_get_block(ptr)->m_size - AllocatedCtrlUnits)*Alignment + UsableByPreviousChunk; -} - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> -inline void rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::zero_free_memory() -{ - //----------------------- - boost::interprocess::scoped_lock<mutex_type> guard(m_header); - //----------------------- - imultiset_iterator ib(m_header.m_imultiset.begin()), ie(m_header.m_imultiset.end()); - - //Iterate through all blocks obtaining their size - while(ib != ie){ - //Just clear user the memory part reserved for the user - volatile char *ptr = reinterpret_cast<char*>(&*ib) + BlockCtrlBytes; - size_type s = (size_type)ib->m_size*Alignment - BlockCtrlBytes; - while(s--){ - *ptr++ = 0; - } - - //This surprisingly is optimized out by Visual C++ 7.1 in release mode! - //std::memset( reinterpret_cast<char*>(&*ib) + BlockCtrlBytes - // , 0 - // , ib->m_size*Alignment - BlockCtrlBytes); - ++ib; - } -} - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> -void* rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>:: - priv_expand_both_sides(boost::interprocess::allocation_type command - ,size_type min_size - ,size_type preferred_size - ,size_type &received_size - ,void *reuse_ptr - ,bool only_preferred_backwards - ,size_type backwards_multiple) -{ - algo_impl_t::assert_alignment(reuse_ptr); - if(command & boost::interprocess::expand_fwd){ - if(priv_expand(reuse_ptr, min_size, preferred_size, received_size)) - return reuse_ptr; - } - else{ - received_size = this->size(reuse_ptr); - if(received_size >= preferred_size || received_size >= min_size) - return reuse_ptr; - } - - if(backwards_multiple){ - BOOST_ASSERT(0 == (min_size % backwards_multiple)); - BOOST_ASSERT(0 == (preferred_size % backwards_multiple)); - } - - if(command & boost::interprocess::expand_bwd){ - //Obtain the real size of the block - block_ctrl *reuse = priv_get_block(reuse_ptr); - - //Sanity check - //BOOST_ASSERT(reuse->m_size == priv_tail_size(reuse)); - algo_impl_t::assert_alignment(reuse); - - block_ctrl *prev_block; - - //If the previous block is not free, there is nothing to do - if(priv_is_prev_allocated(reuse)){ - return 0; - } - - prev_block = priv_prev_block(reuse); - BOOST_ASSERT(!priv_is_allocated_block(prev_block)); - - //Some sanity checks - BOOST_ASSERT(prev_block->m_size == reuse->m_prev_size); - algo_impl_t::assert_alignment(prev_block); - - size_type needs_backwards_aligned; - size_type lcm; - if(!algo_impl_t::calculate_lcm_and_needs_backwards_lcmed - ( backwards_multiple - , received_size - , only_preferred_backwards ? preferred_size : min_size - , lcm, needs_backwards_aligned)){ - return 0; - } - - //Check if previous block has enough size - if(size_type(prev_block->m_size*Alignment) >= needs_backwards_aligned){ - //Now take all next space. This will succeed - if(command & boost::interprocess::expand_fwd){ - size_type received_size2; - if(!priv_expand(reuse_ptr, received_size, received_size, received_size2)){ - BOOST_ASSERT(0); - } - BOOST_ASSERT(received_size == received_size2); - } - //We need a minimum size to split the previous one - if(prev_block->m_size >= (needs_backwards_aligned/Alignment + BlockCtrlUnits)){ - block_ctrl *new_block = reinterpret_cast<block_ctrl *> - (reinterpret_cast<char*>(reuse) - needs_backwards_aligned); - - //Free old previous buffer - new_block->m_size = - AllocatedCtrlUnits + (needs_backwards_aligned + (received_size - UsableByPreviousChunk))/Alignment; - BOOST_ASSERT(new_block->m_size >= BlockCtrlUnits); - priv_mark_as_allocated_block(new_block); - - prev_block->m_size = (reinterpret_cast<char*>(new_block) - - reinterpret_cast<char*>(prev_block))/Alignment; - BOOST_ASSERT(prev_block->m_size >= BlockCtrlUnits); - priv_mark_as_free_block(prev_block); - - //Update the old previous block in the free blocks tree - //If the new size fulfills tree invariants do nothing, - //otherwise erase() + insert() - { - imultiset_iterator prev_block_it(Imultiset::s_iterator_to(*prev_block)); - imultiset_iterator was_smaller_it(prev_block_it); - if(prev_block_it != m_header.m_imultiset.begin() && - (--(was_smaller_it = prev_block_it))->m_size > prev_block->m_size){ - m_header.m_imultiset.erase(prev_block_it); - m_header.m_imultiset.insert(m_header.m_imultiset.begin(), *prev_block); - } - } - - received_size = needs_backwards_aligned + received_size; - m_header.m_allocated += needs_backwards_aligned; - - //Check alignment - algo_impl_t::assert_alignment(new_block); - - //If the backwards expansion has remaining bytes in the - //first bytes, fill them with a pattern - void *p = priv_get_user_buffer(new_block); - void *user_ptr = reinterpret_cast<char*>(p); - BOOST_ASSERT((static_cast<char*>(reuse_ptr) - static_cast<char*>(user_ptr)) % backwards_multiple == 0); - algo_impl_t::assert_alignment(user_ptr); - return user_ptr; - } - //Check if there is no place to create a new block and - //the whole new block is multiple of the backwards expansion multiple - else if(prev_block->m_size >= needs_backwards_aligned/Alignment && - 0 == ((prev_block->m_size*Alignment) % lcm)) { - //Erase old previous block, since we will change it - m_header.m_imultiset.erase(Imultiset::s_iterator_to(*prev_block)); - - //Just merge the whole previous block - //prev_block->m_size*Alignment is multiple of lcm (and backwards_multiple) - received_size = received_size + (size_type)prev_block->m_size*Alignment; - - m_header.m_allocated += (size_type)prev_block->m_size*Alignment; - //Now update sizes - prev_block->m_size = prev_block->m_size + reuse->m_size; - BOOST_ASSERT(prev_block->m_size >= BlockCtrlUnits); - priv_mark_as_allocated_block(prev_block); - - //If the backwards expansion has remaining bytes in the - //first bytes, fill them with a pattern - void *user_ptr = priv_get_user_buffer(prev_block); - BOOST_ASSERT((static_cast<char*>(reuse_ptr) - static_cast<char*>(user_ptr)) % backwards_multiple == 0); - algo_impl_t::assert_alignment(user_ptr); - return user_ptr; - } - else{ - //Alignment issues - } - } - } - return 0; -} - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> -inline void rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>:: - deallocate_many(typename rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::multiallocation_chain &chain) -{ - //----------------------- - boost::interprocess::scoped_lock<mutex_type> guard(m_header); - //----------------------- - algo_impl_t::deallocate_many(this, chain); -} - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> -std::pair<void *, bool> rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>:: - priv_allocate(boost::interprocess::allocation_type command - ,size_type limit_size - ,size_type preferred_size - ,size_type &received_size - ,void *reuse_ptr - ,size_type backwards_multiple) -{ - //Remove me. Forbid backwards allocation - //command &= (~boost::interprocess::expand_bwd); - - if(command & boost::interprocess::shrink_in_place){ - bool success = - algo_impl_t::shrink(this, reuse_ptr, limit_size, preferred_size, received_size); - return std::pair<void *, bool> ((success ? reuse_ptr : 0), true); - } - - typedef std::pair<void *, bool> return_type; - received_size = 0; - - if(limit_size > preferred_size) - return return_type(static_cast<void*>(0), false); - - //Number of units to request (including block_ctrl header) - size_type preferred_units = priv_get_total_units(preferred_size); - - //Number of units to request (including block_ctrl header) - size_type limit_units = priv_get_total_units(limit_size); - - //Expand in place - if(reuse_ptr && (command & (boost::interprocess::expand_fwd | boost::interprocess::expand_bwd))){ - void *ret = priv_expand_both_sides - (command, limit_size, preferred_size, received_size, reuse_ptr, true, backwards_multiple); - if(ret) - return return_type(ret, true); - } - - if(command & boost::interprocess::allocate_new){ - size_block_ctrl_compare comp; - imultiset_iterator it(m_header.m_imultiset.lower_bound(preferred_units, comp)); - - if(it != m_header.m_imultiset.end()){ - return return_type(this->priv_check_and_allocate - (preferred_units, ipcdetail::to_raw_pointer(&*it), received_size), false); - } - - if(it != m_header.m_imultiset.begin()&& - (--it)->m_size >= limit_units){ - return return_type(this->priv_check_and_allocate - (it->m_size, ipcdetail::to_raw_pointer(&*it), received_size), false); - } - } - - - //Now try to expand both sides with min size - if(reuse_ptr && (command & (boost::interprocess::expand_fwd | boost::interprocess::expand_bwd))){ - return return_type(priv_expand_both_sides - (command, limit_size, preferred_size, received_size, reuse_ptr, false, backwards_multiple), true); - } - - return return_type(static_cast<void*>(0), false); -} - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> -inline -typename rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::block_ctrl * - rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::priv_get_block(const void *ptr) -{ - return const_cast<block_ctrl*> - (reinterpret_cast<const block_ctrl*> - (reinterpret_cast<const char*>(ptr) - AllocatedCtrlBytes)); -} - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> -inline -void *rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>:: - priv_get_user_buffer(const typename rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::block_ctrl *block) -{ return const_cast<char*>(reinterpret_cast<const char*>(block) + AllocatedCtrlBytes); } - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> -inline typename rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::size_type -rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>:: - priv_get_total_units(size_type userbytes) -{ - if(userbytes < UsableByPreviousChunk) - userbytes = UsableByPreviousChunk; - size_type units = ipcdetail::get_rounded_size(userbytes - UsableByPreviousChunk, Alignment)/Alignment + AllocatedCtrlUnits; - if(units < BlockCtrlUnits) units = BlockCtrlUnits; - return units; -} - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> -bool rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>:: - priv_expand (void *ptr - ,const size_type min_size - ,const size_type preferred_size - ,size_type &received_size) -{ - //Obtain the real size of the block - block_ctrl *block = priv_get_block(ptr); - size_type old_block_units = block->m_size; - - //The block must be marked as allocated and the sizes must be equal - BOOST_ASSERT(priv_is_allocated_block(block)); - //BOOST_ASSERT(old_block_units == priv_tail_size(block)); - - //Put this to a safe value - received_size = (old_block_units - AllocatedCtrlUnits)*Alignment + UsableByPreviousChunk; - if(received_size >= preferred_size || received_size >= min_size) - return true; - - //Now translate it to Alignment units - const size_type min_user_units = algo_impl_t::ceil_units(min_size - UsableByPreviousChunk); - const size_type preferred_user_units = algo_impl_t::ceil_units(preferred_size - UsableByPreviousChunk); - - //Some parameter checks - BOOST_ASSERT(min_user_units <= preferred_user_units); - - block_ctrl *next_block; - - if(priv_is_allocated_block(next_block = priv_next_block(block))){ - return received_size >= min_size ? true : false; - } - algo_impl_t::assert_alignment(next_block); - - //Is "block" + "next_block" big enough? - const size_type merged_units = old_block_units + (size_type)next_block->m_size; - - //Now get the expansion size - const size_type merged_user_units = merged_units - AllocatedCtrlUnits; - - if(merged_user_units < min_user_units){ - received_size = merged_units*Alignment - UsableByPreviousChunk; - return false; - } - - //Now get the maximum size the user can allocate - size_type intended_user_units = (merged_user_units < preferred_user_units) ? - merged_user_units : preferred_user_units; - - //These are total units of the merged block (supposing the next block can be split) - const size_type intended_units = AllocatedCtrlUnits + intended_user_units; - - //Check if we can split the next one in two parts - if((merged_units - intended_units) >= BlockCtrlUnits){ - //This block is bigger than needed, split it in - //two blocks, the first one will be merged and - //the second's size will be the remaining space - BOOST_ASSERT(next_block->m_size == priv_next_block(next_block)->m_prev_size); - const size_type rem_units = merged_units - intended_units; - - //Check if we we need to update the old next block in the free blocks tree - //If the new size fulfills tree invariants, we just need to replace the node - //(the block start has been displaced), otherwise erase() + insert(). - // - //This fixup must be done in two parts, because the new next block might - //overwrite the tree hook of the old next block. So we first erase the - //old if needed and we'll insert the new one after creating the new next - imultiset_iterator old_next_block_it(Imultiset::s_iterator_to(*next_block)); - const bool size_invariants_broken = - (next_block->m_size - rem_units ) < BlockCtrlUnits || - (old_next_block_it != m_header.m_imultiset.begin() && - (--imultiset_iterator(old_next_block_it))->m_size > rem_units); - if(size_invariants_broken){ - m_header.m_imultiset.erase(old_next_block_it); - } - //This is the remaining block - block_ctrl *rem_block = new(reinterpret_cast<block_ctrl*> - (reinterpret_cast<char*>(block) + intended_units*Alignment))block_ctrl; - rem_block->m_size = rem_units; - algo_impl_t::assert_alignment(rem_block); - BOOST_ASSERT(rem_block->m_size >= BlockCtrlUnits); - priv_mark_as_free_block(rem_block); - - //Now the second part of the fixup - if(size_invariants_broken) - m_header.m_imultiset.insert(m_header.m_imultiset.begin(), *rem_block); - else - m_header.m_imultiset.replace_node(old_next_block_it, *rem_block); - - //Write the new length - block->m_size = intended_user_units + AllocatedCtrlUnits; - BOOST_ASSERT(block->m_size >= BlockCtrlUnits); - m_header.m_allocated += (intended_units - old_block_units)*Alignment; - } - //There is no free space to create a new node: just merge both blocks - else{ - //Now we have to update the data in the tree - m_header.m_imultiset.erase(Imultiset::s_iterator_to(*next_block)); - - //Write the new length - block->m_size = merged_units; - BOOST_ASSERT(block->m_size >= BlockCtrlUnits); - m_header.m_allocated += (merged_units - old_block_units)*Alignment; - } - priv_mark_as_allocated_block(block); - received_size = ((size_type)block->m_size - AllocatedCtrlUnits)*Alignment + UsableByPreviousChunk; - return true; -} - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> inline -typename rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::block_ctrl * - rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::priv_prev_block - (typename rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::block_ctrl *ptr) -{ - BOOST_ASSERT(!ptr->m_prev_allocated); - return reinterpret_cast<block_ctrl *> - (reinterpret_cast<char*>(ptr) - ptr->m_prev_size*Alignment); -} - - - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> inline -typename rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::block_ctrl * - rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::priv_end_block - (typename rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::block_ctrl *first_segment_block) -{ - //The first block's logic is different from the rest of blocks: stores in m_prev_size the absolute - //distance with the end block - BOOST_ASSERT(first_segment_block->m_prev_allocated); - block_ctrl *end_block = reinterpret_cast<block_ctrl *> - (reinterpret_cast<char*>(first_segment_block) + first_segment_block->m_prev_size*Alignment); - (void)end_block; - BOOST_ASSERT(end_block->m_allocated == 1); - BOOST_ASSERT(end_block->m_size == first_segment_block->m_prev_size); - BOOST_ASSERT(end_block > first_segment_block); - return end_block; -} - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> inline -typename rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::block_ctrl * - rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::priv_first_block - (typename rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::block_ctrl *end_segment_block) -{ - //The first block's logic is different from the rest of blocks: stores in m_prev_size the absolute - //distance with the end block - BOOST_ASSERT(end_segment_block->m_allocated); - block_ctrl *first_block = reinterpret_cast<block_ctrl *> - (reinterpret_cast<char*>(end_segment_block) - end_segment_block->m_size*Alignment); - (void)first_block; - BOOST_ASSERT(first_block->m_prev_allocated == 1); - BOOST_ASSERT(first_block->m_prev_size == end_segment_block->m_size); - BOOST_ASSERT(end_segment_block > first_block); - return first_block; -} - - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> inline -typename rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::block_ctrl * - rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::priv_next_block - (typename rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::block_ctrl *ptr) -{ - return reinterpret_cast<block_ctrl *> - (reinterpret_cast<char*>(ptr) + ptr->m_size*Alignment); -} - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> inline -bool rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::priv_is_allocated_block - (typename rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::block_ctrl *block) -{ - bool allocated = block->m_allocated != 0; - #ifndef NDEBUG - if(block != priv_end_block()){ - block_ctrl *next_block = reinterpret_cast<block_ctrl *> - (reinterpret_cast<char*>(block) + block->m_size*Alignment); - bool next_block_prev_allocated = next_block->m_prev_allocated != 0; - (void)next_block_prev_allocated; - BOOST_ASSERT(allocated == next_block_prev_allocated); - } - else{ - block = block; - } - #endif - return allocated; -} - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> inline -bool rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::priv_is_prev_allocated - (typename rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::block_ctrl *block) -{ - if(block->m_prev_allocated){ - return true; - } - else{ - #ifndef NDEBUG - if(block != priv_first_block()){ - block_ctrl *prev = priv_prev_block(block); - (void)prev; - BOOST_ASSERT(!prev->m_allocated); - } - else{ - block = block; - } - #endif - return false; - } -} - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> inline -void rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::priv_mark_as_allocated_block - (typename rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::block_ctrl *block) -{ - block->m_allocated = 1; - reinterpret_cast<block_ctrl *> - (reinterpret_cast<char*>(block)+ block->m_size*Alignment)->m_prev_allocated = 1; -} - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> inline -void rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::priv_mark_as_free_block - (typename rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::block_ctrl *block) -{ - block->m_allocated = 0; - block_ctrl *next_block = priv_next_block(block); - next_block->m_prev_allocated = 0; - next_block->m_prev_size = block->m_size; -} - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> inline -void* rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::priv_check_and_allocate - (size_type nunits - ,typename rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::block_ctrl* block - ,size_type &received_size) -{ - size_type upper_nunits = nunits + BlockCtrlUnits; - imultiset_iterator it_old = Imultiset::s_iterator_to(*block); - algo_impl_t::assert_alignment(block); - - if (block->m_size >= upper_nunits){ - //This block is bigger than needed, split it in - //two blocks, the first's size will be "units" and - //the second's size "block->m_size-units" - size_type block_old_size = block->m_size; - block->m_size = nunits; - BOOST_ASSERT(block->m_size >= BlockCtrlUnits); - - //This is the remaining block - block_ctrl *rem_block = new(reinterpret_cast<block_ctrl*> - (reinterpret_cast<char*>(block) + Alignment*nunits))block_ctrl; - algo_impl_t::assert_alignment(rem_block); - rem_block->m_size = block_old_size - nunits; - BOOST_ASSERT(rem_block->m_size >= BlockCtrlUnits); - priv_mark_as_free_block(rem_block); - - imultiset_iterator it_hint; - if(it_old == m_header.m_imultiset.begin() - || (--imultiset_iterator(it_old))->m_size < rem_block->m_size){ - //option a: slow but secure - //m_header.m_imultiset.insert(m_header.m_imultiset.erase(it_old), *rem_block); - //option b: Construct an empty node and swap - //Imultiset::init_node(*rem_block); - //block->swap_nodes(*rem_block); - //option c: replace the node directly - m_header.m_imultiset.replace_node(Imultiset::s_iterator_to(*it_old), *rem_block); - } - else{ - //Now we have to update the data in the tree - m_header.m_imultiset.erase(it_old); - m_header.m_imultiset.insert(m_header.m_imultiset.begin(), *rem_block); - } - - } - else if (block->m_size >= nunits){ - m_header.m_imultiset.erase(it_old); - } - else{ - BOOST_ASSERT(0); - return 0; - } - //We need block_ctrl for deallocation stuff, so - //return memory user can overwrite - m_header.m_allocated += (size_type)block->m_size*Alignment; - received_size = ((size_type)block->m_size - AllocatedCtrlUnits)*Alignment + UsableByPreviousChunk; - - //Mark the block as allocated - priv_mark_as_allocated_block(block); - - //Clear the memory occupied by the tree hook, since this won't be - //cleared with zero_free_memory - TreeHook *t = static_cast<TreeHook*>(block); - //Just clear the memory part reserved for the user - std::size_t tree_hook_offset_in_block = (char*)t - (char*)block; - //volatile char *ptr = - char *ptr = reinterpret_cast<char*>(block)+tree_hook_offset_in_block; - const std::size_t s = BlockCtrlBytes - tree_hook_offset_in_block; - std::memset(ptr, 0, s); - this->priv_next_block(block)->m_prev_size = 0; - return priv_get_user_buffer(block); -} - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> -void rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::deallocate(void* addr) -{ - if(!addr) return; - //----------------------- - boost::interprocess::scoped_lock<mutex_type> guard(m_header); - //----------------------- - return this->priv_deallocate(addr); -} - -template<class MutexFamily, class VoidPointer, std::size_t MemAlignment> -void rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::priv_deallocate(void* addr) -{ - if(!addr) return; - - block_ctrl *block = priv_get_block(addr); - - //The blocks must be marked as allocated and the sizes must be equal - BOOST_ASSERT(priv_is_allocated_block(block)); -// BOOST_ASSERT(block->m_size == priv_tail_size(block)); - - //Check if alignment and block size are right - algo_impl_t::assert_alignment(addr); - - size_type block_old_size = Alignment*(size_type)block->m_size; - BOOST_ASSERT(m_header.m_allocated >= block_old_size); - - //Update used memory count - m_header.m_allocated -= block_old_size; - - //The block to insert in the tree - block_ctrl *block_to_insert = block; - - //Get the next block - block_ctrl *next_block = priv_next_block(block); - bool merge_with_prev = !priv_is_prev_allocated(block); - bool merge_with_next = !priv_is_allocated_block(next_block); - - //Merge logic. First just update block sizes, then fix free blocks tree - if(merge_with_prev || merge_with_next){ - //Merge if the previous is free - if(merge_with_prev){ - //Get the previous block - block_ctrl *prev_block = priv_prev_block(block); - prev_block->m_size += block->m_size; - BOOST_ASSERT(prev_block->m_size >= BlockCtrlUnits); - block_to_insert = prev_block; - } - //Merge if the next is free - if(merge_with_next){ - block_to_insert->m_size += next_block->m_size; - BOOST_ASSERT(block_to_insert->m_size >= BlockCtrlUnits); - if(merge_with_prev) - m_header.m_imultiset.erase(Imultiset::s_iterator_to(*next_block)); - } - - bool only_merge_next = !merge_with_prev && merge_with_next; - imultiset_iterator free_block_to_check_it - (Imultiset::s_iterator_to(only_merge_next ? *next_block : *block_to_insert)); - imultiset_iterator was_bigger_it(free_block_to_check_it); - - //Now try to shortcut erasure + insertion (O(log(N))) with - //a O(1) operation if merging does not alter tree positions - if(++was_bigger_it != m_header.m_imultiset.end() && - block_to_insert->m_size > was_bigger_it->m_size ){ - m_header.m_imultiset.erase(free_block_to_check_it); - m_header.m_imultiset.insert(m_header.m_imultiset.begin(), *block_to_insert); - } - else if(only_merge_next){ - m_header.m_imultiset.replace_node(free_block_to_check_it, *block_to_insert); - } - } - else{ - m_header.m_imultiset.insert(m_header.m_imultiset.begin(), *block_to_insert); - } - priv_mark_as_free_block(block_to_insert); -} - -/// @endcond - -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //#ifndef BOOST_INTERPROCESS_MEM_ALGO_RBTREE_BEST_FIT_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/offset_ptr.hpp b/src/third_party/boost-1.56.0/boost/interprocess/offset_ptr.hpp deleted file mode 100644 index bed7ffe8e0b..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/offset_ptr.hpp +++ /dev/null @@ -1,738 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_OFFSET_PTR_HPP -#define BOOST_INTERPROCESS_OFFSET_PTR_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> - -#include <boost/interprocess/interprocess_fwd.hpp> -#include <boost/interprocess/detail/utilities.hpp> -#include <boost/interprocess/detail/cast_tags.hpp> -#include <boost/interprocess/detail/mpl.hpp> -#include <boost/assert.hpp> -#include <ostream> -#include <istream> -#include <iterator> -#include <iostream> -#include <boost/aligned_storage.hpp> -#include <boost/type_traits/alignment_of.hpp> - -//!\file -//!Describes a smart pointer that stores the offset between this pointer and -//!target pointee, called offset_ptr. - -namespace boost { - -//Predeclarations -template <class T> -struct has_trivial_constructor; - -template <class T> -struct has_trivial_destructor; - -namespace interprocess { - -/// @cond -namespace ipcdetail { - - template<class OffsetType, std::size_t OffsetAlignment> - union offset_ptr_internal - { - explicit offset_ptr_internal(OffsetType off) - : m_offset(off) - {} - OffsetType m_offset; //Distance between this object and pointee address - typename ::boost::aligned_storage - < sizeof(OffsetType) - , (OffsetAlignment == offset_type_alignment) ? - ::boost::alignment_of<OffsetType>::value : OffsetAlignment - >::type alignment_helper; - }; - - //Note: using the address of a local variable to point to another address - //is not standard conforming and this can be optimized-away by the compiler. - //Non-inlining is a method to remain illegal but correct - - //Undef BOOST_INTERPROCESS_OFFSET_PTR_INLINE_XXX if your compiler can inline - //this code without breaking the library - - //////////////////////////////////////////////////////////////////////// - // - // offset_ptr_to_raw_pointer - // - //////////////////////////////////////////////////////////////////////// - #define BOOST_INTERPROCESS_OFFSET_PTR_INLINE_TO_PTR - #if defined(_MSC_VER) && (_MSC_VER >= 1800) && (defined(_M_AMD64) || defined(_M_X64)) - //Visual 2013 x64 optimizes more than we desire, so disable branchless option - #else - #define BOOST_INTERPROCESS_OFFSET_PTR_BRANCHLESS_TO_PTR - #endif - template<int Dummy> - #ifndef BOOST_INTERPROCESS_OFFSET_PTR_INLINE_TO_PTR - BOOST_INTERPROCESS_NEVER_INLINE - #elif defined(NDEBUG) - inline - #endif - void * offset_ptr_to_raw_pointer(const volatile void *this_ptr, std::size_t offset) - { - typedef pointer_size_t_caster<void*> caster_t; - #ifndef BOOST_INTERPROCESS_OFFSET_PTR_BRANCHLESS_TO_PTR - if(offset == 1){ - return 0; - } - else{ - const caster_t caster((void*)this_ptr); - return caster_t(caster.size() + offset).pointer(); - } - #else - const caster_t caster((void*)this_ptr); - std::size_t target_offset = caster.size() + offset; - std::size_t mask = -std::size_t(offset != 1); - target_offset &= mask; - return caster_t(target_offset).pointer(); - #endif - } - - #ifdef BOOST_INTERPROCESS_OFFSET_PTR_INLINE_TO_PTR - #undef BOOST_INTERPROCESS_OFFSET_PTR_INLINE_TO_PTR - #endif - #ifdef BOOST_INTERPROCESS_OFFSET_PTR_BRANCHLESS_TO_PTR - #undef BOOST_INTERPROCESS_OFFSET_PTR_BRANCHLESS_TO_PTR - #endif - - //////////////////////////////////////////////////////////////////////// - // - // offset_ptr_to_offset - // - //////////////////////////////////////////////////////////////////////// - #define BOOST_INTERPROCESS_OFFSET_PTR_INLINE_TO_OFF - //Branchless seems slower in x86 - #define BOOST_INTERPROCESS_OFFSET_PTR_BRANCHLESS_TO_OFF - - template<int Dummy> - #ifndef BOOST_INTERPROCESS_OFFSET_PTR_INLINE_TO_OFF - BOOST_INTERPROCESS_NEVER_INLINE - #elif defined(NDEBUG) - inline - #endif - std::size_t offset_ptr_to_offset(const volatile void *ptr, const volatile void *this_ptr) - { - typedef pointer_size_t_caster<void*> caster_t; - #ifndef BOOST_INTERPROCESS_OFFSET_PTR_BRANCHLESS_TO_OFF - //offset == 1 && ptr != 0 is not legal for this pointer - if(!ptr){ - return 1; - } - else{ - const caster_t this_caster((void*)this_ptr); - const caster_t ptr_caster((void*)ptr); - std::size_t offset = ptr_caster.size() - this_caster.size(); - BOOST_ASSERT(offset != 1); - return offset; - } - #else - const caster_t this_caster((void*)this_ptr); - const caster_t ptr_caster((void*)ptr); - //std::size_t other = -std::size_t(ptr != 0); - //std::size_t offset = (ptr_caster.size() - this_caster.size()) & other; - //return offset + !other; - // - std::size_t offset = (ptr_caster.size() - this_caster.size() - 1) & -std::size_t(ptr != 0); - return ++offset; - #endif - } - - #ifdef BOOST_INTERPROCESS_OFFSET_PTR_INLINE_TO_OFF - #undef BOOST_INTERPROCESS_OFFSET_PTR_INLINE_TO_OFF - #endif - #ifdef BOOST_INTERPROCESS_OFFSET_PTR_BRANCHLESS_TO_OFF - #undef BOOST_INTERPROCESS_OFFSET_PTR_BRANCHLESS_TO_OFF - #endif - - //////////////////////////////////////////////////////////////////////// - // - // offset_ptr_to_offset_from_other - // - //////////////////////////////////////////////////////////////////////// - #define BOOST_INTERPROCESS_OFFSET_PTR_INLINE_TO_OFF_FROM_OTHER - //Branchless seems slower in x86 - #define BOOST_INTERPROCESS_OFFSET_PTR_BRANCHLESS_TO_OFF_FROM_OTHER - - template<int Dummy> - #ifndef BOOST_INTERPROCESS_OFFSET_PTR_INLINE_TO_OFF_FROM_OTHER - BOOST_INTERPROCESS_NEVER_INLINE - #elif defined(NDEBUG) - inline - #endif - std::size_t offset_ptr_to_offset_from_other - (const volatile void *this_ptr, const volatile void *other_ptr, std::size_t other_offset) - { - typedef pointer_size_t_caster<void*> caster_t; - #ifndef BOOST_INTERPROCESS_OFFSET_PTR_BRANCHLESS_TO_OFF_FROM_OTHER - if(other_offset == 1){ - return 1; - } - else{ - const caster_t this_caster((void*)this_ptr); - const caster_t other_caster((void*)other_ptr); - std::size_t offset = other_caster.size() - this_caster.size() + other_offset; - BOOST_ASSERT(offset != 1); - return offset; - } - #else - const caster_t this_caster((void*)this_ptr); - const caster_t other_caster((void*)other_ptr); - return ((other_caster.size() - this_caster.size()) & -std::size_t(other_offset != 1)) + other_offset; - #endif - } - - #ifdef BOOST_INTERPROCESS_OFFSET_PTR_INLINE_TO_OFF_FROM_OTHER - #undef BOOST_INTERPROCESS_OFFSET_PTR_INLINE_TO_OFF_FROM_OTHER - #endif - #ifdef BOOST_INTERPROCESS_OFFSET_PTR_BRANCHLESS_TO_OFF_FROM_OTHER - #undef BOOST_INTERPROCESS_OFFSET_PTR_BRANCHLESS_TO_OFF_FROM_OTHER - #endif - - //////////////////////////////////////////////////////////////////////// - // - // Let's assume cast to void and cv cast don't change any target address - // - //////////////////////////////////////////////////////////////////////// - template<class From, class To> - struct offset_ptr_maintains_address - { - static const bool value = ipcdetail::is_cv_same<From, To>::value - || ipcdetail::is_cv_same<void, To>::value; - }; - -} //namespace ipcdetail { -/// @endcond - -//!A smart pointer that stores the offset between between the pointer and the -//!the object it points. This allows offset allows special properties, since -//!the pointer is independent from the address address of the pointee, if the -//!pointer and the pointee are still separated by the same offset. This feature -//!converts offset_ptr in a smart pointer that can be placed in shared memory and -//!memory mapped files mapped in different addresses in every process. -template <class PointedType, class DifferenceType, class OffsetType, std::size_t OffsetAlignment> -class offset_ptr -{ - /// @cond - typedef offset_ptr<PointedType, DifferenceType, OffsetType, OffsetAlignment> self_t; - void unspecified_bool_type_func() const {} - typedef void (self_t::*unspecified_bool_type)() const; - /// @endcond - - public: - typedef PointedType element_type; - typedef PointedType * pointer; - typedef typename ipcdetail:: - add_reference<PointedType>::type reference; - typedef typename ipcdetail:: - remove_volatile<typename ipcdetail:: - remove_const<PointedType>::type - >::type value_type; - typedef DifferenceType difference_type; - typedef std::random_access_iterator_tag iterator_category; - typedef OffsetType offset_type; - - public: //Public Functions - - //!Default constructor (null pointer). - //!Never throws. - offset_ptr() - : internal(1) - {} - - //!Constructor from raw pointer (allows "0" pointer conversion). - //!Never throws. - offset_ptr(pointer ptr) - : internal(static_cast<OffsetType>(ipcdetail::offset_ptr_to_offset<0>(ptr, this))) - {} - - //!Constructor from other pointer. - //!Never throws. - template <class T> - offset_ptr( T *ptr - , typename ipcdetail::enable_if< ipcdetail::is_convertible<T*, PointedType*> >::type * = 0) - : internal(static_cast<OffsetType> - (ipcdetail::offset_ptr_to_offset<0>(static_cast<PointedType*>(ptr), this))) - {} - - //!Constructor from other offset_ptr - //!Never throws. - offset_ptr(const offset_ptr& ptr) - : internal(static_cast<OffsetType> - (ipcdetail::offset_ptr_to_offset_from_other<0>(this, &ptr, ptr.internal.m_offset))) - {} - - //!Constructor from other offset_ptr. If pointers of pointee types are - //!convertible, offset_ptrs will be convertibles. Never throws. - template<class T2> - offset_ptr( const offset_ptr<T2, DifferenceType, OffsetType, OffsetAlignment> &ptr - #ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED - , typename ipcdetail::enable_if_c< ipcdetail::is_convertible<T2*, PointedType*>::value - && ipcdetail::offset_ptr_maintains_address<T2, PointedType>::value - >::type * = 0 - #endif - ) - : internal(static_cast<OffsetType> - (ipcdetail::offset_ptr_to_offset_from_other<0>(this, &ptr, ptr.get_offset()))) - {} - - #ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED - - //!Constructor from other offset_ptr. If pointers of pointee types are - //!convertible, offset_ptrs will be convertibles. Never throws. - template<class T2> - offset_ptr( const offset_ptr<T2, DifferenceType, OffsetType, OffsetAlignment> &ptr - , typename ipcdetail::enable_if_c< ipcdetail::is_convertible<T2*, PointedType*>::value - && !ipcdetail::offset_ptr_maintains_address<T2, PointedType>::value - >::type * = 0) - : internal(static_cast<OffsetType> - (ipcdetail::offset_ptr_to_offset<0>(static_cast<PointedType*>(ptr.get()), this))) - {} - - #endif - - //!Emulates static_cast operator. - //!Never throws. - template<class T2, class P2, class O2, std::size_t A2> - offset_ptr(const offset_ptr<T2, P2, O2, A2> & r, ipcdetail::static_cast_tag) - : internal(static_cast<OffsetType> - (ipcdetail::offset_ptr_to_offset<0>(static_cast<PointedType*>(r.get()), this))) - {} - - //!Emulates const_cast operator. - //!Never throws. - template<class T2, class P2, class O2, std::size_t A2> - offset_ptr(const offset_ptr<T2, P2, O2, A2> & r, ipcdetail::const_cast_tag) - : internal(static_cast<OffsetType> - (ipcdetail::offset_ptr_to_offset<0>(const_cast<PointedType*>(r.get()), this))) - {} - - //!Emulates dynamic_cast operator. - //!Never throws. - template<class T2, class P2, class O2, std::size_t A2> - offset_ptr(const offset_ptr<T2, P2, O2, A2> & r, ipcdetail::dynamic_cast_tag) - : internal(static_cast<OffsetType> - (ipcdetail::offset_ptr_to_offset<0>(dynamic_cast<PointedType*>(r.get()), this))) - {} - - //!Emulates reinterpret_cast operator. - //!Never throws. - template<class T2, class P2, class O2, std::size_t A2> - offset_ptr(const offset_ptr<T2, P2, O2, A2> & r, ipcdetail::reinterpret_cast_tag) - : internal(static_cast<OffsetType> - (ipcdetail::offset_ptr_to_offset<0>(reinterpret_cast<PointedType*>(r.get()), this))) - {} - - //!Obtains raw pointer from offset. - //!Never throws. - pointer get() const - { return (pointer)ipcdetail::offset_ptr_to_raw_pointer<0>(this, this->internal.m_offset); } - - offset_type get_offset() const - { return this->internal.m_offset; } - - //!Pointer-like -> operator. It can return 0 pointer. - //!Never throws. - pointer operator->() const - { return this->get(); } - - //!Dereferencing operator, if it is a null offset_ptr behavior - //! is undefined. Never throws. - reference operator* () const - { - pointer p = this->get(); - reference r = *p; - return r; - } - - //!Indexing operator. - //!Never throws. - reference operator[](difference_type idx) const - { return this->get()[idx]; } - - //!Assignment from pointer (saves extra conversion). - //!Never throws. - offset_ptr& operator= (pointer from) - { - this->internal.m_offset = - static_cast<OffsetType>(ipcdetail::offset_ptr_to_offset<0>(from, this)); - return *this; - } - - //!Assignment from other offset_ptr. - //!Never throws. - offset_ptr& operator= (const offset_ptr & ptr) - { - this->internal.m_offset = - static_cast<OffsetType>(ipcdetail::offset_ptr_to_offset_from_other<0>(this, &ptr, ptr.internal.m_offset)); - return *this; - } - - //!Assignment from related offset_ptr. If pointers of pointee types - //! are assignable, offset_ptrs will be assignable. Never throws. - template<class T2> - #ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED - typename ipcdetail::enable_if_c< ipcdetail::is_convertible<T2*, PointedType*>::value - && ipcdetail::offset_ptr_maintains_address<T2, PointedType>::value - , offset_ptr&>::type - #else - offset_ptr& - #endif - operator= (const offset_ptr<T2, DifferenceType, OffsetType, OffsetAlignment> &ptr) - { - this->internal.m_offset = - static_cast<OffsetType>(ipcdetail::offset_ptr_to_offset_from_other<0>(this, &ptr, ptr.get_offset())); - return *this; - } - - #ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED - template<class T2> - typename ipcdetail::enable_if_c<ipcdetail::is_convertible<T2*, PointedType*>::value - && !ipcdetail::offset_ptr_maintains_address<T2, PointedType>::value - , offset_ptr&>::type - operator= (const offset_ptr<T2, DifferenceType, OffsetType, OffsetAlignment> &ptr) - { - this->internal.m_offset = - static_cast<OffsetType>(ipcdetail::offset_ptr_to_offset<0>(static_cast<PointedType*>(ptr.get()), this)); - return *this; - } - #endif - - //!offset_ptr += difference_type. - //!Never throws. - offset_ptr &operator+= (difference_type offset) - { this->inc_offset(offset * sizeof (PointedType)); return *this; } - - //!offset_ptr -= difference_type. - //!Never throws. - offset_ptr &operator-= (difference_type offset) - { this->dec_offset(offset * sizeof (PointedType)); return *this; } - - //!++offset_ptr. - //!Never throws. - offset_ptr& operator++ (void) - { this->inc_offset(sizeof (PointedType)); return *this; } - - //!offset_ptr++. - //!Never throws. - offset_ptr operator++ (int) - { - offset_ptr tmp(*this); - this->inc_offset(sizeof (PointedType)); - return tmp; - } - - //!--offset_ptr. - //!Never throws. - offset_ptr& operator-- (void) - { this->dec_offset(sizeof (PointedType)); return *this; } - - //!offset_ptr--. - //!Never throws. - offset_ptr operator-- (int) - { - offset_ptr tmp(*this); - this->dec_offset(sizeof (PointedType)); - return tmp; - } - - //!safe bool conversion operator. - //!Never throws. - operator unspecified_bool_type() const - { return this->internal.m_offset != 1? &self_t::unspecified_bool_type_func : 0; } - - //!Not operator. Not needed in theory, but improves portability. - //!Never throws - bool operator! () const - { return this->internal.m_offset == 1; } - - //!Compatibility with pointer_traits - //! - template <class U> - struct rebind - { typedef offset_ptr<U, DifferenceType, OffsetType, OffsetAlignment> other; }; - - //!Compatibility with pointer_traits - //! - static offset_ptr pointer_to(reference r) - { return offset_ptr(&r); } - - //!difference_type + offset_ptr - //!operation - friend offset_ptr operator+(difference_type diff, offset_ptr right) - { right += diff; return right; } - - //!offset_ptr + difference_type - //!operation - friend offset_ptr operator+(offset_ptr left, difference_type diff) - { left += diff; return left; } - - //!offset_ptr - diff - //!operation - friend offset_ptr operator-(offset_ptr left, difference_type diff) - { left -= diff; return left; } - - //!offset_ptr - diff - //!operation - friend offset_ptr operator-(difference_type diff, offset_ptr right) - { right -= diff; return right; } - - //!offset_ptr - offset_ptr - //!operation - friend difference_type operator-(const offset_ptr &pt, const offset_ptr &pt2) - { return difference_type(pt.get()- pt2.get()); } - - //Comparison - friend bool operator== (const offset_ptr &pt1, const offset_ptr &pt2) - { return pt1.get() == pt2.get(); } - - friend bool operator!= (const offset_ptr &pt1, const offset_ptr &pt2) - { return pt1.get() != pt2.get(); } - - friend bool operator<(const offset_ptr &pt1, const offset_ptr &pt2) - { return pt1.get() < pt2.get(); } - - friend bool operator<=(const offset_ptr &pt1, const offset_ptr &pt2) - { return pt1.get() <= pt2.get(); } - - friend bool operator>(const offset_ptr &pt1, const offset_ptr &pt2) - { return pt1.get() > pt2.get(); } - - friend bool operator>=(const offset_ptr &pt1, const offset_ptr &pt2) - { return pt1.get() >= pt2.get(); } - - //Comparison to raw ptr to support literal 0 - friend bool operator== (pointer pt1, const offset_ptr &pt2) - { return pt1 == pt2.get(); } - - friend bool operator!= (pointer pt1, const offset_ptr &pt2) - { return pt1 != pt2.get(); } - - friend bool operator<(pointer pt1, const offset_ptr &pt2) - { return pt1 < pt2.get(); } - - friend bool operator<=(pointer pt1, const offset_ptr &pt2) - { return pt1 <= pt2.get(); } - - friend bool operator>(pointer pt1, const offset_ptr &pt2) - { return pt1 > pt2.get(); } - - friend bool operator>=(pointer pt1, const offset_ptr &pt2) - { return pt1 >= pt2.get(); } - - //Comparison - friend bool operator== (const offset_ptr &pt1, pointer pt2) - { return pt1.get() == pt2; } - - friend bool operator!= (const offset_ptr &pt1, pointer pt2) - { return pt1.get() != pt2; } - - friend bool operator<(const offset_ptr &pt1, pointer pt2) - { return pt1.get() < pt2; } - - friend bool operator<=(const offset_ptr &pt1, pointer pt2) - { return pt1.get() <= pt2; } - - friend bool operator>(const offset_ptr &pt1, pointer pt2) - { return pt1.get() > pt2; } - - friend bool operator>=(const offset_ptr &pt1, pointer pt2) - { return pt1.get() >= pt2; } - - friend void swap(offset_ptr &left, offset_ptr &right) - { - pointer ptr = right.get(); - right = left; - left = ptr; - } - - private: - /// @cond - void inc_offset(DifferenceType bytes) - { internal.m_offset += bytes; } - - void dec_offset(DifferenceType bytes) - { internal.m_offset -= bytes; } - - ipcdetail::offset_ptr_internal<OffsetType, OffsetAlignment> internal; - /// @endcond -}; - -//!operator<< -//!for offset ptr -template<class E, class T, class W, class X, class Y, std::size_t Z> -inline std::basic_ostream<E, T> & operator<< - (std::basic_ostream<E, T> & os, offset_ptr<W, X, Y, Z> const & p) -{ return os << p.get_offset(); } - -//!operator>> -//!for offset ptr -template<class E, class T, class W, class X, class Y, std::size_t Z> -inline std::basic_istream<E, T> & operator>> - (std::basic_istream<E, T> & is, offset_ptr<W, X, Y, Z> & p) -{ return is >> p.get_offset(); } - -//!Simulation of static_cast between pointers. Never throws. -template<class T1, class P1, class O1, std::size_t A1, class T2, class P2, class O2, std::size_t A2> -inline boost::interprocess::offset_ptr<T1, P1, O1, A1> - static_pointer_cast(const boost::interprocess::offset_ptr<T2, P2, O2, A2> & r) -{ - return boost::interprocess::offset_ptr<T1, P1, O1, A1> - (r, boost::interprocess::ipcdetail::static_cast_tag()); -} - -//!Simulation of const_cast between pointers. Never throws. -template<class T1, class P1, class O1, std::size_t A1, class T2, class P2, class O2, std::size_t A2> -inline boost::interprocess::offset_ptr<T1, P1, O1, A1> - const_pointer_cast(const boost::interprocess::offset_ptr<T2, P2, O2, A2> & r) -{ - return boost::interprocess::offset_ptr<T1, P1, O1, A1> - (r, boost::interprocess::ipcdetail::const_cast_tag()); -} - -//!Simulation of dynamic_cast between pointers. Never throws. -template<class T1, class P1, class O1, std::size_t A1, class T2, class P2, class O2, std::size_t A2> -inline boost::interprocess::offset_ptr<T1, P1, O1, A1> - dynamic_pointer_cast(const boost::interprocess::offset_ptr<T2, P2, O2, A2> & r) -{ - return boost::interprocess::offset_ptr<T1, P1, O1, A1> - (r, boost::interprocess::ipcdetail::dynamic_cast_tag()); -} - -//!Simulation of reinterpret_cast between pointers. Never throws. -template<class T1, class P1, class O1, std::size_t A1, class T2, class P2, class O2, std::size_t A2> -inline boost::interprocess::offset_ptr<T1, P1, O1, A1> - reinterpret_pointer_cast(const boost::interprocess::offset_ptr<T2, P2, O2, A2> & r) -{ - return boost::interprocess::offset_ptr<T1, P1, O1, A1> - (r, boost::interprocess::ipcdetail::reinterpret_cast_tag()); -} - -} //namespace interprocess { - -/// @cond - -//!has_trivial_constructor<> == true_type specialization for optimizations -template <class T, class P, class O, std::size_t A> -struct has_trivial_constructor< boost::interprocess::offset_ptr<T, P, O, A> > -{ - static const bool value = true; -}; - -///has_trivial_destructor<> == true_type specialization for optimizations -template <class T, class P, class O, std::size_t A> -struct has_trivial_destructor< boost::interprocess::offset_ptr<T, P, O, A> > -{ - static const bool value = true; -}; - - -namespace interprocess { - -//!to_raw_pointer() enables boost::mem_fn to recognize offset_ptr. -//!Never throws. -template <class T, class P, class O, std::size_t A> -inline T * to_raw_pointer(boost::interprocess::offset_ptr<T, P, O, A> const & p) -{ return ipcdetail::to_raw_pointer(p); } - -} //namespace interprocess - - -/// @endcond -} //namespace boost { - -/// @cond - -namespace boost{ - -//This is to support embedding a bit in the pointer -//for intrusive containers, saving space -namespace intrusive { - -//Predeclaration to avoid including header -template<class VoidPointer, std::size_t N> -struct max_pointer_plus_bits; - -template<std::size_t OffsetAlignment, class P, class O, std::size_t A> -struct max_pointer_plus_bits<boost::interprocess::offset_ptr<void, P, O, A>, OffsetAlignment> -{ - //The offset ptr can embed one bit less than the alignment since it - //uses offset == 1 to store the null pointer. - static const std::size_t value = ::boost::interprocess::ipcdetail::ls_zeros<OffsetAlignment>::value - 1; -}; - -//Predeclaration -template<class Pointer, std::size_t NumBits> -struct pointer_plus_bits; - -template<class T, class P, class O, std::size_t A, std::size_t NumBits> -struct pointer_plus_bits<boost::interprocess::offset_ptr<T, P, O, A>, NumBits> -{ - typedef boost::interprocess::offset_ptr<T, P, O, A> pointer; - typedef ::boost::interprocess::pointer_size_t_caster<T*> caster_t; - //Bits are stored in the lower bits of the pointer except the LSB, - //because this bit is used to represent the null pointer. - static const std::size_t Mask = ((std::size_t(1) << NumBits) - 1) << 1u; - - static pointer get_pointer(const pointer &n) - { - caster_t caster(n.get()); - return pointer(caster_t(caster.size() & ~Mask).pointer()); - } - - static void set_pointer(pointer &n, const pointer &p) - { - caster_t n_caster(n.get()); - caster_t p_caster(p.get()); - BOOST_ASSERT(0 == (p_caster.size() & Mask)); - n = caster_t(p_caster.size() | (n_caster.size() & Mask)).pointer(); - } - - static std::size_t get_bits(const pointer &n) - { return (caster_t(n.get()).size() & Mask) >> 1u; } - - static void set_bits(pointer &n, std::size_t b) - { - BOOST_ASSERT(b < (std::size_t(1) << NumBits)); - caster_t n_caster(n.get()); - n = caster_t((n_caster.size() & ~Mask) | (b << 1u)).pointer(); - } -}; - -} //namespace intrusive - -//Predeclaration -template<class T, class U> -struct pointer_to_other; - -//Backwards compatibility with pointer_to_other -template <class PointedType, class DifferenceType, class OffsetType, std::size_t OffsetAlignment, class U> -struct pointer_to_other - < ::boost::interprocess::offset_ptr<PointedType, DifferenceType, OffsetType, OffsetAlignment>, U > -{ - typedef ::boost::interprocess::offset_ptr<U, DifferenceType, OffsetType, OffsetAlignment> type; -}; - -} //namespace boost{ -/// @endcond - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //#ifndef BOOST_INTERPROCESS_OFFSET_PTR_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/permissions.hpp b/src/third_party/boost-1.56.0/boost/interprocess/permissions.hpp deleted file mode 100644 index 7403f3bcb1c..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/permissions.hpp +++ /dev/null @@ -1,132 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_PERMISSIONS_HPP -#define BOOST_INTERPROCESS_PERMISSIONS_HPP - -/// @cond - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> -#include <boost/interprocess/interprocess_fwd.hpp> - -#if defined(BOOST_INTERPROCESS_WINDOWS) - -#include <boost/interprocess/detail/win32_api.hpp> - -#endif - -/// @endcond - -//!\file -//!Describes permissions class - -namespace boost { -namespace interprocess { - -/// @cond - -#if defined(BOOST_INTERPROCESS_WINDOWS) - -namespace ipcdetail { - -template <int Dummy> -struct unrestricted_permissions_holder -{ - static winapi::interprocess_all_access_security unrestricted; -}; - -template<int Dummy> -winapi::interprocess_all_access_security unrestricted_permissions_holder<Dummy>::unrestricted; - -} //namespace ipcdetail { - -#endif //defined BOOST_INTERPROCESS_WINDOWS - -/// @endcond - -//!The permissions class represents permissions to be set to shared memory or -//!files, that can be constructed form usual permission representations: -//!a SECURITY_ATTRIBUTES pointer in windows or ORed rwx chmod integer in UNIX. -class permissions -{ - /// @cond - - #if defined(BOOST_INTERPROCESS_WINDOWS) - typedef void* os_permissions_type; - #else - typedef int os_permissions_type; - #endif - os_permissions_type m_perm; - - /// @endcond - - public: - //!Constructs a permissions object from a user provided os-dependent - //!permissions. - permissions(os_permissions_type type) - : m_perm(type) - {} - - //!Constructs a default permissions object: - //!A null security attributes pointer for windows or 0644 - //!for UNIX. - permissions() - { set_default(); } - - //!Sets permissions to default values: - //!A null security attributes pointer for windows or 0644 - //!for UNIX. - void set_default() - { - /// @cond - #if defined (BOOST_INTERPROCESS_WINDOWS) - m_perm = 0; - #else - m_perm = 0644; - #endif - /// @endcond - } - - //!Sets permissions to unrestricted access: - //!A null DACL for windows or 0666 for UNIX. - void set_unrestricted() - { - /// @cond - #if defined (BOOST_INTERPROCESS_WINDOWS) - m_perm = &ipcdetail::unrestricted_permissions_holder<0>::unrestricted; - #else - m_perm = 0666; - #endif - /// @endcond - } - - //!Sets permissions from a user provided os-dependent - //!permissions. - void set_permissions(os_permissions_type perm) - { m_perm = perm; } - - //!Returns stored os-dependent - //!permissions - os_permissions_type get_permissions() const - { return m_perm; } -}; - -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //BOOST_INTERPROCESS_PERMISSIONS_HPP - diff --git a/src/third_party/boost-1.56.0/boost/interprocess/segment_manager.hpp b/src/third_party/boost-1.56.0/boost/interprocess/segment_manager.hpp deleted file mode 100644 index 381edaf3c64..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/segment_manager.hpp +++ /dev/null @@ -1,1341 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_SEGMENT_MANAGER_HPP -#define BOOST_INTERPROCESS_SEGMENT_MANAGER_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> - -#include <boost/detail/no_exceptions_support.hpp> -#include <boost/interprocess/detail/type_traits.hpp> - -#include <boost/interprocess/detail/transform_iterator.hpp> - -#include <boost/interprocess/detail/mpl.hpp> -#include <boost/interprocess/detail/segment_manager_helper.hpp> -#include <boost/interprocess/detail/named_proxy.hpp> -#include <boost/interprocess/detail/utilities.hpp> -#include <boost/interprocess/offset_ptr.hpp> -#include <boost/interprocess/indexes/iset_index.hpp> -#include <boost/interprocess/exceptions.hpp> -#include <boost/interprocess/allocators/allocator.hpp> -#include <boost/interprocess/smart_ptr/deleter.hpp> -#include <boost/move/move.hpp> -#include <boost/interprocess/sync/scoped_lock.hpp> -#include <cstddef> //std::size_t -#include <string> //char_traits -#include <new> //std::nothrow -#include <utility> //std::pair -#include <boost/assert.hpp> -#ifndef BOOST_NO_EXCEPTIONS -#include <exception> -#endif - -//!\file -//!Describes the object placed in a memory segment that provides -//!named object allocation capabilities for single-segment and -//!multi-segment allocations. - -namespace boost{ -namespace interprocess{ - -//!This object is the public base class of segment manager. -//!This class only depends on the memory allocation algorithm -//!and implements all the allocation features not related -//!to named or unique objects. -//! -//!Storing a reference to segment_manager forces -//!the holder class to be dependent on index types and character types. -//!When such dependence is not desirable and only anonymous and raw -//!allocations are needed, segment_manager_base is the correct answer. -template<class MemoryAlgorithm> -class segment_manager_base - : private MemoryAlgorithm -{ - public: - typedef segment_manager_base<MemoryAlgorithm> segment_manager_base_type; - typedef typename MemoryAlgorithm::void_pointer void_pointer; - typedef typename MemoryAlgorithm::mutex_family mutex_family; - typedef MemoryAlgorithm memory_algorithm; - - /// @cond - - //Experimental. Don't use - typedef typename MemoryAlgorithm::multiallocation_chain multiallocation_chain; - typedef typename MemoryAlgorithm::difference_type difference_type; - typedef typename MemoryAlgorithm::size_type size_type; - - /// @endcond - - //!This constant indicates the payload size - //!associated with each allocation of the memory algorithm - static const size_type PayloadPerAllocation = MemoryAlgorithm::PayloadPerAllocation; - - //!Constructor of the segment_manager_base - //! - //!"size" is the size of the memory segment where - //!the basic segment manager is being constructed. - //! - //!"reserved_bytes" is the number of bytes - //!after the end of the memory algorithm object itself - //!that the memory algorithm will exclude from - //!dynamic allocation - //! - //!Can throw - segment_manager_base(size_type sz, size_type reserved_bytes) - : MemoryAlgorithm(sz, reserved_bytes) - { - BOOST_ASSERT((sizeof(segment_manager_base<MemoryAlgorithm>) == sizeof(MemoryAlgorithm))); - } - - //!Returns the size of the memory - //!segment - size_type get_size() const - { return MemoryAlgorithm::get_size(); } - - //!Returns the number of free bytes of the memory - //!segment - size_type get_free_memory() const - { return MemoryAlgorithm::get_free_memory(); } - - //!Obtains the minimum size needed by - //!the segment manager - static size_type get_min_size (size_type size) - { return MemoryAlgorithm::get_min_size(size); } - - //!Allocates nbytes bytes. This function is only used in - //!single-segment management. Never throws - void * allocate (size_type nbytes, std::nothrow_t) - { return MemoryAlgorithm::allocate(nbytes); } - - /// @cond - - //Experimental. Dont' use. - //!Allocates n_elements of elem_bytes bytes. - //!Throws bad_alloc on failure. chain.size() is not increased on failure. - void allocate_many(size_type elem_bytes, size_type n_elements, multiallocation_chain &chain) - { - size_type prev_size = chain.size(); - MemoryAlgorithm::allocate_many(elem_bytes, n_elements, chain); - if(!elem_bytes || chain.size() == prev_size){ - throw bad_alloc(); - } - } - - //!Allocates n_elements, each one of element_lengths[i]*sizeof_element bytes. - //!Throws bad_alloc on failure. chain.size() is not increased on failure. - void allocate_many(const size_type *element_lengths, size_type n_elements, size_type sizeof_element, multiallocation_chain &chain) - { - size_type prev_size = chain.size(); - MemoryAlgorithm::allocate_many(element_lengths, n_elements, sizeof_element, chain); - if(!sizeof_element || chain.size() == prev_size){ - throw bad_alloc(); - } - } - - //!Allocates n_elements of elem_bytes bytes. - //!Non-throwing version. chain.size() is not increased on failure. - void allocate_many(std::nothrow_t, size_type elem_bytes, size_type n_elements, multiallocation_chain &chain) - { MemoryAlgorithm::allocate_many(elem_bytes, n_elements, chain); } - - //!Allocates n_elements, each one of - //!element_lengths[i]*sizeof_element bytes. - //!Non-throwing version. chain.size() is not increased on failure. - void allocate_many(std::nothrow_t, const size_type *elem_sizes, size_type n_elements, size_type sizeof_element, multiallocation_chain &chain) - { MemoryAlgorithm::allocate_many(elem_sizes, n_elements, sizeof_element, chain); } - - //!Deallocates all elements contained in chain. - //!Never throws. - void deallocate_many(multiallocation_chain &chain) - { MemoryAlgorithm::deallocate_many(chain); } - - /// @endcond - - //!Allocates nbytes bytes. Throws boost::interprocess::bad_alloc - //!on failure - void * allocate(size_type nbytes) - { - void * ret = MemoryAlgorithm::allocate(nbytes); - if(!ret) - throw bad_alloc(); - return ret; - } - - //!Allocates nbytes bytes. This function is only used in - //!single-segment management. Never throws - void * allocate_aligned (size_type nbytes, size_type alignment, std::nothrow_t) - { return MemoryAlgorithm::allocate_aligned(nbytes, alignment); } - - //!Allocates nbytes bytes. This function is only used in - //!single-segment management. Throws bad_alloc when fails - void * allocate_aligned(size_type nbytes, size_type alignment) - { - void * ret = MemoryAlgorithm::allocate_aligned(nbytes, alignment); - if(!ret) - throw bad_alloc(); - return ret; - } - - /// @cond - - template<class T> - std::pair<T *, bool> - allocation_command (boost::interprocess::allocation_type command, size_type limit_size, - size_type preferred_size,size_type &received_size, - T *reuse_ptr = 0) - { - std::pair<T *, bool> ret = MemoryAlgorithm::allocation_command - ( command | boost::interprocess::nothrow_allocation, limit_size, preferred_size, received_size - , reuse_ptr); - if(!(command & boost::interprocess::nothrow_allocation) && !ret.first) - throw bad_alloc(); - return ret; - } - - std::pair<void *, bool> - raw_allocation_command (boost::interprocess::allocation_type command, size_type limit_objects, - size_type preferred_objects,size_type &received_objects, - void *reuse_ptr = 0, size_type sizeof_object = 1) - { - std::pair<void *, bool> ret = MemoryAlgorithm::raw_allocation_command - ( command | boost::interprocess::nothrow_allocation, limit_objects, preferred_objects, received_objects - , reuse_ptr, sizeof_object); - if(!(command & boost::interprocess::nothrow_allocation) && !ret.first) - throw bad_alloc(); - return ret; - } - - /// @endcond - - //!Deallocates the bytes allocated with allocate/allocate_many() - //!pointed by addr - void deallocate (void *addr) - { MemoryAlgorithm::deallocate(addr); } - - //!Increases managed memory in extra_size bytes more. This only works - //!with single-segment management. - void grow(size_type extra_size) - { MemoryAlgorithm::grow(extra_size); } - - //!Decreases managed memory to the minimum. This only works - //!with single-segment management. - void shrink_to_fit() - { MemoryAlgorithm::shrink_to_fit(); } - - //!Returns the result of "all_memory_deallocated()" function - //!of the used memory algorithm - bool all_memory_deallocated() - { return MemoryAlgorithm::all_memory_deallocated(); } - - //!Returns the result of "check_sanity()" function - //!of the used memory algorithm - bool check_sanity() - { return MemoryAlgorithm::check_sanity(); } - - //!Writes to zero free memory (memory not yet allocated) - //!of the memory algorithm - void zero_free_memory() - { MemoryAlgorithm::zero_free_memory(); } - - //!Returns the size of the buffer previously allocated pointed by ptr - size_type size(const void *ptr) const - { return MemoryAlgorithm::size(ptr); } - - /// @cond - protected: - void * prot_anonymous_construct - (size_type num, bool dothrow, ipcdetail::in_place_interface &table) - { - typedef ipcdetail::block_header<size_type> block_header_t; - block_header_t block_info ( size_type(table.size*num) - , size_type(table.alignment) - , anonymous_type - , 1 - , 0); - - //Allocate memory - void *ptr_struct = this->allocate(block_info.total_size(), std::nothrow_t()); - - //Check if there is enough memory - if(!ptr_struct){ - if(dothrow){ - throw bad_alloc(); - } - else{ - return 0; - } - } - - //Build scoped ptr to avoid leaks with constructor exception - ipcdetail::mem_algo_deallocator<MemoryAlgorithm> mem(ptr_struct, *this); - - //Now construct the header - block_header_t * hdr = new(ptr_struct) block_header_t(block_info); - void *ptr = 0; //avoid gcc warning - ptr = hdr->value(); - - //Now call constructors - ipcdetail::array_construct(ptr, num, table); - - //All constructors successful, we don't want erase memory - mem.release(); - return ptr; - } - - //!Calls the destructor and makes an anonymous deallocate - void prot_anonymous_destroy(const void *object, ipcdetail::in_place_interface &table) - { - - //Get control data from associated with this object - typedef ipcdetail::block_header<size_type> block_header_t; - block_header_t *ctrl_data = block_header_t::block_header_from_value(object, table.size, table.alignment); - - //------------------------------- - //scoped_lock<rmutex> guard(m_header); - //------------------------------- - - if(ctrl_data->alloc_type() != anonymous_type){ - //This is not an anonymous object, the pointer is wrong! - BOOST_ASSERT(0); - } - - //Call destructors and free memory - //Build scoped ptr to avoid leaks with destructor exception - std::size_t destroyed = 0; - table.destroy_n(const_cast<void*>(object), ctrl_data->m_value_bytes/table.size, destroyed); - this->deallocate(ctrl_data); - } - /// @endcond -}; - -//!This object is placed in the beginning of memory segment and -//!implements the allocation (named or anonymous) of portions -//!of the segment. This object contains two indexes that -//!maintain an association between a name and a portion of the segment. -//! -//!The first index contains the mappings for normal named objects using the -//!char type specified in the template parameter. -//! -//!The second index contains the association for unique instances. The key will -//!be the const char * returned from type_info.name() function for the unique -//!type to be constructed. -//! -//!segment_manager<CharType, MemoryAlgorithm, IndexType> inherits publicly -//!from segment_manager_base<MemoryAlgorithm> and inherits from it -//!many public functions related to anonymous object and raw memory allocation. -//!See segment_manager_base reference to know about those functions. -template<class CharType - ,class MemoryAlgorithm - ,template<class IndexConfig> class IndexType> -class segment_manager - : public segment_manager_base<MemoryAlgorithm> -{ - /// @cond - //Non-copyable - segment_manager(); - segment_manager(const segment_manager &); - segment_manager &operator=(const segment_manager &); - typedef segment_manager_base<MemoryAlgorithm> segment_manager_base_t; - /// @endcond - - public: - typedef MemoryAlgorithm memory_algorithm; - typedef typename segment_manager_base_t::void_pointer void_pointer; - typedef typename segment_manager_base_t::size_type size_type; - typedef typename segment_manager_base_t::difference_type difference_type; - typedef CharType char_type; - - typedef segment_manager_base<MemoryAlgorithm> segment_manager_base_type; - - static const size_type PayloadPerAllocation = segment_manager_base_t::PayloadPerAllocation; - - /// @cond - private: - typedef ipcdetail::block_header<size_type> block_header_t; - typedef ipcdetail::index_config<CharType, MemoryAlgorithm> index_config_named; - typedef ipcdetail::index_config<char, MemoryAlgorithm> index_config_unique; - typedef IndexType<index_config_named> index_type; - typedef ipcdetail::bool_<is_intrusive_index<index_type>::value > is_intrusive_t; - typedef ipcdetail::bool_<is_node_index<index_type>::value> is_node_index_t; - - public: - typedef IndexType<index_config_named> named_index_t; - typedef IndexType<index_config_unique> unique_index_t; - typedef ipcdetail::char_ptr_holder<CharType> char_ptr_holder_t; - typedef ipcdetail::segment_manager_iterator_transform - <typename named_index_t::const_iterator - ,is_intrusive_index<index_type>::value> named_transform; - - typedef ipcdetail::segment_manager_iterator_transform - <typename unique_index_t::const_iterator - ,is_intrusive_index<index_type>::value> unique_transform; - /// @endcond - - typedef typename segment_manager_base_t::mutex_family mutex_family; - - typedef transform_iterator - <typename named_index_t::const_iterator, named_transform> const_named_iterator; - typedef transform_iterator - <typename unique_index_t::const_iterator, unique_transform> const_unique_iterator; - - /// @cond - - //!Constructor proxy object definition helper class - template<class T> - struct construct_proxy - { - typedef ipcdetail::named_proxy<segment_manager, T, false> type; - }; - - //!Constructor proxy object definition helper class - template<class T> - struct construct_iter_proxy - { - typedef ipcdetail::named_proxy<segment_manager, T, true> type; - }; - - /// @endcond - - //!Constructor of the segment manager - //!"size" is the size of the memory segment where - //!the segment manager is being constructed. - //!Can throw - explicit segment_manager(size_type segment_size) - : segment_manager_base_t(segment_size, priv_get_reserved_bytes()) - , m_header(static_cast<segment_manager_base_t*>(get_this_pointer())) - { - (void) anonymous_instance; (void) unique_instance; - //Check EBO is applied, it's required - const void * const this_addr = this; - const void *const segm_addr = static_cast<segment_manager_base_t*>(this); - (void)this_addr; (void)segm_addr; - BOOST_ASSERT( this_addr == segm_addr); - } - - //!Tries to find a previous named/unique allocation. Returns the address - //!and the object count. On failure the first member of the - //!returned pair is 0. - template <class T> - std::pair<T*, size_type> find (char_ptr_holder_t name) - { return this->priv_find_impl<T>(name, true); } - - //!Tries to find a previous named/unique allocation. Returns the address - //!and the object count. On failure the first member of the - //!returned pair is 0. This search is not mutex-protected! - //!Use it only inside atomic_func() calls, where the internal mutex - //!is guaranteed to be locked. - template <class T> - std::pair<T*, size_type> find_no_lock (char_ptr_holder_t name) - { return this->priv_find_impl<T>(name, false); } - - //!Returns throwing "construct" proxy - //!object - template <class T> - typename construct_proxy<T>::type - construct(char_ptr_holder_t name) - { return typename construct_proxy<T>::type (this, name, false, true); } - - //!Returns throwing "search or construct" proxy - //!object - template <class T> - typename construct_proxy<T>::type find_or_construct(char_ptr_holder_t name) - { return typename construct_proxy<T>::type (this, name, true, true); } - - //!Returns no throwing "construct" proxy - //!object - template <class T> - typename construct_proxy<T>::type - construct(char_ptr_holder_t name, std::nothrow_t) - { return typename construct_proxy<T>::type (this, name, false, false); } - - //!Returns no throwing "search or construct" - //!proxy object - template <class T> - typename construct_proxy<T>::type - find_or_construct(char_ptr_holder_t name, std::nothrow_t) - { return typename construct_proxy<T>::type (this, name, true, false); } - - //!Returns throwing "construct from iterators" proxy object - template <class T> - typename construct_iter_proxy<T>::type - construct_it(char_ptr_holder_t name) - { return typename construct_iter_proxy<T>::type (this, name, false, true); } - - //!Returns throwing "search or construct from iterators" - //!proxy object - template <class T> - typename construct_iter_proxy<T>::type - find_or_construct_it(char_ptr_holder_t name) - { return typename construct_iter_proxy<T>::type (this, name, true, true); } - - //!Returns no throwing "construct from iterators" - //!proxy object - template <class T> - typename construct_iter_proxy<T>::type - construct_it(char_ptr_holder_t name, std::nothrow_t) - { return typename construct_iter_proxy<T>::type (this, name, false, false); } - - //!Returns no throwing "search or construct from iterators" - //!proxy object - template <class T> - typename construct_iter_proxy<T>::type - find_or_construct_it(char_ptr_holder_t name, std::nothrow_t) - { return typename construct_iter_proxy<T>::type (this, name, true, false); } - - //!Calls object function blocking recursive interprocess_mutex and guarantees that - //!no new named_alloc or destroy will be executed by any process while - //!executing the object function call - template <class Func> - void atomic_func(Func &f) - { scoped_lock<rmutex> guard(m_header); f(); } - - //!Tries to calls a functor guaranteeing that no new construction, search or - //!destruction will be executed by any process while executing the object - //!function call. If the atomic function can't be immediatelly executed - //!because the internal mutex is already locked, returns false. - //!If the functor throws, this function throws. - template <class Func> - bool try_atomic_func(Func &f) - { - scoped_lock<rmutex> guard(m_header, try_to_lock); - if(guard){ - f(); - return true; - } - else{ - return false; - } - } - - //!Destroys a previously created named/unique instance. - //!Returns false if the object was not present. - template <class T> - bool destroy(char_ptr_holder_t name) - { - BOOST_ASSERT(!name.is_anonymous()); - ipcdetail::placement_destroy<T> dtor; - - if(name.is_unique()){ - return this->priv_generic_named_destroy<char> - ( typeid(T).name(), m_header.m_unique_index , dtor, is_intrusive_t()); - } - else{ - return this->priv_generic_named_destroy<CharType> - ( name.get(), m_header.m_named_index, dtor, is_intrusive_t()); - } - } - - //!Destroys an anonymous, unique or named object - //!using its address - template <class T> - void destroy_ptr(const T *p) - { - //If T is void transform it to char - typedef typename ipcdetail::char_if_void<T>::type data_t; - ipcdetail::placement_destroy<data_t> dtor; - priv_destroy_ptr(p, dtor); - } - - //!Returns the name of an object created with construct/find_or_construct - //!functions. Does not throw - template<class T> - static const CharType *get_instance_name(const T *ptr) - { return priv_get_instance_name(block_header_t::block_header_from_value(ptr)); } - - //!Returns the length of an object created with construct/find_or_construct - //!functions. Does not throw. - template<class T> - static size_type get_instance_length(const T *ptr) - { return priv_get_instance_length(block_header_t::block_header_from_value(ptr), sizeof(T)); } - - //!Returns is the the name of an object created with construct/find_or_construct - //!functions. Does not throw - template<class T> - static instance_type get_instance_type(const T *ptr) - { return priv_get_instance_type(block_header_t::block_header_from_value(ptr)); } - - //!Preallocates needed index resources to optimize the - //!creation of "num" named objects in the managed memory segment. - //!Can throw boost::interprocess::bad_alloc if there is no enough memory. - void reserve_named_objects(size_type num) - { - //------------------------------- - scoped_lock<rmutex> guard(m_header); - //------------------------------- - m_header.m_named_index.reserve(num); - } - - //!Preallocates needed index resources to optimize the - //!creation of "num" unique objects in the managed memory segment. - //!Can throw boost::interprocess::bad_alloc if there is no enough memory. - void reserve_unique_objects(size_type num) - { - //------------------------------- - scoped_lock<rmutex> guard(m_header); - //------------------------------- - m_header.m_unique_index.reserve(num); - } - - //!Calls shrink_to_fit in both named and unique object indexes - //!to try to free unused memory from those indexes. - void shrink_to_fit_indexes() - { - //------------------------------- - scoped_lock<rmutex> guard(m_header); - //------------------------------- - m_header.m_named_index.shrink_to_fit(); - m_header.m_unique_index.shrink_to_fit(); - } - - //!Returns the number of named objects stored in - //!the segment. - size_type get_num_named_objects() - { - //------------------------------- - scoped_lock<rmutex> guard(m_header); - //------------------------------- - return m_header.m_named_index.size(); - } - - //!Returns the number of unique objects stored in - //!the segment. - size_type get_num_unique_objects() - { - //------------------------------- - scoped_lock<rmutex> guard(m_header); - //------------------------------- - return m_header.m_unique_index.size(); - } - - //!Obtains the minimum size needed by the - //!segment manager - static size_type get_min_size() - { return segment_manager_base_t::get_min_size(priv_get_reserved_bytes()); } - - //!Returns a constant iterator to the beginning of the information about - //!the named allocations performed in this segment manager - const_named_iterator named_begin() const - { - return make_transform_iterator - (m_header.m_named_index.begin(), named_transform()); - } - - //!Returns a constant iterator to the end of the information about - //!the named allocations performed in this segment manager - const_named_iterator named_end() const - { - return make_transform_iterator - (m_header.m_named_index.end(), named_transform()); - } - - //!Returns a constant iterator to the beginning of the information about - //!the unique allocations performed in this segment manager - const_unique_iterator unique_begin() const - { - return make_transform_iterator - (m_header.m_unique_index.begin(), unique_transform()); - } - - //!Returns a constant iterator to the end of the information about - //!the unique allocations performed in this segment manager - const_unique_iterator unique_end() const - { - return make_transform_iterator - (m_header.m_unique_index.end(), unique_transform()); - } - - //!This is the default allocator to allocate types T - //!from this managed segment - template<class T> - struct allocator - { - typedef boost::interprocess::allocator<T, segment_manager> type; - }; - - //!Returns an instance of the default allocator for type T - //!initialized that allocates memory from this segment manager. - template<class T> - typename allocator<T>::type - get_allocator() - { return typename allocator<T>::type(this); } - - //!This is the default deleter to delete types T - //!from this managed segment. - template<class T> - struct deleter - { - typedef boost::interprocess::deleter<T, segment_manager> type; - }; - - //!Returns an instance of the default deleter for type T - //!that will delete an object constructed in this segment manager. - template<class T> - typename deleter<T>::type - get_deleter() - { return typename deleter<T>::type(this); } - - /// @cond - - //!Generic named/anonymous new function. Offers all the possibilities, - //!such as throwing, search before creating, and the constructor is - //!encapsulated in an object function. - template<class T> - T *generic_construct(const CharType *name, - size_type num, - bool try2find, - bool dothrow, - ipcdetail::in_place_interface &table) - { - return static_cast<T*> - (priv_generic_construct(name, num, try2find, dothrow, table)); - } - - private: - //!Tries to find a previous named allocation. Returns the address - //!and the object count. On failure the first member of the - //!returned pair is 0. - template <class T> - std::pair<T*, size_type> priv_find_impl (const CharType* name, bool lock) - { - //The name can't be null, no anonymous object can be found by name - BOOST_ASSERT(name != 0); - ipcdetail::placement_destroy<T> table; - size_type sz; - void *ret; - - if(name == reinterpret_cast<const CharType*>(-1)){ - ret = priv_generic_find<char> (typeid(T).name(), m_header.m_unique_index, table, sz, is_intrusive_t(), lock); - } - else{ - ret = priv_generic_find<CharType> (name, m_header.m_named_index, table, sz, is_intrusive_t(), lock); - } - return std::pair<T*, size_type>(static_cast<T*>(ret), sz); - } - - //!Tries to find a previous unique allocation. Returns the address - //!and the object count. On failure the first member of the - //!returned pair is 0. - template <class T> - std::pair<T*, size_type> priv_find__impl (const ipcdetail::unique_instance_t* name, bool lock) - { - ipcdetail::placement_destroy<T> table; - size_type size; - void *ret = priv_generic_find<char>(name, m_header.m_unique_index, table, size, is_intrusive_t(), lock); - return std::pair<T*, size_type>(static_cast<T*>(ret), size); - } - - void *priv_generic_construct - (const CharType *name, size_type num, bool try2find, bool dothrow, ipcdetail::in_place_interface &table) - { - void *ret; - //Security overflow check - if(num > ((std::size_t)-1)/table.size){ - if(dothrow) - throw bad_alloc(); - else - return 0; - } - if(name == 0){ - ret = this->prot_anonymous_construct(num, dothrow, table); - } - else if(name == reinterpret_cast<const CharType*>(-1)){ - ret = this->priv_generic_named_construct<char> - (unique_type, table.type_name, num, try2find, dothrow, table, m_header.m_unique_index, is_intrusive_t()); - } - else{ - ret = this->priv_generic_named_construct<CharType> - (named_type, name, num, try2find, dothrow, table, m_header.m_named_index, is_intrusive_t()); - } - return ret; - } - - void priv_destroy_ptr(const void *ptr, ipcdetail::in_place_interface &dtor) - { - block_header_t *ctrl_data = block_header_t::block_header_from_value(ptr, dtor.size, dtor.alignment); - switch(ctrl_data->alloc_type()){ - case anonymous_type: - this->prot_anonymous_destroy(ptr, dtor); - break; - - case named_type: - this->priv_generic_named_destroy<CharType> - (ctrl_data, m_header.m_named_index, dtor, is_node_index_t()); - break; - - case unique_type: - this->priv_generic_named_destroy<char> - (ctrl_data, m_header.m_unique_index, dtor, is_node_index_t()); - break; - - default: - //This type is unknown, bad pointer passed to this function! - BOOST_ASSERT(0); - break; - } - } - - //!Returns the name of an object created with construct/find_or_construct - //!functions. Does not throw - static const CharType *priv_get_instance_name(block_header_t *ctrl_data) - { - boost::interprocess::allocation_type type = ctrl_data->alloc_type(); - if(type == anonymous_type){ - BOOST_ASSERT((type == anonymous_type && ctrl_data->m_num_char == 0) || - (type == unique_type && ctrl_data->m_num_char != 0) ); - return 0; - } - CharType *name = static_cast<CharType*>(ctrl_data->template name<CharType>()); - - //Sanity checks - BOOST_ASSERT(ctrl_data->sizeof_char() == sizeof(CharType)); - BOOST_ASSERT(ctrl_data->m_num_char == std::char_traits<CharType>::length(name)); - return name; - } - - static size_type priv_get_instance_length(block_header_t *ctrl_data, size_type sizeofvalue) - { - //Get header - BOOST_ASSERT((ctrl_data->value_bytes() %sizeofvalue) == 0); - return ctrl_data->value_bytes()/sizeofvalue; - } - - //!Returns is the the name of an object created with construct/find_or_construct - //!functions. Does not throw - static instance_type priv_get_instance_type(block_header_t *ctrl_data) - { - //Get header - BOOST_ASSERT((instance_type)ctrl_data->alloc_type() < max_allocation_type); - return (instance_type)ctrl_data->alloc_type(); - } - - static size_type priv_get_reserved_bytes() - { - //Get the number of bytes until the end of (*this) - //beginning in the end of the segment_manager_base_t base. - return sizeof(segment_manager) - sizeof(segment_manager_base_t); - } - - template <class CharT> - void *priv_generic_find - (const CharT* name, - IndexType<ipcdetail::index_config<CharT, MemoryAlgorithm> > &index, - ipcdetail::in_place_interface &table, - size_type &length, ipcdetail::true_ is_intrusive, bool use_lock) - { - (void)is_intrusive; - typedef IndexType<ipcdetail::index_config<CharT, MemoryAlgorithm> > index_type; - typedef typename index_type::iterator index_it; - - //------------------------------- - scoped_lock<rmutex> guard(priv_get_lock(use_lock)); - //------------------------------- - //Find name in index - ipcdetail::intrusive_compare_key<CharT> key - (name, std::char_traits<CharT>::length(name)); - index_it it = index.find(key); - - //Initialize return values - void *ret_ptr = 0; - length = 0; - - //If found, assign values - if(it != index.end()){ - //Get header - block_header_t *ctrl_data = it->get_block_header(); - - //Sanity check - BOOST_ASSERT((ctrl_data->m_value_bytes % table.size) == 0); - BOOST_ASSERT(ctrl_data->sizeof_char() == sizeof(CharT)); - ret_ptr = ctrl_data->value(); - length = ctrl_data->m_value_bytes/table.size; - } - return ret_ptr; - } - - template <class CharT> - void *priv_generic_find - (const CharT* name, - IndexType<ipcdetail::index_config<CharT, MemoryAlgorithm> > &index, - ipcdetail::in_place_interface &table, - size_type &length, ipcdetail::false_ is_intrusive, bool use_lock) - { - (void)is_intrusive; - typedef IndexType<ipcdetail::index_config<CharT, MemoryAlgorithm> > index_type; - typedef typename index_type::key_type key_type; - typedef typename index_type::iterator index_it; - - //------------------------------- - scoped_lock<rmutex> guard(priv_get_lock(use_lock)); - //------------------------------- - //Find name in index - index_it it = index.find(key_type(name, std::char_traits<CharT>::length(name))); - - //Initialize return values - void *ret_ptr = 0; - length = 0; - - //If found, assign values - if(it != index.end()){ - //Get header - block_header_t *ctrl_data = reinterpret_cast<block_header_t*> - (ipcdetail::to_raw_pointer(it->second.m_ptr)); - - //Sanity check - BOOST_ASSERT((ctrl_data->m_value_bytes % table.size) == 0); - BOOST_ASSERT(ctrl_data->sizeof_char() == sizeof(CharT)); - ret_ptr = ctrl_data->value(); - length = ctrl_data->m_value_bytes/table.size; - } - return ret_ptr; - } - - template <class CharT> - bool priv_generic_named_destroy - (block_header_t *block_header, - IndexType<ipcdetail::index_config<CharT, MemoryAlgorithm> > &index, - ipcdetail::in_place_interface &table, ipcdetail::true_ is_node_index) - { - (void)is_node_index; - typedef typename IndexType<ipcdetail::index_config<CharT, MemoryAlgorithm> >::iterator index_it; - - index_it *ihdr = block_header_t::template to_first_header<index_it>(block_header); - return this->priv_generic_named_destroy_impl<CharT>(*ihdr, index, table); - } - - template <class CharT> - bool priv_generic_named_destroy - (block_header_t *block_header, - IndexType<ipcdetail::index_config<CharT, MemoryAlgorithm> > &index, - ipcdetail::in_place_interface &table, - ipcdetail::false_ is_node_index) - { - (void)is_node_index; - CharT *name = static_cast<CharT*>(block_header->template name<CharT>()); - return this->priv_generic_named_destroy<CharT>(name, index, table, is_intrusive_t()); - } - - template <class CharT> - bool priv_generic_named_destroy(const CharT *name, - IndexType<ipcdetail::index_config<CharT, MemoryAlgorithm> > &index, - ipcdetail::in_place_interface &table, ipcdetail::true_ is_intrusive_index) - { - (void)is_intrusive_index; - typedef IndexType<ipcdetail::index_config<CharT, MemoryAlgorithm> > index_type; - typedef typename index_type::iterator index_it; - typedef typename index_type::value_type intrusive_value_type; - - //------------------------------- - scoped_lock<rmutex> guard(m_header); - //------------------------------- - //Find name in index - ipcdetail::intrusive_compare_key<CharT> key - (name, std::char_traits<CharT>::length(name)); - index_it it = index.find(key); - - //If not found, return false - if(it == index.end()){ - //This name is not present in the index, wrong pointer or name! - //BOOST_ASSERT(0); - return false; - } - - block_header_t *ctrl_data = it->get_block_header(); - intrusive_value_type *iv = intrusive_value_type::get_intrusive_value_type(ctrl_data); - void *memory = iv; - void *values = ctrl_data->value(); - std::size_t num = ctrl_data->m_value_bytes/table.size; - - //Sanity check - BOOST_ASSERT((ctrl_data->m_value_bytes % table.size) == 0); - BOOST_ASSERT(sizeof(CharT) == ctrl_data->sizeof_char()); - - //Erase node from index - index.erase(it); - - //Destroy the headers - ctrl_data->~block_header_t(); - iv->~intrusive_value_type(); - - //Call destructors and free memory - std::size_t destroyed; - table.destroy_n(values, num, destroyed); - this->deallocate(memory); - return true; - } - - template <class CharT> - bool priv_generic_named_destroy(const CharT *name, - IndexType<ipcdetail::index_config<CharT, MemoryAlgorithm> > &index, - ipcdetail::in_place_interface &table, - ipcdetail::false_ is_intrusive_index) - { - (void)is_intrusive_index; - typedef IndexType<ipcdetail::index_config<CharT, MemoryAlgorithm> > index_type; - typedef typename index_type::iterator index_it; - typedef typename index_type::key_type key_type; - - //------------------------------- - scoped_lock<rmutex> guard(m_header); - //------------------------------- - //Try to find the name in the index - index_it it = index.find(key_type (name, - std::char_traits<CharT>::length(name))); - - //If not found, return false - if(it == index.end()){ - //This name is not present in the index, wrong pointer or name! - //BOOST_ASSERT(0); - return false; - } - return this->priv_generic_named_destroy_impl<CharT>(it, index, table); - } - - template <class CharT> - bool priv_generic_named_destroy_impl - (const typename IndexType<ipcdetail::index_config<CharT, MemoryAlgorithm> >::iterator &it, - IndexType<ipcdetail::index_config<CharT, MemoryAlgorithm> > &index, - ipcdetail::in_place_interface &table) - { - typedef IndexType<ipcdetail::index_config<CharT, MemoryAlgorithm> > index_type; - typedef typename index_type::iterator index_it; - - //Get allocation parameters - block_header_t *ctrl_data = reinterpret_cast<block_header_t*> - (ipcdetail::to_raw_pointer(it->second.m_ptr)); - char *stored_name = static_cast<char*>(static_cast<void*>(const_cast<CharT*>(it->first.name()))); - (void)stored_name; - - //Check if the distance between the name pointer and the memory pointer - //is correct (this can detect incorrect type in destruction) - std::size_t num = ctrl_data->m_value_bytes/table.size; - void *values = ctrl_data->value(); - - //Sanity check - BOOST_ASSERT((ctrl_data->m_value_bytes % table.size) == 0); - BOOST_ASSERT(static_cast<void*>(stored_name) == static_cast<void*>(ctrl_data->template name<CharT>())); - BOOST_ASSERT(sizeof(CharT) == ctrl_data->sizeof_char()); - - //Erase node from index - index.erase(it); - - //Destroy the header - ctrl_data->~block_header_t(); - - void *memory; - if(is_node_index_t::value){ - index_it *ihdr = block_header_t::template - to_first_header<index_it>(ctrl_data); - ihdr->~index_it(); - memory = ihdr; - } - else{ - memory = ctrl_data; - } - - //Call destructors and free memory - std::size_t destroyed; - table.destroy_n(values, num, destroyed); - this->deallocate(memory); - return true; - } - - template<class CharT> - void * priv_generic_named_construct - (unsigned char type, const CharT *name, size_type num, bool try2find, - bool dothrow, ipcdetail::in_place_interface &table, - IndexType<ipcdetail::index_config<CharT, MemoryAlgorithm> > &index, ipcdetail::true_ is_intrusive) - { - (void)is_intrusive; - std::size_t namelen = std::char_traits<CharT>::length(name); - - block_header_t block_info ( size_type(table.size*num) - , size_type(table.alignment) - , type - , sizeof(CharT) - , namelen); - - typedef IndexType<ipcdetail::index_config<CharT, MemoryAlgorithm> > index_type; - typedef typename index_type::iterator index_it; - typedef std::pair<index_it, bool> index_ib; - - //------------------------------- - scoped_lock<rmutex> guard(m_header); - //------------------------------- - //Insert the node. This can throw. - //First, we want to know if the key is already present before - //we allocate any memory, and if the key is not present, we - //want to allocate all memory in a single buffer that will - //contain the name and the user buffer. - // - //Since equal_range(key) + insert(hint, value) approach is - //quite inefficient in container implementations - //(they re-test if the position is correct), I've chosen - //to insert the node, do an ugly un-const cast and modify - //the key (which is a smart pointer) to an equivalent one - index_ib insert_ret; - - typename index_type::insert_commit_data commit_data; - typedef typename index_type::value_type intrusive_value_type; - - BOOST_TRY{ - ipcdetail::intrusive_compare_key<CharT> key(name, namelen); - insert_ret = index.insert_check(key, commit_data); - } - //Ignore exceptions - BOOST_CATCH(...){ - if(dothrow) - BOOST_RETHROW - return 0; - } - BOOST_CATCH_END - - index_it it = insert_ret.first; - - //If found and this is find or construct, return data - //else return null - if(!insert_ret.second){ - if(try2find){ - return it->get_block_header()->value(); - } - if(dothrow){ - throw interprocess_exception(already_exists_error); - } - else{ - return 0; - } - } - - //Allocates buffer for name + data, this can throw (it hurts) - void *buffer_ptr; - - //Check if there is enough memory - if(dothrow){ - buffer_ptr = this->allocate - (block_info.template total_size_with_header<intrusive_value_type>()); - } - else{ - buffer_ptr = this->allocate - (block_info.template total_size_with_header<intrusive_value_type>(), std::nothrow_t()); - if(!buffer_ptr) - return 0; - } - - //Now construct the intrusive hook plus the header - intrusive_value_type * intrusive_hdr = new(buffer_ptr) intrusive_value_type(); - block_header_t * hdr = new(intrusive_hdr->get_block_header())block_header_t(block_info); - void *ptr = 0; //avoid gcc warning - ptr = hdr->value(); - - //Copy name to memory segment and insert data - CharT *name_ptr = static_cast<CharT *>(hdr->template name<CharT>()); - std::char_traits<CharT>::copy(name_ptr, name, namelen+1); - - BOOST_TRY{ - //Now commit the insertion using previous context data - it = index.insert_commit(*intrusive_hdr, commit_data); - } - //Ignore exceptions - BOOST_CATCH(...){ - if(dothrow) - BOOST_RETHROW - return 0; - } - BOOST_CATCH_END - - //Avoid constructions if constructor is trivial - //Build scoped ptr to avoid leaks with constructor exception - ipcdetail::mem_algo_deallocator<segment_manager_base_type> mem - (buffer_ptr, *static_cast<segment_manager_base_type*>(this)); - - //Initialize the node value_eraser to erase inserted node - //if something goes wrong. This will be executed *before* - //the memory allocation as the intrusive value is built in that - //memory - value_eraser<index_type> v_eraser(index, it); - - //Construct array, this can throw - ipcdetail::array_construct(ptr, num, table); - - //Release rollbacks since construction was successful - v_eraser.release(); - mem.release(); - return ptr; - } - - //!Generic named new function for - //!named functions - template<class CharT> - void * priv_generic_named_construct - (unsigned char type, const CharT *name, size_type num, bool try2find, bool dothrow, - ipcdetail::in_place_interface &table, - IndexType<ipcdetail::index_config<CharT, MemoryAlgorithm> > &index, ipcdetail::false_ is_intrusive) - { - (void)is_intrusive; - std::size_t namelen = std::char_traits<CharT>::length(name); - - block_header_t block_info ( size_type(table.size*num) - , size_type(table.alignment) - , type - , sizeof(CharT) - , namelen); - - typedef IndexType<ipcdetail::index_config<CharT, MemoryAlgorithm> > index_type; - typedef typename index_type::key_type key_type; - typedef typename index_type::mapped_type mapped_type; - typedef typename index_type::value_type value_type; - typedef typename index_type::iterator index_it; - typedef std::pair<index_it, bool> index_ib; - - //------------------------------- - scoped_lock<rmutex> guard(m_header); - //------------------------------- - //Insert the node. This can throw. - //First, we want to know if the key is already present before - //we allocate any memory, and if the key is not present, we - //want to allocate all memory in a single buffer that will - //contain the name and the user buffer. - // - //Since equal_range(key) + insert(hint, value) approach is - //quite inefficient in container implementations - //(they re-test if the position is correct), I've chosen - //to insert the node, do an ugly un-const cast and modify - //the key (which is a smart pointer) to an equivalent one - index_ib insert_ret; - BOOST_TRY{ - insert_ret = index.insert(value_type(key_type (name, namelen), mapped_type(0))); - } - //Ignore exceptions - BOOST_CATCH(...){ - if(dothrow) - BOOST_RETHROW; - return 0; - } - BOOST_CATCH_END - - index_it it = insert_ret.first; - - //If found and this is find or construct, return data - //else return null - if(!insert_ret.second){ - if(try2find){ - block_header_t *hdr = static_cast<block_header_t*> - (ipcdetail::to_raw_pointer(it->second.m_ptr)); - return hdr->value(); - } - return 0; - } - //Initialize the node value_eraser to erase inserted node - //if something goes wrong - value_eraser<index_type> v_eraser(index, it); - - //Allocates buffer for name + data, this can throw (it hurts) - void *buffer_ptr; - block_header_t * hdr; - - //Allocate and construct the headers - if(is_node_index_t::value){ - size_type total_size = block_info.template total_size_with_header<index_it>(); - if(dothrow){ - buffer_ptr = this->allocate(total_size); - } - else{ - buffer_ptr = this->allocate(total_size, std::nothrow_t()); - if(!buffer_ptr) - return 0; - } - index_it *idr = new(buffer_ptr) index_it(it); - hdr = block_header_t::template from_first_header<index_it>(idr); - } - else{ - if(dothrow){ - buffer_ptr = this->allocate(block_info.total_size()); - } - else{ - buffer_ptr = this->allocate(block_info.total_size(), std::nothrow_t()); - if(!buffer_ptr) - return 0; - } - hdr = static_cast<block_header_t*>(buffer_ptr); - } - - hdr = new(hdr)block_header_t(block_info); - void *ptr = 0; //avoid gcc warning - ptr = hdr->value(); - - //Copy name to memory segment and insert data - CharT *name_ptr = static_cast<CharT *>(hdr->template name<CharT>()); - std::char_traits<CharT>::copy(name_ptr, name, namelen+1); - - //Do the ugly cast, please mama, forgive me! - //This new key points to an identical string, so it must have the - //same position than the overwritten key according to the predicate - const_cast<key_type &>(it->first).name(name_ptr); - it->second.m_ptr = hdr; - - //Build scoped ptr to avoid leaks with constructor exception - ipcdetail::mem_algo_deallocator<segment_manager_base_type> mem - (buffer_ptr, *static_cast<segment_manager_base_type*>(this)); - - //Construct array, this can throw - ipcdetail::array_construct(ptr, num, table); - - //All constructors successful, we don't want to release memory - mem.release(); - - //Release node v_eraser since construction was successful - v_eraser.release(); - return ptr; - } - - private: - //!Returns the this pointer - segment_manager *get_this_pointer() - { return this; } - - typedef typename MemoryAlgorithm::mutex_family::recursive_mutex_type rmutex; - - scoped_lock<rmutex> priv_get_lock(bool use_lock) - { - scoped_lock<rmutex> local(m_header, defer_lock); - if(use_lock){ - local.lock(); - } - return scoped_lock<rmutex>(boost::move(local)); - } - - //!This struct includes needed data and derives from - //!rmutex to allow EBO when using null interprocess_mutex - struct header_t - : public rmutex - { - named_index_t m_named_index; - unique_index_t m_unique_index; - - header_t(segment_manager_base_t *segment_mngr_base) - : m_named_index (segment_mngr_base) - , m_unique_index(segment_mngr_base) - {} - } m_header; - - /// @endcond -}; - - -}} //namespace boost { namespace interprocess - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //#ifndef BOOST_INTERPROCESS_SEGMENT_MANAGER_HPP - diff --git a/src/third_party/boost-1.56.0/boost/interprocess/shared_memory_object.hpp b/src/third_party/boost-1.56.0/boost/interprocess/shared_memory_object.hpp deleted file mode 100644 index 9442dd969b2..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/shared_memory_object.hpp +++ /dev/null @@ -1,430 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_SHARED_MEMORY_OBJECT_HPP -#define BOOST_INTERPROCESS_SHARED_MEMORY_OBJECT_HPP - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> -#include <boost/interprocess/creation_tags.hpp> -#include <boost/interprocess/exceptions.hpp> -#include <boost/move/move.hpp> -#include <boost/interprocess/interprocess_fwd.hpp> -#include <boost/interprocess/exceptions.hpp> -#include <boost/interprocess/detail/os_file_functions.hpp> -#include <boost/interprocess/detail/shared_dir_helpers.hpp> -#include <boost/interprocess/permissions.hpp> -#include <cstddef> -#include <string> -#include <algorithm> - -#if defined(BOOST_INTERPROCESS_XSI_SHARED_MEMORY_OBJECTS_ONLY) -# include <sys/shm.h> //System V shared memory... -#elif defined(BOOST_INTERPROCESS_POSIX_SHARED_MEMORY_OBJECTS) -# include <fcntl.h> //O_CREAT, O_*... -# include <sys/mman.h> //shm_xxx -# include <unistd.h> //ftruncate, close -# include <sys/stat.h> //mode_t, S_IRWXG, S_IRWXO, S_IRWXU, -# if defined(BOOST_INTERPROCESS_RUNTIME_FILESYSTEM_BASED_POSIX_SHARED_MEMORY) -# if defined(__FreeBSD__) -# include <sys/sysctl.h> -# endif -# endif -#else -// -#endif - -//!\file -//!Describes a shared memory object management class. - -namespace boost { -namespace interprocess { - -//!A class that wraps a shared memory mapping that can be used to -//!create mapped regions from the mapped files -class shared_memory_object -{ - /// @cond - //Non-copyable and non-assignable - BOOST_MOVABLE_BUT_NOT_COPYABLE(shared_memory_object) - /// @endcond - - public: - //!Default constructor. Represents an empty shared_memory_object. - shared_memory_object(); - - //!Creates a shared memory object with name "name" and mode "mode", with the access mode "mode" - //!If the file previously exists, throws an error.*/ - shared_memory_object(create_only_t, const char *name, mode_t mode, const permissions &perm = permissions()) - { this->priv_open_or_create(ipcdetail::DoCreate, name, mode, perm); } - - //!Tries to create a shared memory object with name "name" and mode "mode", with the - //!access mode "mode". If the file previously exists, it tries to open it with mode "mode". - //!Otherwise throws an error. - shared_memory_object(open_or_create_t, const char *name, mode_t mode, const permissions &perm = permissions()) - { this->priv_open_or_create(ipcdetail::DoOpenOrCreate, name, mode, perm); } - - //!Tries to open a shared memory object with name "name", with the access mode "mode". - //!If the file does not previously exist, it throws an error. - shared_memory_object(open_only_t, const char *name, mode_t mode) - { this->priv_open_or_create(ipcdetail::DoOpen, name, mode, permissions()); } - - //!Moves the ownership of "moved"'s shared memory object to *this. - //!After the call, "moved" does not represent any shared memory object. - //!Does not throw - shared_memory_object(BOOST_RV_REF(shared_memory_object) moved) - : m_handle(file_handle_t(ipcdetail::invalid_file())) - , m_mode(read_only) - { this->swap(moved); } - - //!Moves the ownership of "moved"'s shared memory to *this. - //!After the call, "moved" does not represent any shared memory. - //!Does not throw - shared_memory_object &operator=(BOOST_RV_REF(shared_memory_object) moved) - { - shared_memory_object tmp(boost::move(moved)); - this->swap(tmp); - return *this; - } - - //!Swaps the shared_memory_objects. Does not throw - void swap(shared_memory_object &moved); - - //!Erases a shared memory object from the system. - //!Returns false on error. Never throws - static bool remove(const char *name); - - //!Sets the size of the shared memory mapping - void truncate(offset_t length); - - //!Destroys *this and indicates that the calling process is finished using - //!the resource. All mapped regions are still - //!valid after destruction. The destructor function will deallocate - //!any system resources allocated by the system for use by this process for - //!this resource. The resource can still be opened again calling - //!the open constructor overload. To erase the resource from the system - //!use remove(). - ~shared_memory_object(); - - //!Returns the name of the shared memory object. - const char *get_name() const; - - //!Returns true if the size of the shared memory object - //!can be obtained and writes the size in the passed reference - bool get_size(offset_t &size) const; - - //!Returns access mode - mode_t get_mode() const; - - //!Returns mapping handle. Never throws. - mapping_handle_t get_mapping_handle() const; - - /// @cond - private: - - //!Closes a previously opened file mapping. Never throws. - void priv_close(); - - //!Closes a previously opened file mapping. Never throws. - bool priv_open_or_create(ipcdetail::create_enum_t type, const char *filename, mode_t mode, const permissions &perm); - - file_handle_t m_handle; - mode_t m_mode; - std::string m_filename; - /// @endcond -}; - -/// @cond - -inline shared_memory_object::shared_memory_object() - : m_handle(file_handle_t(ipcdetail::invalid_file())) - , m_mode(read_only) -{} - -inline shared_memory_object::~shared_memory_object() -{ this->priv_close(); } - - -inline const char *shared_memory_object::get_name() const -{ return m_filename.c_str(); } - -inline bool shared_memory_object::get_size(offset_t &size) const -{ return ipcdetail::get_file_size((file_handle_t)m_handle, size); } - -inline void shared_memory_object::swap(shared_memory_object &other) -{ - std::swap(m_handle, other.m_handle); - std::swap(m_mode, other.m_mode); - m_filename.swap(other.m_filename); -} - -inline mapping_handle_t shared_memory_object::get_mapping_handle() const -{ - return ipcdetail::mapping_handle_from_file_handle(m_handle); -} - -inline mode_t shared_memory_object::get_mode() const -{ return m_mode; } - -#if !defined(BOOST_INTERPROCESS_POSIX_SHARED_MEMORY_OBJECTS) - -inline bool shared_memory_object::priv_open_or_create - (ipcdetail::create_enum_t type, const char *filename, mode_t mode, const permissions &perm) -{ - m_filename = filename; - std::string shmfile; - ipcdetail::create_shared_dir_cleaning_old_and_get_filepath(filename, shmfile); - - //Set accesses - if (mode != read_write && mode != read_only){ - error_info err = other_error; - throw interprocess_exception(err); - } - - switch(type){ - case ipcdetail::DoOpen: - m_handle = ipcdetail::open_existing_file(shmfile.c_str(), mode, true); - break; - case ipcdetail::DoCreate: - m_handle = ipcdetail::create_new_file(shmfile.c_str(), mode, perm, true); - break; - case ipcdetail::DoOpenOrCreate: - m_handle = ipcdetail::create_or_open_file(shmfile.c_str(), mode, perm, true); - break; - default: - { - error_info err = other_error; - throw interprocess_exception(err); - } - } - - //Check for error - if(m_handle == ipcdetail::invalid_file()){ - error_info err = system_error_code(); - this->priv_close(); - throw interprocess_exception(err); - } - - m_mode = mode; - return true; -} - -inline bool shared_memory_object::remove(const char *filename) -{ - try{ - //Make sure a temporary path is created for shared memory - std::string shmfile; - ipcdetail::shared_filepath(filename, shmfile); - return ipcdetail::delete_file(shmfile.c_str()); - } - catch(...){ - return false; - } -} - -inline void shared_memory_object::truncate(offset_t length) -{ - if(!ipcdetail::truncate_file(m_handle, length)){ - error_info err = system_error_code(); - throw interprocess_exception(err); - } -} - -inline void shared_memory_object::priv_close() -{ - if(m_handle != ipcdetail::invalid_file()){ - ipcdetail::close_file(m_handle); - m_handle = ipcdetail::invalid_file(); - } -} - -#else //!defined(BOOST_INTERPROCESS_POSIX_SHARED_MEMORY_OBJECTS) - -namespace shared_memory_object_detail { - -#ifdef BOOST_INTERPROCESS_RUNTIME_FILESYSTEM_BASED_POSIX_SHARED_MEMORY - -#if defined(__FreeBSD__) - -inline bool use_filesystem_based_posix() -{ - int jailed = 0; - std::size_t len = sizeof(jailed); - ::sysctlbyname("security.jail.jailed", &jailed, &len, NULL, 0); - return jailed != 0; -} - -#else -#error "Not supported platform for BOOST_INTERPROCESS_RUNTIME_FILESYSTEM_BASED_POSIX_SHARED_MEMORY" -#endif - -#endif - -} //shared_memory_object_detail - -inline bool shared_memory_object::priv_open_or_create - (ipcdetail::create_enum_t type, - const char *filename, - mode_t mode, const permissions &perm) -{ - #if defined(BOOST_INTERPROCESS_FILESYSTEM_BASED_POSIX_SHARED_MEMORY) - const bool add_leading_slash = false; - #elif defined(BOOST_INTERPROCESS_RUNTIME_FILESYSTEM_BASED_POSIX_SHARED_MEMORY) - const bool add_leading_slash = !shared_memory_object_detail::use_filesystem_based_posix(); - #else - const bool add_leading_slash = true; - #endif - if(add_leading_slash){ - ipcdetail::add_leading_slash(filename, m_filename); - } - else{ - ipcdetail::create_shared_dir_cleaning_old_and_get_filepath(filename, m_filename); - } - - //Create new mapping - int oflag = 0; - if(mode == read_only){ - oflag |= O_RDONLY; - } - else if(mode == read_write){ - oflag |= O_RDWR; - } - else{ - error_info err(mode_error); - throw interprocess_exception(err); - } - int unix_perm = perm.get_permissions(); - - switch(type){ - case ipcdetail::DoOpen: - { - //No oflag addition - m_handle = shm_open(m_filename.c_str(), oflag, unix_perm); - } - break; - case ipcdetail::DoCreate: - { - oflag |= (O_CREAT | O_EXCL); - m_handle = shm_open(m_filename.c_str(), oflag, unix_perm); - if(m_handle >= 0){ - ::fchmod(m_handle, unix_perm); - } - } - break; - case ipcdetail::DoOpenOrCreate: - { - //We need a create/open loop to change permissions correctly using fchmod, since - //with "O_CREAT" only we don't know if we've created or opened the shm. - while(1){ - //Try to create shared memory - m_handle = shm_open(m_filename.c_str(), oflag | (O_CREAT | O_EXCL), unix_perm); - //If successful change real permissions - if(m_handle >= 0){ - ::fchmod(m_handle, unix_perm); - } - //If already exists, try to open - else if(errno == EEXIST){ - m_handle = shm_open(m_filename.c_str(), oflag, unix_perm); - //If open fails and errno tells the file does not exist - //(shm was removed between creation and opening tries), just retry - if(m_handle < 0 && errno == ENOENT){ - continue; - } - } - //Exit retries - break; - } - } - break; - default: - { - error_info err = other_error; - throw interprocess_exception(err); - } - } - - //Check for error - if(m_handle < 0){ - error_info err = errno; - this->priv_close(); - throw interprocess_exception(err); - } - - m_filename = filename; - m_mode = mode; - return true; -} - -inline bool shared_memory_object::remove(const char *filename) -{ - try{ - std::string filepath; - #if defined(BOOST_INTERPROCESS_FILESYSTEM_BASED_POSIX_SHARED_MEMORY) - const bool add_leading_slash = false; - #elif defined(BOOST_INTERPROCESS_RUNTIME_FILESYSTEM_BASED_POSIX_SHARED_MEMORY) - const bool add_leading_slash = !shared_memory_object_detail::use_filesystem_based_posix(); - #else - const bool add_leading_slash = true; - #endif - if(add_leading_slash){ - ipcdetail::add_leading_slash(filename, filepath); - } - else{ - ipcdetail::shared_filepath(filename, filepath); - } - return 0 == shm_unlink(filepath.c_str()); - } - catch(...){ - return false; - } -} - -inline void shared_memory_object::truncate(offset_t length) -{ - if(0 != ftruncate(m_handle, length)){ - error_info err(system_error_code()); - throw interprocess_exception(err); - } -} - -inline void shared_memory_object::priv_close() -{ - if(m_handle != -1){ - ::close(m_handle); - m_handle = -1; - } -} - -#endif - -///@endcond - -//!A class that stores the name of a shared memory -//!and calls shared_memory_object::remove(name) in its destructor -//!Useful to remove temporary shared memory objects in the presence -//!of exceptions -class remove_shared_memory_on_destroy -{ - const char * m_name; - public: - remove_shared_memory_on_destroy(const char *name) - : m_name(name) - {} - - ~remove_shared_memory_on_destroy() - { shared_memory_object::remove(m_name); } -}; - -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //BOOST_INTERPROCESS_SHARED_MEMORY_OBJECT_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/smart_ptr/deleter.hpp b/src/third_party/boost-1.56.0/boost/interprocess/smart_ptr/deleter.hpp deleted file mode 100644 index 1a9e390018f..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/smart_ptr/deleter.hpp +++ /dev/null @@ -1,64 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2007-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_DELETER_HPP -#define BOOST_INTERPROCESS_DELETER_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/interprocess_fwd.hpp> -#include <boost/interprocess/detail/utilities.hpp> -#include <boost/intrusive/pointer_traits.hpp> - -//!\file -//!Describes the functor to delete objects from the segment. - -namespace boost { -namespace interprocess { - -//!A deleter that uses the segment manager's destroy_ptr -//!function to destroy the passed pointer resource. -//! -//!This deleter is used -template<class T, class SegmentManager> -class deleter -{ - public: - typedef typename boost::intrusive:: - pointer_traits<typename SegmentManager::void_pointer>::template - rebind_pointer<T>::type pointer; - - private: - typedef typename boost::intrusive:: - pointer_traits<pointer>::template - rebind_pointer<SegmentManager>::type segment_manager_pointer; - - segment_manager_pointer mp_mngr; - - public: - deleter(segment_manager_pointer pmngr) - : mp_mngr(pmngr) - {} - - void operator()(const pointer &p) - { mp_mngr->destroy_ptr(ipcdetail::to_raw_pointer(p)); } -}; - -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //#ifndef BOOST_INTERPROCESS_DELETER_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/smart_ptr/unique_ptr.hpp b/src/third_party/boost-1.56.0/boost/interprocess/smart_ptr/unique_ptr.hpp deleted file mode 100644 index 6d174a2e03a..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/smart_ptr/unique_ptr.hpp +++ /dev/null @@ -1,553 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// I, Howard Hinnant, hereby place this code in the public domain. -////////////////////////////////////////////////////////////////////////////// -// -// This file is the adaptation for Interprocess of -// Howard Hinnant's unique_ptr emulation code. -// -// (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_UNIQUE_PTR_HPP_INCLUDED -#define BOOST_INTERPROCESS_UNIQUE_PTR_HPP_INCLUDED - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> -#include <boost/assert.hpp> -#include <boost/interprocess/detail/utilities.hpp> -#include <boost/interprocess/detail/pointer_type.hpp> -#include <boost/move/move.hpp> -#include <boost/compressed_pair.hpp> -#include <boost/static_assert.hpp> -#include <boost/interprocess/detail/mpl.hpp> -#include <boost/interprocess/detail/type_traits.hpp> -#include <boost/interprocess/smart_ptr/deleter.hpp> -#include <cstddef> - -//!\file -//!Describes the smart pointer unique_ptr - -namespace boost{ -namespace interprocess{ - -/// @cond -template <class T, class D> class unique_ptr; - -namespace ipcdetail { - -template <class T> struct unique_ptr_error; - -template <class T, class D> -struct unique_ptr_error<const unique_ptr<T, D> > -{ - typedef unique_ptr<T, D> type; -}; - -} //namespace ipcdetail { -/// @endcond - -//!Template unique_ptr stores a pointer to an object and deletes that object -//!using the associated deleter when it is itself destroyed (such as when -//!leaving block scope. -//! -//!The unique_ptr provides a semantics of strict ownership. A unique_ptr owns the -//!object it holds a pointer to. -//! -//!A unique_ptr is not CopyConstructible, nor CopyAssignable, however it is -//!MoveConstructible and Move-Assignable. -//! -//!The uses of unique_ptr include providing exception safety for dynamically -//!allocated memory, passing ownership of dynamically allocated memory to a -//!function, and returning dynamically allocated memory from a function -//! -//!A client-supplied template argument D must be a -//!function pointer or functor for which, given a value d of type D and a pointer -//!ptr to a type T*, the expression d(ptr) is -//!valid and has the effect of deallocating the pointer as appropriate for that -//!deleter. D may also be an lvalue-reference to a deleter. -//! -//!If the deleter D maintains state, it is intended that this state stay with -//!the associated pointer as ownership is transferred -//!from unique_ptr to unique_ptr. The deleter state need never be copied, -//!only moved or swapped as pointer ownership -//!is moved around. That is, the deleter need only be MoveConstructible, -//!MoveAssignable, and Swappable, and need not be CopyConstructible -//!(unless copied into the unique_ptr) nor CopyAssignable. -template <class T, class D> -class unique_ptr -{ - /// @cond - struct nat {int for_bool;}; - struct nat2 {int for_nullptr;}; - typedef int nat2::*nullptr_t; - typedef typename ipcdetail::add_reference<D>::type deleter_reference; - typedef typename ipcdetail::add_reference<const D>::type deleter_const_reference; - /// @endcond - - public: - - typedef T element_type; - typedef D deleter_type; - typedef typename ipcdetail::pointer_type<T, D>::type pointer; - - //!Requires: D must be default constructible, and that construction must not - //!throw an exception. D must not be a reference type. - //! - //!Effects: Constructs a unique_ptr which owns nothing. - //! - //!Postconditions: get() == 0. get_deleter() returns a reference to a - //!default constructed deleter D. - //! - //!Throws: nothing. - unique_ptr() - : ptr_(pointer(0)) - {} - - //!Requires: The expression D()(p) must be well formed. The default constructor - //!of D must not throw an exception. - //! - //!D must not be a reference type. - //! - //!Effects: Constructs a unique_ptr which owns p. - //! - //!Postconditions: get() == p. get_deleter() returns a reference to a default constructed deleter D. - //! - //!Throws: nothing. - explicit unique_ptr(pointer p) - : ptr_(p) - {} - - //!Requires: The expression d(p) must be well formed. - //! - //!Postconditions: get() == p. get_deleter() returns a reference to the - //!internally stored deleter. If D is a - //!reference type then get_deleter() returns a reference to the lvalue d. - //! - //!Throws: nothing. - unique_ptr(pointer p - ,typename ipcdetail::if_<ipcdetail::is_reference<D> - ,D - ,typename ipcdetail::add_reference<const D>::type>::type d) - : ptr_(p, d) - {} - - //!Requires: If the deleter is not a reference type, construction of the - //!deleter D from an lvalue D must not throw an exception. - //! - //!Effects: Constructs a unique_ptr which owns the pointer which u owns - //!(if any). If the deleter is not a reference type, it is move constructed - //!from u's deleter, otherwise the reference is copy constructed from u's deleter. - //! - //!After the construction, u no longer owns a pointer. - //![ Note: The deleter constructor can be implemented with - //! boost::forward<D>. -end note ] - //! - //!Postconditions: get() == value u.get() had before the construction. - //!get_deleter() returns a reference to the internally stored deleter which - //!was constructed from u.get_deleter(). If D is a reference type then get_- - //!deleter() and u.get_deleter() both reference the same lvalue deleter. - //! - //!Throws: nothing. - unique_ptr(BOOST_RV_REF(unique_ptr) u) - : ptr_(u.release(), boost::forward<D>(u.get_deleter())) - {} - - //!Requires: If D is not a reference type, construction of the deleter - //!D from an rvalue of type E must be well formed - //!and not throw an exception. If D is a reference type, then E must be - //!the same type as D (diagnostic required). unique_ptr<U, E>::pointer - //!must be implicitly convertible to pointer. - //! - //!Effects: Constructs a unique_ptr which owns the pointer which u owns - //!(if any). If the deleter is not a reference - //!type, it is move constructed from u's deleter, otherwise the reference - //!is copy constructed from u's deleter. - //! - //!After the construction, u no longer owns a pointer. - //! - //!postconditions get() == value u.get() had before the construction, - //!modulo any required offset adjustments - //!resulting from the cast from U* to T*. get_deleter() returns a reference to the internally stored deleter which - //!was constructed from u.get_deleter(). - //! - //!Throws: nothing. - template <class U, class E> - unique_ptr(BOOST_RV_REF_BEG unique_ptr<U, E> BOOST_RV_REF_END u, - typename ipcdetail::enable_if_c< - ipcdetail::is_convertible<typename unique_ptr<U, E>::pointer, pointer>::value && - ipcdetail::is_convertible<E, D>::value && - ( - !ipcdetail::is_reference<D>::value || - ipcdetail::is_same<D, E>::value - ) - , - nat - >::type = nat()) - : ptr_(const_cast<unique_ptr<U,E>&>(u).release(), boost::move<D>(u.get_deleter())) - {} - - //!Effects: If get() == 0 there are no effects. Otherwise get_deleter()(get()). - //! - //!Throws: nothing. - ~unique_ptr() - { reset(); } - - // assignment - - //!Requires: Assignment of the deleter D from an rvalue D must not throw an exception. - //! - //!Effects: reset(u.release()) followed by a move assignment from u's deleter to - //!this deleter. - //! - //!Postconditions: This unique_ptr now owns the pointer which u owned, and u no - //!longer owns it. - //! - //!Returns: *this. - //! - //!Throws: nothing. - unique_ptr& operator=(BOOST_RV_REF(unique_ptr) u) - { - reset(u.release()); - ptr_.second() = boost::move(u.get_deleter()); - return *this; - } - - //!Requires: Assignment of the deleter D from an rvalue D must not - //!throw an exception. U* must be implicitly convertible to T*. - //! - //!Effects: reset(u.release()) followed by a move assignment from - //!u's deleter to this deleter. If either D or E is - //!a reference type, then the referenced lvalue deleter participates - //!in the move assignment. - //! - //!Postconditions: This unique_ptr now owns the pointer which u owned, - //!and u no longer owns it. - //! - //!Returns: *this. - //! - //!Throws: nothing. - template <class U, class E> - unique_ptr& operator=(BOOST_RV_REF_BEG unique_ptr<U, E> BOOST_RV_REF_END u) - { - reset(u.release()); - ptr_.second() = boost::move(u.get_deleter()); - return *this; - } - - //!Assigns from the literal 0 or NULL. - //! - //!Effects: reset(). - //! - //!Postcondition: get() == 0 - //! - //!Returns: *this. - //! - //!Throws: nothing. - unique_ptr& operator=(nullptr_t) - { - reset(); - return *this; - } - - //!Requires: get() != 0. - //!Returns: *get(). - //!Throws: nothing. - typename ipcdetail::add_reference<T>::type operator*() const - { return *ptr_.first(); } - - //!Requires: get() != 0. - //!Returns: get(). - //!Throws: nothing. - pointer operator->() const - { return ptr_.first(); } - - //!Returns: The stored pointer. - //!Throws: nothing. - pointer get() const - { return ptr_.first(); } - - //!Returns: A reference to the stored deleter. - //! - //!Throws: nothing. - deleter_reference get_deleter() - { return ptr_.second(); } - - //!Returns: A const reference to the stored deleter. - //! - //!Throws: nothing. - deleter_const_reference get_deleter() const - { return ptr_.second(); } - - //!Returns: An unspecified value that, when used in boolean - //!contexts, is equivalent to get() != 0. - //! - //!Throws: nothing. - operator int nat::*() const - { return ptr_.first() ? &nat::for_bool : 0; } - - //!Postcondition: get() == 0. - //! - //!Returns: The value get() had at the start of the call to release. - //! - //!Throws: nothing. - pointer release() - { - pointer tmp = ptr_.first(); - ptr_.first() = 0; - return tmp; - } - - //!Effects: If p == get() there are no effects. Otherwise get_deleter()(get()). - //! - //!Postconditions: get() == p. - //! - //!Throws: nothing. - void reset(pointer p = 0) - { - if (ptr_.first() != p){ - if (ptr_.first()) - ptr_.second()(ptr_.first()); - ptr_.first() = p; - } - } - - //!Requires: The deleter D is Swappable and will not throw an exception under swap. - //! - //!Effects: The stored pointers of this and u are exchanged. - //! The stored deleters are swapped (unqualified). - //!Throws: nothing. - void swap(unique_ptr& u) - { ptr_.swap(u.ptr_); } - - /// @cond - private: - boost::compressed_pair<pointer, D> ptr_; - BOOST_MOVABLE_BUT_NOT_COPYABLE(unique_ptr) - template <class U, class E> unique_ptr(unique_ptr<U, E>&); - template <class U> unique_ptr(U&, typename ipcdetail::unique_ptr_error<U>::type = 0); - - template <class U, class E> unique_ptr& operator=(unique_ptr<U, E>&); - template <class U> typename ipcdetail::unique_ptr_error<U>::type operator=(U&); - /// @endcond -}; -/* -template <class T, class D> -class unique_ptr<T[], D> -{ - struct nat {int for_bool_;}; - typedef typename ipcdetail::add_reference<D>::type deleter_reference; - typedef typename ipcdetail::add_reference<const D>::type deleter_const_reference; -public: - typedef T element_type; - typedef D deleter_type; - typedef typename ipcdetail::pointer_type<T, D>::type pointer; - - // constructors - unique_ptr() : ptr_(pointer()) {} - explicit unique_ptr(pointer p) : ptr_(p) {} - unique_ptr(pointer p, typename if_< - boost::is_reference<D>, - D, - typename ipcdetail::add_reference<const D>::type>::type d) - : ptr_(p, d) {} - unique_ptr(const unique_ptr& u) - : ptr_(const_cast<unique_ptr&>(u).release(), u.get_deleter()) {} - - // destructor - ~unique_ptr() {reset();} - - // assignment - unique_ptr& operator=(const unique_ptr& cu) - { - unique_ptr& u = const_cast<unique_ptr&>(cu); - reset(u.release()); - ptr_.second() = u.get_deleter(); - return *this; - } - unique_ptr& operator=(int nat::*) - { - reset(); - return *this; - } - - // observers - typename ipcdetail::add_reference<T>::type operator[](std::size_t i) const {return ptr_.first()[i];} - pointer get() const {return ptr_.first();} - deleter_reference get_deleter() {return ptr_.second();} - deleter_const_reference get_deleter() const {return ptr_.second();} - operator int nat::*() const {return ptr_.first() ? &nat::for_bool_ : 0;} - - // modifiers - pointer release() - { - pointer tmp = ptr_.first(); - ptr_.first() = 0; - return tmp; - } - void reset(pointer p = 0) - { - if (ptr_.first() != p) - { - if (ptr_.first()) - ptr_.second()(ptr_.first()); - ptr_.first() = p; - } - } - void swap(unique_ptr& u) {ptr_.swap(u.ptr_);} -private: - boost::compressed_pair<pointer, D> ptr_; - - template <class U, class E> unique_ptr(U p, E, - typename boost::enable_if<boost::is_convertible<U, pointer> >::type* = 0); - template <class U> explicit unique_ptr(U, - typename boost::enable_if<boost::is_convertible<U, pointer> >::type* = 0); - - unique_ptr(unique_ptr&); - template <class U> unique_ptr(U&, typename ipcdetail::unique_ptr_error<U>::type = 0); - - unique_ptr& operator=(unique_ptr&); - template <class U> typename ipcdetail::unique_ptr_error<U>::type operator=(U&); -}; - -template <class T, class D, std::size_t N> -class unique_ptr<T[N], D> -{ - struct nat {int for_bool_;}; - typedef typename ipcdetail::add_reference<D>::type deleter_reference; - typedef typename ipcdetail::add_reference<const D>::type deleter_const_reference; -public: - typedef T element_type; - typedef D deleter_type; - typedef typename ipcdetail::pointer_type<T, D>::type pointer; - static const std::size_t size = N; - - // constructors - unique_ptr() : ptr_(0) {} - explicit unique_ptr(pointer p) : ptr_(p) {} - unique_ptr(pointer p, typename if_< - boost::is_reference<D>, - D, - typename ipcdetail::add_reference<const D>::type>::type d) - : ptr_(p, d) {} - unique_ptr(const unique_ptr& u) - : ptr_(const_cast<unique_ptr&>(u).release(), u.get_deleter()) {} - - // destructor - ~unique_ptr() {reset();} - - // assignment - unique_ptr& operator=(const unique_ptr& cu) - { - unique_ptr& u = const_cast<unique_ptr&>(cu); - reset(u.release()); - ptr_.second() = u.get_deleter(); - return *this; - } - unique_ptr& operator=(int nat::*) - { - reset(); - return *this; - } - - // observers - typename ipcdetail::add_reference<T>::type operator[](std::size_t i) const {return ptr_.first()[i];} - pointer get() const {return ptr_.first();} - deleter_reference get_deleter() {return ptr_.second();} - deleter_const_reference get_deleter() const {return ptr_.second();} - operator int nat::*() const {return ptr_.first() ? &nat::for_bool : 0;} - - // modifiers - pointer release() - { - pointer tmp = ptr_.first(); - ptr_.first() = 0; - return tmp; - } - void reset(pointer p = 0) - { - if (ptr_.first() != p) - { - if (ptr_.first()) - ptr_.second()(ptr_.first(), N); - ptr_.first() = p; - } - } - void swap(unique_ptr& u) {ptr_.swap(u.ptr_);} -private: - boost::compressed_pair<pointer, D> ptr_; - - template <class U, class E> unique_ptr(U p, E, - typename boost::enable_if<boost::is_convertible<U, pointer> >::type* = 0); - template <class U> explicit unique_ptr(U, - typename boost::enable_if<boost::is_convertible<U, pointer> >::type* = 0); - - unique_ptr(unique_ptr&); - template <class U> unique_ptr(U&, typename ipcdetail::unique_ptr_error<U>::type = 0); - - unique_ptr& operator=(unique_ptr&); - template <class U> typename ipcdetail::unique_ptr_error<U>::type operator=(U&); -}; -*/ -template <class T, class D> inline -void swap(unique_ptr<T, D>& x, unique_ptr<T, D>& y) -{ x.swap(y); } - -template <class T1, class D1, class T2, class D2> inline -bool operator==(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y) -{ return x.get() == y.get(); } - -template <class T1, class D1, class T2, class D2> inline -bool operator!=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y) -{ return x.get() != y.get(); } - -template <class T1, class D1, class T2, class D2> inline -bool operator <(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y) -{ return x.get() < y.get(); } - -template <class T1, class D1, class T2, class D2> inline -bool operator<=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y) -{ return x.get() <= y.get(); } - -template <class T1, class D1, class T2, class D2> inline -bool operator >(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y) -{ return x.get() > y.get(); } - -template <class T1, class D1, class T2, class D2> inline -bool operator>=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y) -{ return x.get() >= y.get(); } - - -//!Returns the type of a unique pointer -//!of type T with boost::interprocess::deleter deleter -//!that can be constructed in the given managed segment type. -template<class T, class ManagedMemory> -struct managed_unique_ptr -{ - typedef unique_ptr - < T - , typename ManagedMemory::template deleter<T>::type - > type; -}; - -//!Returns an instance of a unique pointer constructed -//!with boost::interproces::deleter from a pointer -//!of type T that has been allocated in the passed managed segment -template<class T, class ManagedMemory> -inline typename managed_unique_ptr<T, ManagedMemory>::type - make_managed_unique_ptr(T *constructed_object, ManagedMemory &managed_memory) -{ - return typename managed_unique_ptr<T, ManagedMemory>::type - (constructed_object, managed_memory.template get_deleter<T>()); -} - -} //namespace interprocess{ -} //namespace boost{ - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //#ifndef BOOST_INTERPROCESS_UNIQUE_PTR_HPP_INCLUDED diff --git a/src/third_party/boost-1.56.0/boost/interprocess/streams/bufferstream.hpp b/src/third_party/boost-1.56.0/boost/interprocess/streams/bufferstream.hpp deleted file mode 100644 index 404880d24eb..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/streams/bufferstream.hpp +++ /dev/null @@ -1,483 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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. -// -////////////////////////////////////////////////////////////////////////////// -// -// This file comes from SGI's sstream file. Modified by Ion Gaztanaga 2005-2012. -// Changed internal SGI string to a buffer. Added efficient -// internal buffer get/set/swap functions, so that we can obtain/establish the -// internal buffer without any reallocation or copy. Kill those temporaries! -/////////////////////////////////////////////////////////////////////////////// -/* - * Copyright (c) 1998 - * Silicon Graphics Computer Systems, Inc. - * - * Permission to use, copy, modify, distribute and sell this software - * and its documentation for any purpose is hereby granted without fee, - * provided that the above copyright notice appear in all copies and - * that both that copyright notice and this permission notice appear - * in supporting documentation. Silicon Graphics makes no - * representations about the suitability of this software for any - * purpose. It is provided "as is" without express or implied warranty. - */ - -//!\file -//!This file defines basic_bufferbuf, basic_ibufferstream, -//!basic_obufferstream, and basic_bufferstream classes. These classes -//!represent streamsbufs and streams whose sources or destinations -//!are fixed size character buffers. - -#ifndef BOOST_INTERPROCESS_BUFFERSTREAM_HPP -#define BOOST_INTERPROCESS_BUFFERSTREAM_HPP - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> - -#include <iosfwd> -#include <ios> -#include <istream> -#include <ostream> -#include <string> // char traits -#include <cstddef> // ptrdiff_t -#include <boost/assert.hpp> -#include <boost/interprocess/interprocess_fwd.hpp> - -namespace boost { namespace interprocess { - -//!A streambuf class that controls the transmission of elements to and from -//!a basic_xbufferstream. The elements are transmitted from a to a fixed -//!size buffer -template <class CharT, class CharTraits> -class basic_bufferbuf - : public std::basic_streambuf<CharT, CharTraits> -{ - public: - typedef CharT char_type; - typedef typename CharTraits::int_type int_type; - typedef typename CharTraits::pos_type pos_type; - typedef typename CharTraits::off_type off_type; - typedef CharTraits traits_type; - typedef std::basic_streambuf<char_type, traits_type> base_t; - - public: - //!Constructor. - //!Does not throw. - explicit basic_bufferbuf(std::ios_base::openmode mode - = std::ios_base::in | std::ios_base::out) - : base_t(), m_mode(mode), m_buffer(0), m_length(0) - {} - - //!Constructor. Assigns formatting buffer. - //!Does not throw. - explicit basic_bufferbuf(CharT *buf, std::size_t length, - std::ios_base::openmode mode - = std::ios_base::in | std::ios_base::out) - : base_t(), m_mode(mode), m_buffer(buf), m_length(length) - { this->set_pointers(); } - - virtual ~basic_bufferbuf(){} - - public: - //!Returns the pointer and size of the internal buffer. - //!Does not throw. - std::pair<CharT *, std::size_t> buffer() const - { return std::pair<CharT *, std::size_t>(m_buffer, m_length); } - - //!Sets the underlying buffer to a new value - //!Does not throw. - void buffer(CharT *buf, std::size_t length) - { m_buffer = buf; m_length = length; this->set_pointers(); } - - /// @cond - private: - void set_pointers() - { - // The initial read position is the beginning of the buffer. - if(m_mode & std::ios_base::in) - this->setg(m_buffer, m_buffer, m_buffer + m_length); - - // The initial write position is the beginning of the buffer. - if(m_mode & std::ios_base::out) - this->setp(m_buffer, m_buffer + m_length); - } - - protected: - virtual int_type underflow() - { - // Precondition: gptr() >= egptr(). Returns a character, if available. - return this->gptr() != this->egptr() ? - CharTraits::to_int_type(*this->gptr()) : CharTraits::eof(); - } - - virtual int_type pbackfail(int_type c = CharTraits::eof()) - { - if(this->gptr() != this->eback()) { - if(!CharTraits::eq_int_type(c, CharTraits::eof())) { - if(CharTraits::eq(CharTraits::to_char_type(c), this->gptr()[-1])) { - this->gbump(-1); - return c; - } - else if(m_mode & std::ios_base::out) { - this->gbump(-1); - *this->gptr() = c; - return c; - } - else - return CharTraits::eof(); - } - else { - this->gbump(-1); - return CharTraits::not_eof(c); - } - } - else - return CharTraits::eof(); - } - - virtual int_type overflow(int_type c = CharTraits::eof()) - { - if(m_mode & std::ios_base::out) { - if(!CharTraits::eq_int_type(c, CharTraits::eof())) { -// if(!(m_mode & std::ios_base::in)) { -// if(this->pptr() != this->epptr()) { -// *this->pptr() = CharTraits::to_char_type(c); -// this->pbump(1); -// return c; -// } -// else -// return CharTraits::eof(); -// } -// else { - if(this->pptr() == this->epptr()) { - //We can't append to a static buffer - return CharTraits::eof(); - } - else { - *this->pptr() = CharTraits::to_char_type(c); - this->pbump(1); - return c; - } -// } - } - else // c is EOF, so we don't have to do anything - return CharTraits::not_eof(c); - } - else // Overflow always fails if it's read-only. - return CharTraits::eof(); - } - - virtual pos_type seekoff(off_type off, std::ios_base::seekdir dir, - std::ios_base::openmode mode - = std::ios_base::in | std::ios_base::out) - { - bool in = false; - bool out = false; - - const std::ios_base::openmode inout = - std::ios_base::in | std::ios_base::out; - - if((mode & inout) == inout) { - if(dir == std::ios_base::beg || dir == std::ios_base::end) - in = out = true; - } - else if(mode & std::ios_base::in) - in = true; - else if(mode & std::ios_base::out) - out = true; - - if(!in && !out) - return pos_type(off_type(-1)); - else if((in && (!(m_mode & std::ios_base::in) || this->gptr() == 0)) || - (out && (!(m_mode & std::ios_base::out) || this->pptr() == 0))) - return pos_type(off_type(-1)); - - std::streamoff newoff; - switch(dir) { - case std::ios_base::beg: - newoff = 0; - break; - case std::ios_base::end: - newoff = static_cast<std::streamoff>(m_length); - break; - case std::ios_base::cur: - newoff = in ? static_cast<std::streamoff>(this->gptr() - this->eback()) - : static_cast<std::streamoff>(this->pptr() - this->pbase()); - break; - default: - return pos_type(off_type(-1)); - } - - off += newoff; - - if(in) { - std::ptrdiff_t n = this->egptr() - this->eback(); - - if(off < 0 || off > n) - return pos_type(off_type(-1)); - else - this->setg(this->eback(), this->eback() + off, this->eback() + n); - } - - if(out) { - std::ptrdiff_t n = this->epptr() - this->pbase(); - - if(off < 0 || off > n) - return pos_type(off_type(-1)); - else { - this->setp(this->pbase(), this->pbase() + n); - this->pbump(off); - } - } - - return pos_type(off); - } - - virtual pos_type seekpos(pos_type pos, std::ios_base::openmode mode - = std::ios_base::in | std::ios_base::out) - { return seekoff(pos - pos_type(off_type(0)), std::ios_base::beg, mode); } - - private: - std::ios_base::openmode m_mode; - CharT * m_buffer; - std::size_t m_length; - /// @endcond -}; - -//!A basic_istream class that uses a fixed size character buffer -//!as its formatting buffer. -template <class CharT, class CharTraits> -class basic_ibufferstream : - /// @cond - private basic_bufferbuf<CharT, CharTraits>, - /// @endcond - public std::basic_istream<CharT, CharTraits> -{ - public: // Typedefs - typedef typename std::basic_ios - <CharT, CharTraits>::char_type char_type; - typedef typename std::basic_ios<char_type, CharTraits>::int_type int_type; - typedef typename std::basic_ios<char_type, CharTraits>::pos_type pos_type; - typedef typename std::basic_ios<char_type, CharTraits>::off_type off_type; - typedef typename std::basic_ios<char_type, CharTraits>::traits_type traits_type; - - /// @cond - private: - typedef basic_bufferbuf<CharT, CharTraits> bufferbuf_t; - typedef std::basic_ios<char_type, CharTraits> basic_ios_t; - typedef std::basic_istream<char_type, CharTraits> base_t; - bufferbuf_t & get_buf() { return *this; } - const bufferbuf_t & get_buf() const{ return *this; } - /// @endcond - - public: - //!Constructor. - //!Does not throw. - basic_ibufferstream(std::ios_base::openmode mode = std::ios_base::in) - : //basic_ios_t() is called first (lefting it uninitialized) as it's a - //virtual base of basic_istream. The class will be initialized when - //basic_istream is constructed calling basic_ios_t::init(). - //As bufferbuf_t's constructor does not throw there is no risk of - //calling the basic_ios_t's destructor without calling basic_ios_t::init() - bufferbuf_t(mode | std::ios_base::in) - , base_t(&get_buf()) - {} - - //!Constructor. Assigns formatting buffer. - //!Does not throw. - basic_ibufferstream(const CharT *buf, std::size_t length, - std::ios_base::openmode mode = std::ios_base::in) - : //basic_ios_t() is called first (lefting it uninitialized) as it's a - //virtual base of basic_istream. The class will be initialized when - //basic_istream is constructed calling basic_ios_t::init(). - //As bufferbuf_t's constructor does not throw there is no risk of - //calling the basic_ios_t's destructor without calling basic_ios_t::init() - bufferbuf_t(const_cast<CharT*>(buf), length, mode | std::ios_base::in) - , base_t(&get_buf()) - {} - - ~basic_ibufferstream(){}; - - public: - //!Returns the address of the stored - //!stream buffer. - basic_bufferbuf<CharT, CharTraits>* rdbuf() const - { return const_cast<basic_bufferbuf<CharT, CharTraits>*>(&get_buf()); } - - //!Returns the pointer and size of the internal buffer. - //!Does not throw. - std::pair<const CharT *, std::size_t> buffer() const - { return get_buf().buffer(); } - - //!Sets the underlying buffer to a new value. Resets - //!stream position. Does not throw. - void buffer(const CharT *buf, std::size_t length) - { get_buf().buffer(const_cast<CharT*>(buf), length); } -}; - -//!A basic_ostream class that uses a fixed size character buffer -//!as its formatting buffer. -template <class CharT, class CharTraits> -class basic_obufferstream : - /// @cond - private basic_bufferbuf<CharT, CharTraits>, - /// @endcond - public std::basic_ostream<CharT, CharTraits> -{ - public: - typedef typename std::basic_ios - <CharT, CharTraits>::char_type char_type; - typedef typename std::basic_ios<char_type, CharTraits>::int_type int_type; - typedef typename std::basic_ios<char_type, CharTraits>::pos_type pos_type; - typedef typename std::basic_ios<char_type, CharTraits>::off_type off_type; - typedef typename std::basic_ios<char_type, CharTraits>::traits_type traits_type; - - /// @cond - private: - typedef basic_bufferbuf<CharT, CharTraits> bufferbuf_t; - typedef std::basic_ios<char_type, CharTraits> basic_ios_t; - typedef std::basic_ostream<char_type, CharTraits> base_t; - bufferbuf_t & get_buf() { return *this; } - const bufferbuf_t & get_buf() const{ return *this; } - /// @endcond - - public: - //!Constructor. - //!Does not throw. - basic_obufferstream(std::ios_base::openmode mode = std::ios_base::out) - : //basic_ios_t() is called first (lefting it uninitialized) as it's a - //virtual base of basic_istream. The class will be initialized when - //basic_istream is constructed calling basic_ios_t::init(). - //As bufferbuf_t's constructor does not throw there is no risk of - //calling the basic_ios_t's destructor without calling basic_ios_t::init() - bufferbuf_t(mode | std::ios_base::out) - , base_t(&get_buf()) - {} - - //!Constructor. Assigns formatting buffer. - //!Does not throw. - basic_obufferstream(CharT *buf, std::size_t length, - std::ios_base::openmode mode = std::ios_base::out) - : //basic_ios_t() is called first (lefting it uninitialized) as it's a - //virtual base of basic_istream. The class will be initialized when - //basic_istream is constructed calling basic_ios_t::init(). - //As bufferbuf_t's constructor does not throw there is no risk of - //calling the basic_ios_t's destructor without calling basic_ios_t::init() - bufferbuf_t(buf, length, mode | std::ios_base::out) - , base_t(&get_buf()) - {} - - ~basic_obufferstream(){} - - public: - //!Returns the address of the stored - //!stream buffer. - basic_bufferbuf<CharT, CharTraits>* rdbuf() const - { return const_cast<basic_bufferbuf<CharT, CharTraits>*>(&get_buf()); } - - //!Returns the pointer and size of the internal buffer. - //!Does not throw. - std::pair<CharT *, std::size_t> buffer() const - { return get_buf().buffer(); } - - //!Sets the underlying buffer to a new value. Resets - //!stream position. Does not throw. - void buffer(CharT *buf, std::size_t length) - { get_buf().buffer(buf, length); } -}; - - -//!A basic_iostream class that uses a fixed size character buffer -//!as its formatting buffer. -template <class CharT, class CharTraits> -class basic_bufferstream : - /// @cond - private basic_bufferbuf<CharT, CharTraits>, - /// @endcond - public std::basic_iostream<CharT, CharTraits> -{ - public: // Typedefs - typedef typename std::basic_ios - <CharT, CharTraits>::char_type char_type; - typedef typename std::basic_ios<char_type, CharTraits>::int_type int_type; - typedef typename std::basic_ios<char_type, CharTraits>::pos_type pos_type; - typedef typename std::basic_ios<char_type, CharTraits>::off_type off_type; - typedef typename std::basic_ios<char_type, CharTraits>::traits_type traits_type; - - /// @cond - private: - typedef basic_bufferbuf<CharT, CharTraits> bufferbuf_t; - typedef std::basic_ios<char_type, CharTraits> basic_ios_t; - typedef std::basic_iostream<char_type, CharTraits> base_t; - bufferbuf_t & get_buf() { return *this; } - const bufferbuf_t & get_buf() const{ return *this; } - /// @endcond - - public: - //!Constructor. - //!Does not throw. - basic_bufferstream(std::ios_base::openmode mode - = std::ios_base::in | std::ios_base::out) - : //basic_ios_t() is called first (lefting it uninitialized) as it's a - //virtual base of basic_istream. The class will be initialized when - //basic_istream is constructed calling basic_ios_t::init(). - //As bufferbuf_t's constructor does not throw there is no risk of - //calling the basic_ios_t's destructor without calling basic_ios_t::init() - bufferbuf_t(mode) - , base_t(&get_buf()) - {} - - //!Constructor. Assigns formatting buffer. - //!Does not throw. - basic_bufferstream(CharT *buf, std::size_t length, - std::ios_base::openmode mode - = std::ios_base::in | std::ios_base::out) - : //basic_ios_t() is called first (lefting it uninitialized) as it's a - //virtual base of basic_istream. The class will be initialized when - //basic_istream is constructed calling basic_ios_t::init(). - //As bufferbuf_t's constructor does not throw there is no risk of - //calling the basic_ios_t's destructor without calling basic_ios_t::init() - bufferbuf_t(buf, length, mode) - , base_t(&get_buf()) - {} - - ~basic_bufferstream(){} - - public: - //!Returns the address of the stored - //!stream buffer. - basic_bufferbuf<CharT, CharTraits>* rdbuf() const - { return const_cast<basic_bufferbuf<CharT, CharTraits>*>(&get_buf()); } - - //!Returns the pointer and size of the internal buffer. - //!Does not throw. - std::pair<CharT *, std::size_t> buffer() const - { return get_buf().buffer(); } - - //!Sets the underlying buffer to a new value. Resets - //!stream position. Does not throw. - void buffer(CharT *buf, std::size_t length) - { get_buf().buffer(buf, length); } -}; - -//Some typedefs to simplify usage -typedef basic_bufferbuf<char> bufferbuf; -typedef basic_bufferstream<char> bufferstream; -typedef basic_ibufferstream<char> ibufferstream; -typedef basic_obufferstream<char> obufferstream; - -typedef basic_bufferbuf<wchar_t> wbufferbuf; -typedef basic_bufferstream<wchar_t> wbufferstream; -typedef basic_ibufferstream<wchar_t> wibufferstream; -typedef basic_obufferstream<wchar_t> wobufferstream; - - -}} //namespace boost { namespace interprocess { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif /* BOOST_INTERPROCESS_BUFFERSTREAM_HPP */ diff --git a/src/third_party/boost-1.56.0/boost/interprocess/sync/detail/common_algorithms.hpp b/src/third_party/boost-1.56.0/boost/interprocess/sync/detail/common_algorithms.hpp deleted file mode 100644 index 6d26db82d4e..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/sync/detail/common_algorithms.hpp +++ /dev/null @@ -1,73 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2012-2013. 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_SYNC_DETAIL_COMMON_ALGORITHMS_HPP -#define BOOST_INTERPROCESS_SYNC_DETAIL_COMMON_ALGORITHMS_HPP - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> - -#include <boost/interprocess/sync/spin/wait.hpp> - -namespace boost { -namespace interprocess { -namespace ipcdetail { - -template<class MutexType> -bool try_based_timed_lock(MutexType &m, const boost::posix_time::ptime &abs_time) -{ - //Same as lock() - if(abs_time == boost::posix_time::pos_infin){ - m.lock(); - return true; - } - //Always try to lock to achieve POSIX guarantees: - // "Under no circumstance shall the function fail with a timeout if the mutex - // can be locked immediately. The validity of the abs_timeout parameter need not - // be checked if the mutex can be locked immediately." - else if(m.try_lock()){ - return true; - } - else{ - spin_wait swait; - while(microsec_clock::universal_time() < abs_time){ - if(m.try_lock()){ - return true; - } - swait.yield(); - } - return false; - } -} - -template<class MutexType> -void try_based_lock(MutexType &m) -{ - if(!m.try_lock()){ - spin_wait swait; - do{ - if(m.try_lock()){ - break; - } - else{ - swait.yield(); - } - } - while(1); - } -} - -} //namespace ipcdetail -} //namespace interprocess -} //namespace boost - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //BOOST_INTERPROCESS_SYNC_DETAIL_COMMON_ALGORITHMS_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/sync/interprocess_mutex.hpp b/src/third_party/boost-1.56.0/boost/interprocess/sync/interprocess_mutex.hpp deleted file mode 100644 index 6dbcedf4f5a..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/sync/interprocess_mutex.hpp +++ /dev/null @@ -1,184 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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. -// -////////////////////////////////////////////////////////////////////////////// -// -// Parts of the pthread code come from Boost Threads code. -// -////////////////////////////////////////////////////////////////////////////// - -#ifndef BOOST_INTERPROCESS_MUTEX_HPP -#define BOOST_INTERPROCESS_MUTEX_HPP - -/// @cond - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/exceptions.hpp> -#include <boost/interprocess/detail/workaround.hpp> -#include <boost/interprocess/detail/posix_time_types_wrk.hpp> -#include <boost/assert.hpp> - -#if !defined(BOOST_INTERPROCESS_FORCE_GENERIC_EMULATION) && defined (BOOST_INTERPROCESS_POSIX_PROCESS_SHARED) - #include <boost/interprocess/sync/posix/mutex.hpp> - #define BOOST_INTERPROCESS_USE_POSIX -//Experimental... -#elif !defined(BOOST_INTERPROCESS_FORCE_GENERIC_EMULATION) && defined (BOOST_INTERPROCESS_WINDOWS) - #include <boost/interprocess/sync/windows/mutex.hpp> - #define BOOST_INTERPROCESS_USE_WINDOWS -#elif !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) - #include <boost/interprocess/sync/spin/mutex.hpp> - #define BOOST_INTERPROCESS_USE_GENERIC_EMULATION - -namespace boost { -namespace interprocess { -namespace ipcdetail{ -namespace robust_emulation_helpers { - -template<class T> -class mutex_traits; - -}}}} - -#endif - -/// @endcond - -//!\file -//!Describes a mutex class that can be placed in memory shared by -//!several processes. - -namespace boost { -namespace interprocess { - -class interprocess_condition; - -//!Wraps a interprocess_mutex that can be placed in shared memory and can be -//!shared between processes. Allows timed lock tries -class interprocess_mutex -{ - /// @cond - //Non-copyable - interprocess_mutex(const interprocess_mutex &); - interprocess_mutex &operator=(const interprocess_mutex &); - friend class interprocess_condition; - - public: - #if defined(BOOST_INTERPROCESS_USE_GENERIC_EMULATION) - #undef BOOST_INTERPROCESS_USE_GENERIC_EMULATION - typedef ipcdetail::spin_mutex internal_mutex_type; - private: - friend class ipcdetail::robust_emulation_helpers::mutex_traits<interprocess_mutex>; - void take_ownership(){ m_mutex.take_ownership(); } - public: - #elif defined(BOOST_INTERPROCESS_USE_POSIX) - #undef BOOST_INTERPROCESS_USE_POSIX - typedef ipcdetail::posix_mutex internal_mutex_type; - #elif defined(BOOST_INTERPROCESS_USE_WINDOWS) - #undef BOOST_INTERPROCESS_USE_WINDOWS - typedef ipcdetail::windows_mutex internal_mutex_type; - #else - #error "Unknown platform for interprocess_mutex" - #endif - - /// @endcond - public: - - //!Constructor. - //!Throws interprocess_exception on error. - interprocess_mutex(); - - //!Destructor. If any process uses the mutex after the destructor is called - //!the result is undefined. Does not throw. - ~interprocess_mutex(); - - //!Effects: The calling thread tries to obtain ownership of the mutex, and - //! if another thread has ownership of the mutex, it waits until it can - //! obtain the ownership. If a thread takes ownership of the mutex the - //! mutex must be unlocked by the same mutex. - //!Throws: interprocess_exception on error. - void lock(); - - //!Effects: The calling thread tries to obtain ownership of the mutex, and - //! if another thread has ownership of the mutex returns immediately. - //!Returns: If the thread acquires ownership of the mutex, returns true, if - //! the another thread has ownership of the mutex, returns false. - //!Throws: interprocess_exception on error. - bool try_lock(); - - //!Effects: The calling thread will try to obtain exclusive ownership of the - //! mutex if it can do so in until the specified time is reached. If the - //! mutex supports recursive locking, the mutex must be unlocked the same - //! number of times it is locked. - //!Returns: If the thread acquires ownership of the mutex, returns true, if - //! the timeout expires returns false. - //!Throws: interprocess_exception on error. - bool timed_lock(const boost::posix_time::ptime &abs_time); - - //!Effects: The calling thread releases the exclusive ownership of the mutex. - //!Throws: interprocess_exception on error. - void unlock(); - - /// @cond - internal_mutex_type &internal_mutex() - { return m_mutex; } - - const internal_mutex_type &internal_mutex() const - { return m_mutex; } - - private: - internal_mutex_type m_mutex; - /// @endcond -}; - -} //namespace interprocess { -} //namespace boost { - - -namespace boost { -namespace interprocess { - -inline interprocess_mutex::interprocess_mutex(){} - -inline interprocess_mutex::~interprocess_mutex(){} - -inline void interprocess_mutex::lock() -{ - #ifdef BOOST_INTERPROCESS_ENABLE_TIMEOUT_WHEN_LOCKING - boost::posix_time::ptime wait_time - = boost::posix_time::microsec_clock::universal_time() - + boost::posix_time::milliseconds(BOOST_INTERPROCESS_TIMEOUT_WHEN_LOCKING_DURATION_MS); - if (!m_mutex.timed_lock(wait_time)) - { - throw interprocess_exception(timeout_when_locking_error - , "Interprocess mutex timeout when locking. Possible deadlock: " - "owner died without unlocking?"); - } - #else - m_mutex.lock(); - #endif -} - -inline bool interprocess_mutex::try_lock() -{ return m_mutex.try_lock(); } - -inline bool interprocess_mutex::timed_lock(const boost::posix_time::ptime &abs_time) -{ return m_mutex.timed_lock(abs_time); } - -inline void interprocess_mutex::unlock() -{ m_mutex.unlock(); } - -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //BOOST_INTERPROCESS_MUTEX_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/sync/interprocess_recursive_mutex.hpp b/src/third_party/boost-1.56.0/boost/interprocess/sync/interprocess_recursive_mutex.hpp deleted file mode 100644 index 43d4125655d..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/sync/interprocess_recursive_mutex.hpp +++ /dev/null @@ -1,177 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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. -// -////////////////////////////////////////////////////////////////////////////// -// -// Parts of the pthread code come from Boost Threads code: -// -////////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) 2001-2003 -// William E. Kempf -// -// Permission to use, copy, modify, distribute and sell this software -// and its documentation for any purpose is hereby granted without fee, -// provided that the above copyright notice appear in all copies and -// that both that copyright notice and this permission notice appear -// in supporting documentation. William E. Kempf makes no representations -// about the suitability of this software for any purpose. -// It is provided "as is" without express or implied warranty. -////////////////////////////////////////////////////////////////////////////// - -#ifndef BOOST_INTERPROCESS_RECURSIVE_MUTEX_HPP -#define BOOST_INTERPROCESS_RECURSIVE_MUTEX_HPP - -/// @cond - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> -#include <boost/interprocess/detail/posix_time_types_wrk.hpp> -#include <boost/assert.hpp> - -#if !defined(BOOST_INTERPROCESS_FORCE_GENERIC_EMULATION) && \ - (defined(BOOST_INTERPROCESS_POSIX_PROCESS_SHARED) && defined (BOOST_INTERPROCESS_POSIX_RECURSIVE_MUTEXES)) - #include <boost/interprocess/sync/posix/recursive_mutex.hpp> - #define BOOST_INTERPROCESS_USE_POSIX -//Experimental... -#elif !defined(BOOST_INTERPROCESS_FORCE_GENERIC_EMULATION) && defined (BOOST_INTERPROCESS_WINDOWS) - #include <boost/interprocess/sync/windows/recursive_mutex.hpp> - #define BOOST_INTERPROCESS_USE_WINDOWS -#elif !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) - #include <boost/interprocess/sync/spin/recursive_mutex.hpp> - #define BOOST_INTERPROCESS_USE_GENERIC_EMULATION -#endif - -#if defined (BOOST_INTERPROCESS_USE_GENERIC_EMULATION) -namespace boost { -namespace interprocess { -namespace ipcdetail{ -namespace robust_emulation_helpers { - -template<class T> -class mutex_traits; - -}}}} - -#endif - -/// @endcond - -//!\file -//!Describes interprocess_recursive_mutex and shared_recursive_try_mutex classes - -namespace boost { -namespace interprocess { - -//!Wraps a interprocess_mutex that can be placed in shared memory and can be -//!shared between processes. Allows several locking calls by the same -//!process. Allows timed lock tries -class interprocess_recursive_mutex -{ - /// @cond - //Non-copyable - interprocess_recursive_mutex(const interprocess_recursive_mutex &); - interprocess_recursive_mutex &operator=(const interprocess_recursive_mutex &); - /// @endcond - public: - //!Constructor. - //!Throws interprocess_exception on error. - interprocess_recursive_mutex(); - - //!Destructor. If any process uses the mutex after the destructor is called - //!the result is undefined. Does not throw. - ~interprocess_recursive_mutex(); - - //!Effects: The calling thread tries to obtain ownership of the mutex, and - //! if another thread has ownership of the mutex, it waits until it can - //! obtain the ownership. If a thread takes ownership of the mutex the - //! mutex must be unlocked by the same mutex. The mutex must be unlocked - //! the same number of times it is locked. - //!Throws: interprocess_exception on error. - void lock(); - - //!Tries to lock the interprocess_mutex, returns false when interprocess_mutex - //!is already locked, returns true when success. The mutex must be unlocked - //!the same number of times it is locked. - //!Throws: interprocess_exception if a severe error is found - bool try_lock(); - - //!Tries to lock the interprocess_mutex, if interprocess_mutex can't be locked before - //!abs_time time, returns false. The mutex must be unlocked - //! the same number of times it is locked. - //!Throws: interprocess_exception if a severe error is found - bool timed_lock(const boost::posix_time::ptime &abs_time); - - //!Effects: The calling thread releases the exclusive ownership of the mutex. - //! If the mutex supports recursive locking, the mutex must be unlocked the - //! same number of times it is locked. - //!Throws: interprocess_exception on error. - void unlock(); - /// @cond - private: - - #if defined (BOOST_INTERPROCESS_USE_GENERIC_EMULATION) - #undef BOOST_INTERPROCESS_USE_GENERIC_EMULATION - void take_ownership(){ mutex.take_ownership(); } - friend class ipcdetail::robust_emulation_helpers::mutex_traits<interprocess_recursive_mutex>; - ipcdetail::spin_recursive_mutex mutex; - #elif defined(BOOST_INTERPROCESS_USE_POSIX) - #undef BOOST_INTERPROCESS_USE_POSIX - ipcdetail::posix_recursive_mutex mutex; - #elif defined(BOOST_INTERPROCESS_USE_WINDOWS) - #undef BOOST_INTERPROCESS_USE_WINDOWS - ipcdetail::windows_recursive_mutex mutex; - #else - #error "Unknown platform for interprocess_mutex" - #endif - /// @endcond -}; - -} //namespace interprocess { -} //namespace boost { - -namespace boost { -namespace interprocess { - -inline interprocess_recursive_mutex::interprocess_recursive_mutex(){} - -inline interprocess_recursive_mutex::~interprocess_recursive_mutex(){} - -inline void interprocess_recursive_mutex::lock() -{ - #ifdef BOOST_INTERPROCESS_ENABLE_TIMEOUT_WHEN_LOCKING - boost::posix_time::ptime wait_time - = boost::posix_time::microsec_clock::universal_time() - + boost::posix_time::milliseconds(BOOST_INTERPROCESS_TIMEOUT_WHEN_LOCKING_DURATION_MS); - if (!mutex.timed_lock(wait_time)){ - throw interprocess_exception(timeout_when_locking_error, "Interprocess mutex timeout when locking. Possible deadlock: owner died without unlocking?"); - } - #else - mutex.lock(); - #endif -} - -inline bool interprocess_recursive_mutex::try_lock() -{ return mutex.try_lock(); } - -inline bool interprocess_recursive_mutex::timed_lock(const boost::posix_time::ptime &abs_time) -{ return mutex.timed_lock(abs_time); } - -inline void interprocess_recursive_mutex::unlock() -{ mutex.unlock(); } - -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //BOOST_INTERPROCESS_RECURSIVE_MUTEX_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/sync/lock_options.hpp b/src/third_party/boost-1.56.0/boost/interprocess/sync/lock_options.hpp deleted file mode 100644 index 49589e295d0..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/sync/lock_options.hpp +++ /dev/null @@ -1,55 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_LOCK_OPTIONS_HPP -#define BOOST_INTERPROCESS_LOCK_OPTIONS_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> - -//!\file -//!Describes the lock options with associated with interprocess_mutex lock constructors. - -namespace boost { - -namespace posix_time -{ class ptime; } - -namespace interprocess { - -//!Type to indicate to a mutex lock constructor that must not lock the mutex. -struct defer_lock_type{}; -//!Type to indicate to a mutex lock constructor that must try to lock the mutex. -struct try_to_lock_type {}; -//!Type to indicate to a mutex lock constructor that the mutex is already locked. -struct accept_ownership_type{}; - -//!An object indicating that the locking -//!must be deferred. -static const defer_lock_type defer_lock = defer_lock_type(); - -//!An object indicating that a try_lock() -//!operation must be executed. -static const try_to_lock_type try_to_lock = try_to_lock_type(); - -//!An object indicating that the ownership of lockable -//!object must be accepted by the new owner. -static const accept_ownership_type accept_ownership = accept_ownership_type(); - -} // namespace interprocess { -} // namespace boost{ - -#include <boost/interprocess/detail/config_end.hpp> - -#endif // BOOST_INTERPROCESS_LOCK_OPTIONS_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/sync/mutex_family.hpp b/src/third_party/boost-1.56.0/boost/interprocess/sync/mutex_family.hpp deleted file mode 100644 index f19805f1b2a..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/sync/mutex_family.hpp +++ /dev/null @@ -1,56 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_MUTEX_FAMILY_HPP -#define BOOST_INTERPROCESS_MUTEX_FAMILY_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> - -#include <boost/interprocess/sync/interprocess_mutex.hpp> -#include <boost/interprocess/sync/interprocess_recursive_mutex.hpp> -#include <boost/interprocess/sync/null_mutex.hpp> - -//!\file -//!Describes a shared interprocess_mutex family fit algorithm used to allocate objects in shared memory. - -namespace boost { - -namespace interprocess { - -//!Describes interprocess_mutex family to use with Interprocess framework -//!based on boost::interprocess synchronization objects. -struct mutex_family -{ - typedef boost::interprocess::interprocess_mutex mutex_type; - typedef boost::interprocess::interprocess_recursive_mutex recursive_mutex_type; -}; - -//!Describes interprocess_mutex family to use with Interprocess frameworks -//!based on null operation synchronization objects. -struct null_mutex_family -{ - typedef boost::interprocess::null_mutex mutex_type; - typedef boost::interprocess::null_mutex recursive_mutex_type; -}; - -} //namespace interprocess { - -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //#ifndef BOOST_INTERPROCESS_MUTEX_FAMILY_HPP - - diff --git a/src/third_party/boost-1.56.0/boost/interprocess/sync/null_mutex.hpp b/src/third_party/boost-1.56.0/boost/interprocess/sync/null_mutex.hpp deleted file mode 100644 index 66cb3caf5d5..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/sync/null_mutex.hpp +++ /dev/null @@ -1,147 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_NULL_MUTEX_HPP -#define BOOST_INTERPROCESS_NULL_MUTEX_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> - - -//!\file -//!Describes null_mutex classes - -namespace boost { - -namespace posix_time -{ class ptime; } - -namespace interprocess { - -//!Implements a mutex that simulates a mutex without doing any operation and -//!simulates a successful operation. -class null_mutex -{ - /// @cond - null_mutex(const null_mutex&); - null_mutex &operator= (const null_mutex&); - /// @endcond - public: - - //!Constructor. - //!Empty. - null_mutex(){} - - //!Destructor. - //!Empty. - ~null_mutex(){} - - //!Simulates a mutex lock() operation. Empty function. - void lock(){} - - //!Simulates a mutex try_lock() operation. - //!Equivalent to "return true;" - bool try_lock() - { return true; } - - //!Simulates a mutex timed_lock() operation. - //!Equivalent to "return true;" - bool timed_lock(const boost::posix_time::ptime &) - { return true; } - - //!Simulates a mutex unlock() operation. - //!Empty function. - void unlock(){} - - //!Simulates a mutex lock_sharable() operation. - //!Empty function. - void lock_sharable(){} - - //!Simulates a mutex try_lock_sharable() operation. - //!Equivalent to "return true;" - bool try_lock_sharable() - { return true; } - - //!Simulates a mutex timed_lock_sharable() operation. - //!Equivalent to "return true;" - bool timed_lock_sharable(const boost::posix_time::ptime &) - { return true; } - - //!Simulates a mutex unlock_sharable() operation. - //!Empty function. - void unlock_sharable(){} - - //!Simulates a mutex lock_upgradable() operation. - //!Empty function. - void lock_upgradable(){} - - //!Simulates a mutex try_lock_upgradable() operation. - //!Equivalent to "return true;" - bool try_lock_upgradable() - { return true; } - - //!Simulates a mutex timed_lock_upgradable() operation. - //!Equivalent to "return true;" - bool timed_lock_upgradable(const boost::posix_time::ptime &) - { return true; } - - //!Simulates a mutex unlock_upgradable() operation. - //!Empty function. - void unlock_upgradable(){} - - //!Simulates unlock_and_lock_upgradable(). - //!Empty function. - void unlock_and_lock_upgradable(){} - - //!Simulates unlock_and_lock_sharable(). - //!Empty function. - void unlock_and_lock_sharable(){} - - //!Simulates unlock_upgradable_and_lock_sharable(). - //!Empty function. - void unlock_upgradable_and_lock_sharable(){} - - //Promotions - - //!Simulates unlock_upgradable_and_lock(). - //!Empty function. - void unlock_upgradable_and_lock(){} - - //!Simulates try_unlock_upgradable_and_lock(). - //!Equivalent to "return true;" - bool try_unlock_upgradable_and_lock() - { return true; } - - //!Simulates timed_unlock_upgradable_and_lock(). - //!Equivalent to "return true;" - bool timed_unlock_upgradable_and_lock(const boost::posix_time::ptime &) - { return true; } - - //!Simulates try_unlock_sharable_and_lock(). - //!Equivalent to "return true;" - bool try_unlock_sharable_and_lock() - { return true; } - - //!Simulates try_unlock_sharable_and_lock_upgradable(). - //!Equivalent to "return true;" - bool try_unlock_sharable_and_lock_upgradable() - { return true; } -}; - -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //BOOST_INTERPROCESS_NULL_MUTEX_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/sync/posix/mutex.hpp b/src/third_party/boost-1.56.0/boost/interprocess/sync/posix/mutex.hpp deleted file mode 100644 index 4cd4207061e..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/sync/posix/mutex.hpp +++ /dev/null @@ -1,139 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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. -// -////////////////////////////////////////////////////////////////////////////// -// -// Parts of the pthread code come from Boost Threads code: -// -////////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) 2001-2003 -// William E. Kempf -// -// Permission to use, copy, modify, distribute and sell this software -// and its documentation for any purpose is hereby granted without fee, -// provided that the above copyright notice appear in all copies and -// that both that copyright notice and this permission notice appear -// in supporting documentation. William E. Kempf makes no representations -// about the suitability of this software for any purpose. -// It is provided "as is" without express or implied warranty. -////////////////////////////////////////////////////////////////////////////// - -#ifndef BOOST_INTERPROCESS_DETAIL_POSIX_MUTEX_HPP -#define BOOST_INTERPROCESS_DETAIL_POSIX_MUTEX_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> - -#include <pthread.h> -#include <errno.h> -#include <boost/interprocess/exceptions.hpp> -#include <boost/interprocess/sync/posix/ptime_to_timespec.hpp> -#include <boost/interprocess/detail/posix_time_types_wrk.hpp> -#include <boost/interprocess/exceptions.hpp> -#include <boost/interprocess/sync/posix/pthread_helpers.hpp> - -#ifndef BOOST_INTERPROCESS_POSIX_TIMEOUTS -# include <boost/interprocess/detail/os_thread_functions.hpp> -# include <boost/interprocess/sync/detail/common_algorithms.hpp> -#endif -#include <boost/assert.hpp> - -namespace boost { -namespace interprocess { -namespace ipcdetail { - -class posix_condition; - -class posix_mutex -{ - posix_mutex(const posix_mutex &); - posix_mutex &operator=(const posix_mutex &); - public: - - posix_mutex(); - ~posix_mutex(); - - void lock(); - bool try_lock(); - bool timed_lock(const boost::posix_time::ptime &abs_time); - void unlock(); - - friend class posix_condition; - - private: - pthread_mutex_t m_mut; -}; - -inline posix_mutex::posix_mutex() -{ - mutexattr_wrapper mut_attr; - mutex_initializer mut(m_mut, mut_attr); - mut.release(); -} - -inline posix_mutex::~posix_mutex() -{ - int res = pthread_mutex_destroy(&m_mut); - BOOST_ASSERT(res == 0);(void)res; -} - -inline void posix_mutex::lock() -{ - if (pthread_mutex_lock(&m_mut) != 0) - throw lock_exception(); -} - -inline bool posix_mutex::try_lock() -{ - int res = pthread_mutex_trylock(&m_mut); - if (!(res == 0 || res == EBUSY)) - throw lock_exception(); - return res == 0; -} - -inline bool posix_mutex::timed_lock(const boost::posix_time::ptime &abs_time) -{ - #ifdef BOOST_INTERPROCESS_POSIX_TIMEOUTS - //Posix does not support infinity absolute time so handle it here - if(abs_time == boost::posix_time::pos_infin){ - this->lock(); - return true; - } - timespec ts = ptime_to_timespec(abs_time); - int res = pthread_mutex_timedlock(&m_mut, &ts); - if (res != 0 && res != ETIMEDOUT) - throw lock_exception(); - return res == 0; - - #else //BOOST_INTERPROCESS_POSIX_TIMEOUTS - - return ipcdetail::try_based_timed_lock(*this, abs_time); - - #endif //BOOST_INTERPROCESS_POSIX_TIMEOUTS -} - -inline void posix_mutex::unlock() -{ - int res = 0; - res = pthread_mutex_unlock(&m_mut); - (void)res; - BOOST_ASSERT(res == 0); -} - -} //namespace ipcdetail { -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //#ifndef BOOST_INTERPROCESS_DETAIL_POSIX_MUTEX_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/sync/posix/pthread_helpers.hpp b/src/third_party/boost-1.56.0/boost/interprocess/sync/posix/pthread_helpers.hpp deleted file mode 100644 index ce859d7918a..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/sync/posix/pthread_helpers.hpp +++ /dev/null @@ -1,168 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_PTHREAD_HELPERS_HPP -#define BOOST_INTERPROCESS_PTHREAD_HELPERS_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> - -#include <pthread.h> -#include <errno.h> -#include <boost/interprocess/exceptions.hpp> - -namespace boost { -namespace interprocess { -namespace ipcdetail{ - - #if defined BOOST_INTERPROCESS_POSIX_PROCESS_SHARED - - //!Makes pthread_mutexattr_t cleanup easy when using exceptions - struct mutexattr_wrapper - { - //!Constructor - mutexattr_wrapper(bool recursive = false) - { - if(pthread_mutexattr_init(&m_attr)!=0 || - pthread_mutexattr_setpshared(&m_attr, PTHREAD_PROCESS_SHARED)!= 0 || - (recursive && - pthread_mutexattr_settype(&m_attr, PTHREAD_MUTEX_RECURSIVE)!= 0 )) - throw interprocess_exception("pthread_mutexattr_xxxx failed"); - } - - //!Destructor - ~mutexattr_wrapper() { pthread_mutexattr_destroy(&m_attr); } - - //!This allows using mutexattr_wrapper as pthread_mutexattr_t - operator pthread_mutexattr_t&() { return m_attr; } - - pthread_mutexattr_t m_attr; - }; - - //!Makes pthread_condattr_t cleanup easy when using exceptions - struct condattr_wrapper - { - //!Constructor - condattr_wrapper() - { - if(pthread_condattr_init(&m_attr)!=0 || - pthread_condattr_setpshared(&m_attr, PTHREAD_PROCESS_SHARED)!= 0) - throw interprocess_exception("pthread_condattr_xxxx failed"); - } - - //!Destructor - ~condattr_wrapper() { pthread_condattr_destroy(&m_attr); } - - //!This allows using condattr_wrapper as pthread_condattr_t - operator pthread_condattr_t&(){ return m_attr; } - - pthread_condattr_t m_attr; - }; - - //!Makes initialized pthread_mutex_t cleanup easy when using exceptions - class mutex_initializer - { - public: - //!Constructor. Takes interprocess_mutex attributes to initialize the interprocess_mutex - mutex_initializer(pthread_mutex_t &mut, pthread_mutexattr_t &mut_attr) - : mp_mut(&mut) - { - if(pthread_mutex_init(mp_mut, &mut_attr) != 0) - throw interprocess_exception("pthread_mutex_init failed"); - } - - ~mutex_initializer() { if(mp_mut) pthread_mutex_destroy(mp_mut); } - - void release() {mp_mut = 0; } - - private: - pthread_mutex_t *mp_mut; - }; - - //!Makes initialized pthread_cond_t cleanup easy when using exceptions - class condition_initializer - { - public: - condition_initializer(pthread_cond_t &cond, pthread_condattr_t &cond_attr) - : mp_cond(&cond) - { - if(pthread_cond_init(mp_cond, &cond_attr)!= 0) - throw interprocess_exception("pthread_cond_init failed"); - } - - ~condition_initializer() { if(mp_cond) pthread_cond_destroy(mp_cond); } - - void release() { mp_cond = 0; } - - private: - pthread_cond_t *mp_cond; - }; - - #endif // #if defined BOOST_INTERPROCESS_POSIX_PROCESS_SHARED - - #if defined(BOOST_INTERPROCESS_POSIX_BARRIERS) && defined(BOOST_INTERPROCESS_POSIX_PROCESS_SHARED) - - //!Makes pthread_barrierattr_t cleanup easy when using exceptions - struct barrierattr_wrapper - { - //!Constructor - barrierattr_wrapper() - { - if(pthread_barrierattr_init(&m_attr)!=0 || - pthread_barrierattr_setpshared(&m_attr, PTHREAD_PROCESS_SHARED)!= 0) - throw interprocess_exception("pthread_barrierattr_xxx failed"); - } - - //!Destructor - ~barrierattr_wrapper() { pthread_barrierattr_destroy(&m_attr); } - - //!This allows using mutexattr_wrapper as pthread_barrierattr_t - operator pthread_barrierattr_t&() { return m_attr; } - - pthread_barrierattr_t m_attr; - }; - - //!Makes initialized pthread_barrier_t cleanup easy when using exceptions - class barrier_initializer - { - public: - //!Constructor. Takes barrier attributes to initialize the barrier - barrier_initializer(pthread_barrier_t &mut, - pthread_barrierattr_t &mut_attr, - int count) - : mp_barrier(&mut) - { - if(pthread_barrier_init(mp_barrier, &mut_attr, count) != 0) - throw interprocess_exception("pthread_barrier_init failed"); - } - - ~barrier_initializer() { if(mp_barrier) pthread_barrier_destroy(mp_barrier); } - - void release() {mp_barrier = 0; } - - private: - pthread_barrier_t *mp_barrier; - }; - - #endif //#if defined(BOOST_INTERPROCESS_POSIX_BARRIERS) && defined(BOOST_INTERPROCESS_POSIX_PROCESS_SHARED) - -}//namespace ipcdetail - -}//namespace interprocess - -}//namespace boost - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //ifdef BOOST_INTERPROCESS_PTHREAD_HELPERS_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/sync/posix/ptime_to_timespec.hpp b/src/third_party/boost-1.56.0/boost/interprocess/sync/posix/ptime_to_timespec.hpp deleted file mode 100644 index 79eb7dca22a..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/sync/posix/ptime_to_timespec.hpp +++ /dev/null @@ -1,40 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_DETAIL_PTIME_TO_TIMESPEC_HPP -#define BOOST_INTERPROCESS_DETAIL_PTIME_TO_TIMESPEC_HPP - -#include <boost/interprocess/detail/posix_time_types_wrk.hpp> - -namespace boost { - -namespace interprocess { - -namespace ipcdetail { - -inline timespec ptime_to_timespec (const boost::posix_time::ptime &tm) -{ - const boost::posix_time::ptime epoch(boost::gregorian::date(1970,1,1)); - //Avoid negative absolute times - boost::posix_time::time_duration duration = (tm <= epoch) ? boost::posix_time::time_duration(epoch - epoch) - : boost::posix_time::time_duration(tm - epoch); - timespec ts; - ts.tv_sec = duration.total_seconds(); - ts.tv_nsec = duration.total_nanoseconds() % 1000000000; - return ts; -} - -} //namespace ipcdetail { - -} //namespace interprocess { - -} //namespace boost { - -#endif //ifndef BOOST_INTERPROCESS_DETAIL_PTIME_TO_TIMESPEC_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/sync/posix/recursive_mutex.hpp b/src/third_party/boost-1.56.0/boost/interprocess/sync/posix/recursive_mutex.hpp deleted file mode 100644 index d5bda341fcd..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/sync/posix/recursive_mutex.hpp +++ /dev/null @@ -1,129 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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. -// -////////////////////////////////////////////////////////////////////////////// -// -// Parts of the pthread code come from Boost Threads code: -// -////////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) 2001-2003 -// William E. Kempf -// -// Permission to use, copy, modify, distribute and sell this software -// and its documentation for any purpose is hereby granted without fee, -// provided that the above copyright notice appear in all copies and -// that both that copyright notice and this permission notice appear -// in supporting documentation. William E. Kempf makes no representations -// about the suitability of this software for any purpose. -// It is provided "as is" without express or implied warranty. -////////////////////////////////////////////////////////////////////////////// - -#ifndef BOOST_INTERPROCESS_DETAIL_POSIX_RECURSIVE_MUTEX_HPP -#define BOOST_INTERPROCESS_DETAIL_POSIX_RECURSIVE_MUTEX_HPP - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> - -#include <pthread.h> -#include <errno.h> -#include <boost/interprocess/sync/posix/pthread_helpers.hpp> -#include <boost/interprocess/sync/posix/ptime_to_timespec.hpp> -#include <boost/interprocess/detail/posix_time_types_wrk.hpp> -#include <boost/interprocess/exceptions.hpp> -#ifndef BOOST_INTERPROCESS_POSIX_TIMEOUTS -# include <boost/interprocess/detail/os_thread_functions.hpp> -# include <boost/interprocess/sync/detail/common_algorithms.hpp> -#endif -#include <boost/assert.hpp> - -namespace boost { -namespace interprocess { -namespace ipcdetail { - -class posix_recursive_mutex -{ - posix_recursive_mutex(const posix_recursive_mutex &); - posix_recursive_mutex &operator=(const posix_recursive_mutex &); - public: - - posix_recursive_mutex(); - ~posix_recursive_mutex(); - - void lock(); - bool try_lock(); - bool timed_lock(const boost::posix_time::ptime &abs_time); - void unlock(); - - private: - pthread_mutex_t m_mut; -}; - -inline posix_recursive_mutex::posix_recursive_mutex() -{ - mutexattr_wrapper mut_attr(true); - mutex_initializer mut(m_mut, mut_attr); - mut.release(); -} - -inline posix_recursive_mutex::~posix_recursive_mutex() -{ - int res = pthread_mutex_destroy(&m_mut); - BOOST_ASSERT(res == 0);(void)res; -} - -inline void posix_recursive_mutex::lock() -{ - if (pthread_mutex_lock(&m_mut) != 0) - throw lock_exception(); -} - -inline bool posix_recursive_mutex::try_lock() -{ - int res = pthread_mutex_trylock(&m_mut); - if (!(res == 0 || res == EBUSY)) - throw lock_exception(); - return res == 0; -} - -inline bool posix_recursive_mutex::timed_lock(const boost::posix_time::ptime &abs_time) -{ - #ifdef BOOST_INTERPROCESS_POSIX_TIMEOUTS - //Posix does not support infinity absolute time so handle it here - if(abs_time == boost::posix_time::pos_infin){ - this->lock(); - return true; - } - - timespec ts = ptime_to_timespec(abs_time); - int res = pthread_mutex_timedlock(&m_mut, &ts); - if (res != 0 && res != ETIMEDOUT) - throw lock_exception(); - return res == 0; - - #else //BOOST_INTERPROCESS_POSIX_TIMEOUTS - - return ipcdetail::try_based_timed_lock(*this, abs_time); - - #endif //BOOST_INTERPROCESS_POSIX_TIMEOUTS -} - -inline void posix_recursive_mutex::unlock() -{ - int res = 0; - res = pthread_mutex_unlock(&m_mut); - BOOST_ASSERT(res == 0); (void)res; -} - -} //namespace ipcdetail { -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //#ifndef BOOST_INTERPROCESS_DETAIL_POSIX_RECURSIVE_MUTEX_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/sync/scoped_lock.hpp b/src/third_party/boost-1.56.0/boost/interprocess/sync/scoped_lock.hpp deleted file mode 100644 index 87248579bc3..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/sync/scoped_lock.hpp +++ /dev/null @@ -1,372 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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. -// -////////////////////////////////////////////////////////////////////////////// -// -// This interface is inspired by Howard Hinnant's lock proposal. -// http://home.twcny.rr.com/hinnant/cpp_extensions/threads_move.html -// -////////////////////////////////////////////////////////////////////////////// - -#ifndef BOOST_INTERPROCESS_SCOPED_LOCK_HPP -#define BOOST_INTERPROCESS_SCOPED_LOCK_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> -#include <boost/interprocess/interprocess_fwd.hpp> -#include <boost/interprocess/sync/lock_options.hpp> -#include <boost/interprocess/exceptions.hpp> -#include <boost/interprocess/detail/mpl.hpp> -#include <boost/interprocess/detail/type_traits.hpp> -#include <boost/move/move.hpp> -#include <boost/interprocess/detail/posix_time_types_wrk.hpp> - -//!\file -//!Describes the scoped_lock class. - -namespace boost { -namespace interprocess { - - -//!scoped_lock is meant to carry out the tasks for locking, unlocking, try-locking -//!and timed-locking (recursive or not) for the Mutex. The Mutex need not supply all -//!of this functionality. If the client of scoped_lock<Mutex> does not use -//!functionality which the Mutex does not supply, no harm is done. Mutex ownership -//!transfer is supported through the syntax of move semantics. Ownership transfer -//!is allowed both by construction and assignment. The scoped_lock does not support -//!copy semantics. A compile time error results if copy construction or copy -//!assignment is attempted. Mutex ownership can also be moved from an -//!upgradable_lock and sharable_lock via constructor. In this role, scoped_lock -//!shares the same functionality as a write_lock. -template <class Mutex> -class scoped_lock -{ - /// @cond - private: - typedef scoped_lock<Mutex> this_type; - BOOST_MOVABLE_BUT_NOT_COPYABLE(scoped_lock) - typedef bool this_type::*unspecified_bool_type; - /// @endcond - public: - - typedef Mutex mutex_type; - - //!Effects: Default constructs a scoped_lock. - //!Postconditions: owns() == false and mutex() == 0. - scoped_lock() - : mp_mutex(0), m_locked(false) - {} - - //!Effects: m.lock(). - //!Postconditions: owns() == true and mutex() == &m. - //!Notes: The constructor will take ownership of the mutex. If another thread - //! already owns the mutex, this thread will block until the mutex is released. - //! Whether or not this constructor handles recursive locking depends upon the mutex. - explicit scoped_lock(mutex_type& m) - : mp_mutex(&m), m_locked(false) - { mp_mutex->lock(); m_locked = true; } - - //!Postconditions: owns() == false, and mutex() == &m. - //!Notes: The constructor will not take ownership of the mutex. There is no effect - //! required on the referenced mutex. - scoped_lock(mutex_type& m, defer_lock_type) - : mp_mutex(&m), m_locked(false) - {} - - //!Postconditions: owns() == true, and mutex() == &m. - //!Notes: The constructor will suppose that the mutex is already locked. There - //! is no effect required on the referenced mutex. - scoped_lock(mutex_type& m, accept_ownership_type) - : mp_mutex(&m), m_locked(true) - {} - - //!Effects: m.try_lock(). - //!Postconditions: mutex() == &m. owns() == the return value of the - //! m.try_lock() executed within the constructor. - //!Notes: The constructor will take ownership of the mutex if it can do - //! so without waiting. Whether or not this constructor handles recursive - //! locking depends upon the mutex. If the mutex_type does not support try_lock, - //! this constructor will fail at compile time if instantiated, but otherwise - //! have no effect. - scoped_lock(mutex_type& m, try_to_lock_type) - : mp_mutex(&m), m_locked(mp_mutex->try_lock()) - {} - - //!Effects: m.timed_lock(abs_time). - //!Postconditions: mutex() == &m. owns() == the return value of the - //! m.timed_lock(abs_time) executed within the constructor. - //!Notes: The constructor will take ownership of the mutex if it can do - //! it until abs_time is reached. Whether or not this constructor - //! handles recursive locking depends upon the mutex. If the mutex_type - //! does not support try_lock, this constructor will fail at compile - //! time if instantiated, but otherwise have no effect. - scoped_lock(mutex_type& m, const boost::posix_time::ptime& abs_time) - : mp_mutex(&m), m_locked(mp_mutex->timed_lock(abs_time)) - {} - - //!Postconditions: mutex() == the value scop.mutex() had before the - //! constructor executes. s1.mutex() == 0. owns() == the value of - //! scop.owns() before the constructor executes. scop.owns(). - //!Notes: If the scop scoped_lock owns the mutex, ownership is moved - //! to thisscoped_lock with no blocking. If the scop scoped_lock does not - //! own the mutex, then neither will this scoped_lock. Only a moved - //! scoped_lock's will match this signature. An non-moved scoped_lock - //! can be moved with the expression: "boost::move(lock);". This - //! constructor does not alter the state of the mutex, only potentially - //! who owns it. - scoped_lock(BOOST_RV_REF(scoped_lock) scop) - : mp_mutex(0), m_locked(scop.owns()) - { mp_mutex = scop.release(); } - - //!Effects: If upgr.owns() then calls unlock_upgradable_and_lock() on the - //! referenced mutex. upgr.release() is called. - //!Postconditions: mutex() == the value upgr.mutex() had before the construction. - //! upgr.mutex() == 0. owns() == upgr.owns() before the construction. - //! upgr.owns() == false after the construction. - //!Notes: If upgr is locked, this constructor will lock this scoped_lock while - //! unlocking upgr. If upgr is unlocked, then this scoped_lock will be - //! unlocked as well. Only a moved upgradable_lock's will match this - //! signature. An non-moved upgradable_lock can be moved with - //! the expression: "boost::move(lock);" This constructor may block if - //! other threads hold a sharable_lock on this mutex (sharable_lock's can - //! share ownership with an upgradable_lock). - template<class T> - explicit scoped_lock(BOOST_RV_REF(upgradable_lock<T>) upgr - , typename ipcdetail::enable_if< ipcdetail::is_same<T, Mutex> >::type * = 0) - : mp_mutex(0), m_locked(false) - { - upgradable_lock<mutex_type> &u_lock = upgr; - if(u_lock.owns()){ - u_lock.mutex()->unlock_upgradable_and_lock(); - m_locked = true; - } - mp_mutex = u_lock.release(); - } - - //!Effects: If upgr.owns() then calls try_unlock_upgradable_and_lock() on the - //!referenced mutex: - //! a)if try_unlock_upgradable_and_lock() returns true then mutex() obtains - //! the value from upgr.release() and owns() is set to true. - //! b)if try_unlock_upgradable_and_lock() returns false then upgr is - //! unaffected and this scoped_lock construction as the same effects as - //! a default construction. - //! c)Else upgr.owns() is false. mutex() obtains the value from upgr.release() - //! and owns() is set to false - //!Notes: This construction will not block. It will try to obtain mutex - //! ownership from upgr immediately, while changing the lock type from a - //! "read lock" to a "write lock". If the "read lock" isn't held in the - //! first place, the mutex merely changes type to an unlocked "write lock". - //! If the "read lock" is held, then mutex transfer occurs only if it can - //! do so in a non-blocking manner. - template<class T> - scoped_lock(BOOST_RV_REF(upgradable_lock<T>) upgr, try_to_lock_type - , typename ipcdetail::enable_if< ipcdetail::is_same<T, Mutex> >::type * = 0) - : mp_mutex(0), m_locked(false) - { - upgradable_lock<mutex_type> &u_lock = upgr; - if(u_lock.owns()){ - if((m_locked = u_lock.mutex()->try_unlock_upgradable_and_lock()) == true){ - mp_mutex = u_lock.release(); - } - } - else{ - u_lock.release(); - } - } - - //!Effects: If upgr.owns() then calls timed_unlock_upgradable_and_lock(abs_time) - //! on the referenced mutex: - //! a)if timed_unlock_upgradable_and_lock(abs_time) returns true then mutex() - //! obtains the value from upgr.release() and owns() is set to true. - //! b)if timed_unlock_upgradable_and_lock(abs_time) returns false then upgr - //! is unaffected and this scoped_lock construction as the same effects - //! as a default construction. - //! c)Else upgr.owns() is false. mutex() obtains the value from upgr.release() - //! and owns() is set to false - //!Notes: This construction will not block. It will try to obtain mutex ownership - //! from upgr immediately, while changing the lock type from a "read lock" to a - //! "write lock". If the "read lock" isn't held in the first place, the mutex - //! merely changes type to an unlocked "write lock". If the "read lock" is held, - //! then mutex transfer occurs only if it can do so in a non-blocking manner. - template<class T> - scoped_lock(BOOST_RV_REF(upgradable_lock<T>) upgr, boost::posix_time::ptime &abs_time - , typename ipcdetail::enable_if< ipcdetail::is_same<T, Mutex> >::type * = 0) - : mp_mutex(0), m_locked(false) - { - upgradable_lock<mutex_type> &u_lock = upgr; - if(u_lock.owns()){ - if((m_locked = u_lock.mutex()->timed_unlock_upgradable_and_lock(abs_time)) == true){ - mp_mutex = u_lock.release(); - } - } - else{ - u_lock.release(); - } - } - - //!Effects: If shar.owns() then calls try_unlock_sharable_and_lock() on the - //!referenced mutex. - //! a)if try_unlock_sharable_and_lock() returns true then mutex() obtains - //! the value from shar.release() and owns() is set to true. - //! b)if try_unlock_sharable_and_lock() returns false then shar is - //! unaffected and this scoped_lock construction has the same - //! effects as a default construction. - //! c)Else shar.owns() is false. mutex() obtains the value from - //! shar.release() and owns() is set to false - //!Notes: This construction will not block. It will try to obtain mutex - //! ownership from shar immediately, while changing the lock type from a - //! "read lock" to a "write lock". If the "read lock" isn't held in the - //! first place, the mutex merely changes type to an unlocked "write lock". - //! If the "read lock" is held, then mutex transfer occurs only if it can - //! do so in a non-blocking manner. - template<class T> - scoped_lock(BOOST_RV_REF(sharable_lock<T>) shar, try_to_lock_type - , typename ipcdetail::enable_if< ipcdetail::is_same<T, Mutex> >::type * = 0) - : mp_mutex(0), m_locked(false) - { - sharable_lock<mutex_type> &s_lock = shar; - if(s_lock.owns()){ - if((m_locked = s_lock.mutex()->try_unlock_sharable_and_lock()) == true){ - mp_mutex = s_lock.release(); - } - } - else{ - s_lock.release(); - } - } - - //!Effects: if (owns()) mp_mutex->unlock(). - //!Notes: The destructor behavior ensures that the mutex lock is not leaked.*/ - ~scoped_lock() - { - try{ if(m_locked && mp_mutex) mp_mutex->unlock(); } - catch(...){} - } - - //!Effects: If owns() before the call, then unlock() is called on mutex(). - //! *this gets the state of scop and scop gets set to a default constructed state. - //!Notes: With a recursive mutex it is possible that both this and scop own - //! the same mutex before the assignment. In this case, this will own the - //! mutex after the assignment (and scop will not), but the mutex's lock - //! count will be decremented by one. - scoped_lock &operator=(BOOST_RV_REF(scoped_lock) scop) - { - if(this->owns()) - this->unlock(); - m_locked = scop.owns(); - mp_mutex = scop.release(); - return *this; - } - - //!Effects: If mutex() == 0 or if already locked, throws a lock_exception() - //! exception. Calls lock() on the referenced mutex. - //!Postconditions: owns() == true. - //!Notes: The scoped_lock changes from a state of not owning the mutex, to - //! owning the mutex, blocking if necessary. - void lock() - { - if(!mp_mutex || m_locked) - throw lock_exception(); - mp_mutex->lock(); - m_locked = true; - } - - //!Effects: If mutex() == 0 or if already locked, throws a lock_exception() - //! exception. Calls try_lock() on the referenced mutex. - //!Postconditions: owns() == the value returned from mutex()->try_lock(). - //!Notes: The scoped_lock changes from a state of not owning the mutex, to - //! owning the mutex, but only if blocking was not required. If the - //! mutex_type does not support try_lock(), this function will fail at - //! compile time if instantiated, but otherwise have no effect.*/ - bool try_lock() - { - if(!mp_mutex || m_locked) - throw lock_exception(); - m_locked = mp_mutex->try_lock(); - return m_locked; - } - - //!Effects: If mutex() == 0 or if already locked, throws a lock_exception() - //! exception. Calls timed_lock(abs_time) on the referenced mutex. - //!Postconditions: owns() == the value returned from mutex()-> timed_lock(abs_time). - //!Notes: The scoped_lock changes from a state of not owning the mutex, to - //! owning the mutex, but only if it can obtain ownership by the specified - //! time. If the mutex_type does not support timed_lock (), this function - //! will fail at compile time if instantiated, but otherwise have no effect.*/ - bool timed_lock(const boost::posix_time::ptime& abs_time) - { - if(!mp_mutex || m_locked) - throw lock_exception(); - m_locked = mp_mutex->timed_lock(abs_time); - return m_locked; - } - - //!Effects: If mutex() == 0 or if not locked, throws a lock_exception() - //! exception. Calls unlock() on the referenced mutex. - //!Postconditions: owns() == false. - //!Notes: The scoped_lock changes from a state of owning the mutex, to not - //! owning the mutex.*/ - void unlock() - { - if(!mp_mutex || !m_locked) - throw lock_exception(); - mp_mutex->unlock(); - m_locked = false; - } - - //!Effects: Returns true if this scoped_lock has acquired - //!the referenced mutex. - bool owns() const - { return m_locked && mp_mutex; } - - //!Conversion to bool. - //!Returns owns(). - operator unspecified_bool_type() const - { return m_locked? &this_type::m_locked : 0; } - - //!Effects: Returns a pointer to the referenced mutex, or 0 if - //!there is no mutex to reference. - mutex_type* mutex() const - { return mp_mutex; } - - //!Effects: Returns a pointer to the referenced mutex, or 0 if there is no - //! mutex to reference. - //!Postconditions: mutex() == 0 and owns() == false. - mutex_type* release() - { - mutex_type *mut = mp_mutex; - mp_mutex = 0; - m_locked = false; - return mut; - } - - //!Effects: Swaps state with moved lock. - //!Throws: Nothing. - void swap( scoped_lock<mutex_type> &other) - { - std::swap(mp_mutex, other.mp_mutex); - std::swap(m_locked, other.m_locked); - } - - /// @cond - private: - mutex_type *mp_mutex; - bool m_locked; - /// @endcond -}; - -} // namespace interprocess -} // namespace boost - -#include <boost/interprocess/detail/config_end.hpp> - -#endif // BOOST_INTERPROCESS_SCOPED_LOCK_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/sync/spin/mutex.hpp b/src/third_party/boost-1.56.0/boost/interprocess/sync/spin/mutex.hpp deleted file mode 100644 index 154dc6d9164..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/sync/spin/mutex.hpp +++ /dev/null @@ -1,83 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_DETAIL_SPIN_MUTEX_HPP -#define BOOST_INTERPROCESS_DETAIL_SPIN_MUTEX_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> -#include <boost/interprocess/detail/posix_time_types_wrk.hpp> -#include <boost/assert.hpp> -#include <boost/interprocess/detail/atomic.hpp> -#include <boost/cstdint.hpp> -#include <boost/interprocess/detail/os_thread_functions.hpp> -#include <boost/interprocess/sync/detail/common_algorithms.hpp> - -namespace boost { -namespace interprocess { -namespace ipcdetail { - -class spin_mutex -{ - spin_mutex(const spin_mutex &); - spin_mutex &operator=(const spin_mutex &); - public: - - spin_mutex(); - ~spin_mutex(); - - void lock(); - bool try_lock(); - bool timed_lock(const boost::posix_time::ptime &abs_time); - void unlock(); - void take_ownership(){}; - private: - volatile boost::uint32_t m_s; -}; - -inline spin_mutex::spin_mutex() - : m_s(0) -{ - //Note that this class is initialized to zero. - //So zeroed memory can be interpreted as an - //initialized mutex -} - -inline spin_mutex::~spin_mutex() -{ - //Trivial destructor -} - -inline void spin_mutex::lock(void) -{ return ipcdetail::try_based_lock(*this); } - -inline bool spin_mutex::try_lock(void) -{ - boost::uint32_t prev_s = ipcdetail::atomic_cas32(const_cast<boost::uint32_t*>(&m_s), 1, 0); - return m_s == 1 && prev_s == 0; -} - -inline bool spin_mutex::timed_lock(const boost::posix_time::ptime &abs_time) -{ return ipcdetail::try_based_timed_lock(*this, abs_time); } - -inline void spin_mutex::unlock(void) -{ ipcdetail::atomic_cas32(const_cast<boost::uint32_t*>(&m_s), 0, 1); } - -} //namespace ipcdetail { -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //BOOST_INTERPROCESS_DETAIL_SPIN_MUTEX_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/sync/spin/recursive_mutex.hpp b/src/third_party/boost-1.56.0/boost/interprocess/sync/spin/recursive_mutex.hpp deleted file mode 100644 index ce6b0d18ac2..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/sync/spin/recursive_mutex.hpp +++ /dev/null @@ -1,172 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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. -// -////////////////////////////////////////////////////////////////////////////// -// -// Parts of the pthread code come from Boost Threads code: -// -////////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) 2001-2003 -// William E. Kempf -// -// Permission to use, copy, modify, distribute and sell this software -// and its documentation for any purpose is hereby granted without fee, -// provided that the above copyright notice appear in all copies and -// that both that copyright notice and this permission notice appear -// in supporting documentation. William E. Kempf makes no representations -// about the suitability of this software for any purpose. -// It is provided "as is" without express or implied warranty. -////////////////////////////////////////////////////////////////////////////// - -#ifndef BOOST_INTERPROCESS_DETAIL_SPIN_RECURSIVE_MUTEX_HPP -#define BOOST_INTERPROCESS_DETAIL_SPIN_RECURSIVE_MUTEX_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> - -#include <boost/interprocess/detail/posix_time_types_wrk.hpp> -#include <boost/interprocess/detail/os_thread_functions.hpp> -#include <boost/interprocess/exceptions.hpp> -#include <boost/interprocess/detail/atomic.hpp> -#include <boost/cstdint.hpp> -#include <boost/interprocess/detail/os_thread_functions.hpp> -#include <boost/interprocess/sync/spin/mutex.hpp> -#include <boost/assert.hpp> - -namespace boost { -namespace interprocess { -namespace ipcdetail { - -class spin_recursive_mutex -{ - spin_recursive_mutex(const spin_recursive_mutex &); - spin_recursive_mutex &operator=(const spin_recursive_mutex &); - public: - - spin_recursive_mutex(); - ~spin_recursive_mutex(); - - void lock(); - bool try_lock(); - bool timed_lock(const boost::posix_time::ptime &abs_time); - void unlock(); - void take_ownership(); - private: - spin_mutex m_mutex; - unsigned int m_nLockCount; - volatile ipcdetail::OS_systemwide_thread_id_t m_nOwner; - volatile boost::uint32_t m_s; -}; - -inline spin_recursive_mutex::spin_recursive_mutex() - : m_nLockCount(0), m_nOwner(ipcdetail::get_invalid_systemwide_thread_id()){} - -inline spin_recursive_mutex::~spin_recursive_mutex(){} - -inline void spin_recursive_mutex::lock() -{ - typedef ipcdetail::OS_systemwide_thread_id_t handle_t; - const handle_t thr_id(ipcdetail::get_current_systemwide_thread_id()); - handle_t old_id; - ipcdetail::systemwide_thread_id_copy(m_nOwner, old_id); - if(ipcdetail::equal_systemwide_thread_id(thr_id , old_id)){ - if((unsigned int)(m_nLockCount+1) == 0){ - //Overflow, throw an exception - throw interprocess_exception("boost::interprocess::spin_recursive_mutex recursive lock overflow"); - } - ++m_nLockCount; - } - else{ - m_mutex.lock(); - ipcdetail::systemwide_thread_id_copy(thr_id, m_nOwner); - m_nLockCount = 1; - } -} - -inline bool spin_recursive_mutex::try_lock() -{ - typedef ipcdetail::OS_systemwide_thread_id_t handle_t; - handle_t thr_id(ipcdetail::get_current_systemwide_thread_id()); - handle_t old_id; - ipcdetail::systemwide_thread_id_copy(m_nOwner, old_id); - if(ipcdetail::equal_systemwide_thread_id(thr_id , old_id)) { // we own it - if((unsigned int)(m_nLockCount+1) == 0){ - //Overflow, throw an exception - throw interprocess_exception("boost::interprocess::spin_recursive_mutex recursive lock overflow"); - } - ++m_nLockCount; - return true; - } - if(m_mutex.try_lock()){ - ipcdetail::systemwide_thread_id_copy(thr_id, m_nOwner); - m_nLockCount = 1; - return true; - } - return false; -} - -inline bool spin_recursive_mutex::timed_lock(const boost::posix_time::ptime &abs_time) -{ - typedef ipcdetail::OS_systemwide_thread_id_t handle_t; - const handle_t thr_id(ipcdetail::get_current_systemwide_thread_id()); - handle_t old_id; - ipcdetail::systemwide_thread_id_copy(m_nOwner, old_id); - if(ipcdetail::equal_systemwide_thread_id(thr_id , old_id)) { // we own it - if((unsigned int)(m_nLockCount+1) == 0){ - //Overflow, throw an exception - throw interprocess_exception("boost::interprocess::spin_recursive_mutex recursive lock overflow"); - } - ++m_nLockCount; - return true; - } - //m_mutex supports abs_time so no need to check it - if(m_mutex.timed_lock(abs_time)){ - ipcdetail::systemwide_thread_id_copy(thr_id, m_nOwner); - m_nLockCount = 1; - return true; - } - return false; -} - -inline void spin_recursive_mutex::unlock() -{ - typedef ipcdetail::OS_systemwide_thread_id_t handle_t; - handle_t old_id; - ipcdetail::systemwide_thread_id_copy(m_nOwner, old_id); - const handle_t thr_id(ipcdetail::get_current_systemwide_thread_id()); - (void)old_id; - (void)thr_id; - BOOST_ASSERT(ipcdetail::equal_systemwide_thread_id(thr_id, old_id)); - --m_nLockCount; - if(!m_nLockCount){ - const handle_t new_id(ipcdetail::get_invalid_systemwide_thread_id()); - ipcdetail::systemwide_thread_id_copy(new_id, m_nOwner); - m_mutex.unlock(); - } -} - -inline void spin_recursive_mutex::take_ownership() -{ - typedef ipcdetail::OS_systemwide_thread_id_t handle_t; - this->m_nLockCount = 1; - const handle_t thr_id(ipcdetail::get_current_systemwide_thread_id()); - ipcdetail::systemwide_thread_id_copy(thr_id, m_nOwner); -} - -} //namespace ipcdetail { -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //BOOST_INTERPROCESS_DETAIL_SPIN_RECURSIVE_MUTEX_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/sync/spin/wait.hpp b/src/third_party/boost-1.56.0/boost/interprocess/sync/spin/wait.hpp deleted file mode 100644 index 220699bae16..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/sync/spin/wait.hpp +++ /dev/null @@ -1,181 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Peter Dimov 2008. -// (C) Copyright Ion Gaztanaga 2013-2013. 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. -// -////////////////////////////////////////////////////////////////////////////// - -//Parts of this file come from boost/smart_ptr/detail/yield_k.hpp -//Many thanks to Peter Dimov. - -#ifndef BOOST_INTERPROCESS_SYNC_WAIT_HPP_INCLUDED -#define BOOST_INTERPROCESS_SYNC_WAIT_HPP_INCLUDED - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> -#include <boost/interprocess/detail/os_thread_functions.hpp> - -//#define BOOST_INTERPROCESS_SPIN_WAIT_DEBUG -#ifdef BOOST_INTERPROCESS_SPIN_WAIT_DEBUG -#include <iostream> -#endif - -// BOOST_INTERPROCESS_SMT_PAUSE - -#if defined(_MSC_VER) && ( defined(_M_IX86) || defined(_M_X64) ) - -extern "C" void _mm_pause(); -#pragma intrinsic( _mm_pause ) - -#define BOOST_INTERPROCESS_SMT_PAUSE _mm_pause(); - -#elif defined(__GNUC__) && ( defined(__i386__) || defined(__x86_64__) ) && !defined(_CRAYC) - -#define BOOST_INTERPROCESS_SMT_PAUSE __asm__ __volatile__( "rep; nop" : : : "memory" ); - -#endif - -namespace boost{ -namespace interprocess{ -namespace ipcdetail { - -template<int Dummy = 0> -class num_core_holder -{ - public: - static unsigned int get() - { - if(!num_cores){ - return ipcdetail::get_num_cores(); - } - else{ - return num_cores; - } - } - - private: - static unsigned int num_cores; -}; - -template<int Dummy> -unsigned int num_core_holder<Dummy>::num_cores = ipcdetail::get_num_cores(); - -} //namespace ipcdetail { - -class spin_wait -{ - public: - - static const unsigned int nop_pause_limit = 32u; - spin_wait() - : m_count_start(), m_ul_yield_only_counts(), m_k() - {} - - #ifdef BOOST_INTERPROCESS_SPIN_WAIT_DEBUG - ~spin_wait() - { - if(m_k){ - std::cout << "final m_k: " << m_k - << " system tick(us): " << ipcdetail::get_system_tick_us() << std::endl; - } - } - #endif - - unsigned int count() const - { return m_k; } - - void yield() - { - //Lazy initialization of limits - if( !m_k){ - this->init_limits(); - } - //Nop tries - if( m_k < (nop_pause_limit >> 2) ){ - - } - //Pause tries if the processor supports it - #if defined(BOOST_INTERPROCESS_SMT_PAUSE) - else if( m_k < nop_pause_limit ){ - BOOST_INTERPROCESS_SMT_PAUSE - } - #endif - //Yield/Sleep strategy - else{ - //Lazy initialization of tick information - if(m_k == nop_pause_limit){ - this->init_tick_info(); - } - else if( this->yield_or_sleep() ){ - ipcdetail::thread_yield(); - } - else{ - ipcdetail::thread_sleep_tick(); - } - } - ++m_k; - } - - void reset() - { - m_k = 0u; - } - - private: - - void init_limits() - { - unsigned int num_cores = ipcdetail::num_core_holder<0>::get(); - m_k = num_cores > 1u ? 0u : nop_pause_limit; - } - - void init_tick_info() - { - m_ul_yield_only_counts = ipcdetail::get_system_tick_in_highres_counts(); - m_count_start = ipcdetail::get_current_system_highres_count(); - } - - //Returns true if yield must be called, false is sleep must be called - bool yield_or_sleep() - { - if(!m_ul_yield_only_counts){ //If yield-only limit was reached then yield one in every two tries - return (m_k & 1u) != 0; - } - else{ //Try to see if we've reched yield-only time limit - const ipcdetail::OS_highres_count_t now = ipcdetail::get_current_system_highres_count(); - const ipcdetail::OS_highres_count_t elapsed = ipcdetail::system_highres_count_subtract(now, m_count_start); - if(!ipcdetail::system_highres_count_less_ul(elapsed, m_ul_yield_only_counts)){ - #ifdef BOOST_INTERPROCESS_SPIN_WAIT_DEBUG - std::cout << "elapsed!\n" - << " m_ul_yield_only_counts: " << m_ul_yield_only_counts - << " system tick(us): " << ipcdetail::get_system_tick_us() << '\n' - << " m_k: " << m_k << " elapsed counts: "; - ipcdetail::ostream_highres_count(std::cout, elapsed) << std::endl; - #endif - //Yield-only time reached, now it's time to sleep - m_ul_yield_only_counts = 0ul; - return false; - } - } - return true; //Otherwise yield - } - - ipcdetail::OS_highres_count_t m_count_start; - unsigned long m_ul_yield_only_counts; - unsigned int m_k; -}; - -} // namespace interprocess -} // namespace boost - -#include <boost/interprocess/detail/config_end.hpp> - -#endif // #ifndef BOOST_INTERPROCESS_SYNC_WAIT_HPP_INCLUDED diff --git a/src/third_party/boost-1.56.0/boost/interprocess/sync/windows/mutex.hpp b/src/third_party/boost-1.56.0/boost/interprocess/sync/windows/mutex.hpp deleted file mode 100644 index 0b1958cfb79..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/sync/windows/mutex.hpp +++ /dev/null @@ -1,114 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_DETAIL_WINDOWS_MUTEX_HPP -#define BOOST_INTERPROCESS_DETAIL_WINDOWS_MUTEX_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> -#include <boost/interprocess/detail/posix_time_types_wrk.hpp> -#include <boost/interprocess/detail/win32_api.hpp> -#include <boost/interprocess/detail/windows_intermodule_singleton.hpp> -#include <boost/interprocess/sync/windows/sync_utils.hpp> -#include <boost/interprocess/sync/windows/winapi_mutex_wrapper.hpp> -#include <boost/interprocess/exceptions.hpp> - - -namespace boost { -namespace interprocess { -namespace ipcdetail { - -class windows_mutex -{ - windows_mutex(const windows_mutex &); - windows_mutex &operator=(const windows_mutex &); - public: - - windows_mutex(); - ~windows_mutex(); - - void lock(); - bool try_lock(); - bool timed_lock(const boost::posix_time::ptime &abs_time); - void unlock(); - void take_ownership(){}; - - private: - const sync_id id_; -}; - -inline windows_mutex::windows_mutex() - : id_(this) -{ - sync_handles &handles = - windows_intermodule_singleton<sync_handles>::get(); - //Create mutex with the initial count - bool open_or_created; - (void)handles.obtain_mutex(this->id_, &open_or_created); - //The mutex must be created, never opened - BOOST_ASSERT(open_or_created); - BOOST_ASSERT(open_or_created && winapi::get_last_error() != winapi::error_already_exists); - (void)open_or_created; -} - -inline windows_mutex::~windows_mutex() -{ - sync_handles &handles = - windows_intermodule_singleton<sync_handles>::get(); - handles.destroy_handle(this->id_); -} - -inline void windows_mutex::lock(void) -{ - sync_handles &handles = - windows_intermodule_singleton<sync_handles>::get(); - //This can throw - winapi_mutex_functions mut(handles.obtain_mutex(this->id_)); - mut.lock(); -} - -inline bool windows_mutex::try_lock(void) -{ - sync_handles &handles = - windows_intermodule_singleton<sync_handles>::get(); - //This can throw - winapi_mutex_functions mut(handles.obtain_mutex(this->id_)); - return mut.try_lock(); -} - -inline bool windows_mutex::timed_lock(const boost::posix_time::ptime &abs_time) -{ - sync_handles &handles = - windows_intermodule_singleton<sync_handles>::get(); - //This can throw - winapi_mutex_functions mut(handles.obtain_mutex(this->id_)); - return mut.timed_lock(abs_time); -} - -inline void windows_mutex::unlock(void) -{ - sync_handles &handles = - windows_intermodule_singleton<sync_handles>::get(); - //This can throw - winapi_mutex_functions mut(handles.obtain_mutex(this->id_)); - return mut.unlock(); -} - -} //namespace ipcdetail { -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //BOOST_INTERPROCESS_DETAIL_WINDOWS_MUTEX_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/sync/windows/recursive_mutex.hpp b/src/third_party/boost-1.56.0/boost/interprocess/sync/windows/recursive_mutex.hpp deleted file mode 100644 index 55a838583b5..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/sync/windows/recursive_mutex.hpp +++ /dev/null @@ -1,43 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_DETAIL_WINDOWS_RECURSIVE_MUTEX_HPP -#define BOOST_INTERPROCESS_DETAIL_WINDOWS_RECURSIVE_MUTEX_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> -#include <boost/interprocess/sync/windows/mutex.hpp> - -namespace boost { -namespace interprocess { -namespace ipcdetail { - -//Windows mutex is already recursive -class windows_recursive_mutex - : public windows_mutex -{ - windows_recursive_mutex(const windows_recursive_mutex &); - windows_recursive_mutex &operator=(const windows_recursive_mutex &); - public: - windows_recursive_mutex() : windows_mutex() {} -}; - -} //namespace ipcdetail { -} //namespace interprocess { -} //namespace boost { - - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //BOOST_INTERPROCESS_DETAIL_WINDOWS_RECURSIVE_MUTEX_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/sync/windows/sync_utils.hpp b/src/third_party/boost-1.56.0/boost/interprocess/sync/windows/sync_utils.hpp deleted file mode 100644 index 7e54cc36b2e..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/sync/windows/sync_utils.hpp +++ /dev/null @@ -1,236 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2005-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_DETAIL_SYNC_UTILS_HPP -#define BOOST_INTERPROCESS_DETAIL_SYNC_UTILS_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> -#include <boost/interprocess/detail/win32_api.hpp> -#include <boost/interprocess/sync/spin/mutex.hpp> -#include <boost/interprocess/exceptions.hpp> -#include <boost/interprocess/sync/scoped_lock.hpp> -#include <boost/interprocess/sync/windows/winapi_semaphore_wrapper.hpp> -#include <boost/interprocess/sync/windows/winapi_mutex_wrapper.hpp> - -//Shield against external warnings -#include <boost/interprocess/detail/config_external_begin.hpp> - #include <boost/unordered/unordered_map.hpp> -#include <boost/interprocess/detail/config_external_end.hpp> - - -#include <boost/container/map.hpp> -#include <cstddef> - -namespace boost { -namespace interprocess { -namespace ipcdetail { - -inline bool bytes_to_str(const void *mem, const std::size_t mem_length, char *out_str, std::size_t &out_length) -{ - const std::size_t need_mem = mem_length*2+1; - if(out_length < need_mem){ - out_length = need_mem; - return false; - } - - const char Characters [] = - { '0', '1', '2', '3', '4', '5', '6', '7' - , '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; - - std::size_t char_counter = 0; - const char *buf = (const char *)mem; - for(std::size_t i = 0; i != mem_length; ++i){ - out_str[char_counter++] = Characters[(buf[i]&0xF0)>>4]; - out_str[char_counter++] = Characters[(buf[i]&0x0F)]; - } - out_str[char_counter] = 0; - return true; -} - -class sync_id -{ - public: - typedef __int64 internal_type; - sync_id(const void *map_addr) - : map_addr_(map_addr) - { winapi::query_performance_counter(&rand_); } - - explicit sync_id(internal_type val, const void *map_addr) - : map_addr_(map_addr) - { rand_ = val; } - - const internal_type &internal_pod() const - { return rand_; } - - internal_type &internal_pod() - { return rand_; } - - const void *map_address() const - { return map_addr_; } - - friend std::size_t hash_value(const sync_id &m) - { return boost::hash_value(m.rand_); } - - friend bool operator==(const sync_id &l, const sync_id &r) - { return l.rand_ == r.rand_ && l.map_addr_ == r.map_addr_; } - - private: - internal_type rand_; - const void * const map_addr_; -}; - -class sync_handles -{ - public: - enum type { MUTEX, SEMAPHORE }; - - private: - struct address_less - { - bool operator()(sync_id const * const l, sync_id const * const r) const - { return l->map_address() < r->map_address(); } - }; - - typedef boost::unordered_map<sync_id, void*> umap_type; - typedef boost::container::map<const sync_id*, umap_type::iterator, address_less> map_type; - static const std::size_t LengthOfGlobal = sizeof("Global\\boost.ipc")-1; - static const std::size_t StrSize = LengthOfGlobal + (sizeof(sync_id)*2+1); - typedef char NameBuf[StrSize]; - - - void fill_name(NameBuf &name, const sync_id &id) - { - const char *n = "Global\\boost.ipc"; - std::size_t i = 0; - do{ - name[i] = n[i]; - ++i; - } while(n[i]); - std::size_t len = sizeof(NameBuf) - LengthOfGlobal; - bytes_to_str(&id.internal_pod(), sizeof(id.internal_pod()), &name[LengthOfGlobal], len); - } - - void throw_if_error(void *hnd_val) - { - if(!hnd_val){ - error_info err(winapi::get_last_error()); - throw interprocess_exception(err); - } - } - - void* open_or_create_semaphore(const sync_id &id, unsigned int initial_count) - { - NameBuf name; - fill_name(name, id); - permissions unrestricted_security; - unrestricted_security.set_unrestricted(); - winapi_semaphore_wrapper sem_wrapper; - bool created; - sem_wrapper.open_or_create - (name, (long)initial_count, winapi_semaphore_wrapper::MaxCount, unrestricted_security, created); - throw_if_error(sem_wrapper.handle()); - return sem_wrapper.release(); - } - - void* open_or_create_mutex(const sync_id &id) - { - NameBuf name; - fill_name(name, id); - permissions unrestricted_security; - unrestricted_security.set_unrestricted(); - winapi_mutex_wrapper mtx_wrapper; - mtx_wrapper.open_or_create(name, unrestricted_security); - throw_if_error(mtx_wrapper.handle()); - return mtx_wrapper.release(); - } - - public: - void *obtain_mutex(const sync_id &id, bool *popen_created = 0) - { - umap_type::value_type v(id, (void*)0); - scoped_lock<spin_mutex> lock(mtx_); - umap_type::iterator it = umap_.insert(v).first; - void *&hnd_val = it->second; - if(!hnd_val){ - map_[&it->first] = it; - hnd_val = open_or_create_mutex(id); - if(popen_created) *popen_created = true; - } - else if(popen_created){ - *popen_created = false; - } - return hnd_val; - } - - void *obtain_semaphore(const sync_id &id, unsigned int initial_count, bool *popen_created = 0) - { - umap_type::value_type v(id, (void*)0); - scoped_lock<spin_mutex> lock(mtx_); - umap_type::iterator it = umap_.insert(v).first; - void *&hnd_val = it->second; - if(!hnd_val){ - map_[&it->first] = it; - hnd_val = open_or_create_semaphore(id, initial_count); - if(popen_created) *popen_created = true; - } - else if(popen_created){ - *popen_created = false; - } - return hnd_val; - } - - void destroy_handle(const sync_id &id) - { - scoped_lock<spin_mutex> lock(mtx_); - umap_type::iterator it = umap_.find(id); - umap_type::iterator itend = umap_.end(); - - if(it != itend){ - winapi::close_handle(it->second); - const map_type::key_type &k = &it->first; - map_.erase(k); - umap_.erase(it); - } - } - - void destroy_syncs_in_range(const void *addr, std::size_t size) - { - const sync_id low_id(addr); - const sync_id hig_id(static_cast<const char*>(addr)+size); - scoped_lock<spin_mutex> lock(mtx_); - map_type::iterator itlow(map_.lower_bound(&low_id)), - ithig(map_.lower_bound(&hig_id)); - while(itlow != ithig){ - void * const hnd = umap_[*itlow->first]; - winapi::close_handle(hnd); - umap_.erase(*itlow->first); - itlow = map_.erase(itlow); - } - } - - private: - spin_mutex mtx_; - umap_type umap_; - map_type map_; -}; - - -} //namespace ipcdetail { -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //BOOST_INTERPROCESS_DETAIL_SYNC_UTILS_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/sync/windows/winapi_mutex_wrapper.hpp b/src/third_party/boost-1.56.0/boost/interprocess/sync/windows/winapi_mutex_wrapper.hpp deleted file mode 100644 index 5a4469bfa0d..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/sync/windows/winapi_mutex_wrapper.hpp +++ /dev/null @@ -1,130 +0,0 @@ - ////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2011-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_DETAIL_WINAPI_MUTEX_WRAPPER_HPP -#define BOOST_INTERPROCESS_DETAIL_WINAPI_MUTEX_WRAPPER_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> -#include <boost/interprocess/creation_tags.hpp> -#include <boost/interprocess/permissions.hpp> -#include <boost/interprocess/detail/win32_api.hpp> -#include <boost/interprocess/detail/posix_time_types_wrk.hpp> -#include <boost/interprocess/sync/windows/winapi_wrapper_common.hpp> -#include <boost/interprocess/errors.hpp> -#include <boost/interprocess/exceptions.hpp> -#include <limits> - -namespace boost { -namespace interprocess { -namespace ipcdetail { - -class winapi_mutex_functions -{ - /// @cond - - //Non-copyable - winapi_mutex_functions(const winapi_mutex_functions &); - winapi_mutex_functions &operator=(const winapi_mutex_functions &); - /// @endcond - - public: - winapi_mutex_functions(void *mtx_hnd) - : m_mtx_hnd(mtx_hnd) - {} - - void unlock() - { winapi::release_mutex(m_mtx_hnd); } - - void lock() - { return winapi_wrapper_wait_for_single_object(m_mtx_hnd); } - - bool try_lock() - { return winapi_wrapper_try_wait_for_single_object(m_mtx_hnd); } - - bool timed_lock(const boost::posix_time::ptime &abs_time) - { return winapi_wrapper_timed_wait_for_single_object(m_mtx_hnd, abs_time); } - - /// @cond - protected: - void *m_mtx_hnd; - /// @endcond -}; - -//Swappable mutex wrapper -class winapi_mutex_wrapper - : public winapi_mutex_functions -{ - /// @cond - - //Non-copyable - winapi_mutex_wrapper(const winapi_mutex_wrapper &); - winapi_mutex_wrapper &operator=(const winapi_mutex_wrapper &); - /// @endcond - - //Note that Windows API does not return winapi::invalid_handle_value - //when failing to create/open a mutex, but a nullptr - - public: - winapi_mutex_wrapper(void *mtx_hnd = 0) - : winapi_mutex_functions(mtx_hnd) - {} - - ~winapi_mutex_wrapper() - { this->close(); } - - void *release() - { - void *hnd = m_mtx_hnd; - m_mtx_hnd = 0; - return hnd; - } - - void *handle() const - { return m_mtx_hnd; } - - bool open_or_create(const char *name, const permissions &perm) - { - if(m_mtx_hnd == 0){ - m_mtx_hnd = winapi::open_or_create_mutex - ( name - , false - , (winapi::interprocess_security_attributes*)perm.get_permissions() - ); - return m_mtx_hnd != 0; - } - else{ - return false; - } - } - - void close() - { - if(m_mtx_hnd != 0){ - winapi::close_handle(m_mtx_hnd); - m_mtx_hnd = 0; - } - } - - void swap(winapi_mutex_wrapper &other) - { void *tmp = m_mtx_hnd; m_mtx_hnd = other.m_mtx_hnd; other.m_mtx_hnd = tmp; } -}; - -} //namespace ipcdetail { -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //BOOST_INTERPROCESS_DETAIL_WINAPI_MUTEX_WRAPPER_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/sync/windows/winapi_semaphore_wrapper.hpp b/src/third_party/boost-1.56.0/boost/interprocess/sync/windows/winapi_semaphore_wrapper.hpp deleted file mode 100644 index 721acf91e5c..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/sync/windows/winapi_semaphore_wrapper.hpp +++ /dev/null @@ -1,164 +0,0 @@ - ////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2011-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_DETAIL_WINAPI_SEMAPHORE_WRAPPER_HPP -#define BOOST_INTERPROCESS_DETAIL_WINAPI_SEMAPHORE_WRAPPER_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> -#include <boost/interprocess/creation_tags.hpp> -#include <boost/interprocess/permissions.hpp> -#include <boost/interprocess/detail/win32_api.hpp> -#include <boost/interprocess/detail/posix_time_types_wrk.hpp> -#include <boost/interprocess/sync/windows/winapi_wrapper_common.hpp> -#include <boost/interprocess/errors.hpp> -#include <boost/interprocess/exceptions.hpp> -#include <limits> - -namespace boost { -namespace interprocess { -namespace ipcdetail { - -class winapi_semaphore_functions -{ - /// @cond - - //Non-copyable - winapi_semaphore_functions(const winapi_semaphore_functions &); - winapi_semaphore_functions &operator=(const winapi_semaphore_functions &); - /// @endcond - - public: - winapi_semaphore_functions(void *hnd) - : m_sem_hnd(hnd) - {} - - void post(long count = 1) - { - long prev_count; - winapi::release_semaphore(m_sem_hnd, count, &prev_count); - } - - void wait() - { return winapi_wrapper_wait_for_single_object(m_sem_hnd); } - - bool try_wait() - { return winapi_wrapper_try_wait_for_single_object(m_sem_hnd); } - - bool timed_wait(const boost::posix_time::ptime &abs_time) - { return winapi_wrapper_timed_wait_for_single_object(m_sem_hnd, abs_time); } - - long value() const - { - long l_count, l_limit; - if(!winapi::get_semaphore_info(m_sem_hnd, l_count, l_limit)) - return 0; - return l_count; - } - - long limit() const - { - long l_count, l_limit; - if(!winapi::get_semaphore_info(m_sem_hnd, l_count, l_limit)) - return 0; - return l_limit; - } - - /// @cond - protected: - void *m_sem_hnd; - /// @endcond -}; - - -//Swappable semaphore wrapper -class winapi_semaphore_wrapper - : public winapi_semaphore_functions -{ - winapi_semaphore_wrapper(const winapi_semaphore_wrapper &); - winapi_semaphore_wrapper &operator=(const winapi_semaphore_wrapper &); - - public: - - //Long is 32 bits in windows - static const long MaxCount = long(0x7FFFFFFF); - - winapi_semaphore_wrapper(void *hnd = winapi::invalid_handle_value) - : winapi_semaphore_functions(hnd) - {} - - ~winapi_semaphore_wrapper() - { this->close(); } - - void *release() - { - void *hnd = m_sem_hnd; - m_sem_hnd = winapi::invalid_handle_value; - return hnd; - } - - void *handle() const - { return m_sem_hnd; } - - bool open_or_create( const char *name - , long sem_count - , long max_count - , const permissions &perm - , bool &created) - { - if(m_sem_hnd == winapi::invalid_handle_value){ - m_sem_hnd = winapi::open_or_create_semaphore - ( name - , sem_count - , max_count - , (winapi::interprocess_security_attributes*)perm.get_permissions() - ); - created = winapi::get_last_error() != winapi::error_already_exists; - return m_sem_hnd != winapi::invalid_handle_value; - } - else{ - return false; - } - } - - bool open_semaphore(const char *name) - { - if(m_sem_hnd == winapi::invalid_handle_value){ - m_sem_hnd = winapi::open_semaphore(name); - return m_sem_hnd != winapi::invalid_handle_value; - } - else{ - return false; - } - } - - void close() - { - if(m_sem_hnd != winapi::invalid_handle_value){ - winapi::close_handle(m_sem_hnd); - m_sem_hnd = winapi::invalid_handle_value; - } - } - - void swap(winapi_semaphore_wrapper &other) - { void *tmp = m_sem_hnd; m_sem_hnd = other.m_sem_hnd; other.m_sem_hnd = tmp; } -}; - -} //namespace ipcdetail { -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //BOOST_INTERPROCESS_DETAIL_WINAPI_SEMAPHORE_WRAPPER_HPP diff --git a/src/third_party/boost-1.56.0/boost/interprocess/sync/windows/winapi_wrapper_common.hpp b/src/third_party/boost-1.56.0/boost/interprocess/sync/windows/winapi_wrapper_common.hpp deleted file mode 100644 index ccf2d65cb64..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/sync/windows/winapi_wrapper_common.hpp +++ /dev/null @@ -1,93 +0,0 @@ - ////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2011-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_DETAIL_WINAPI_WRAPPER_COMMON_HPP -#define BOOST_INTERPROCESS_DETAIL_WINAPI_WRAPPER_COMMON_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> -#include <boost/interprocess/detail/win32_api.hpp> -#include <boost/interprocess/detail/posix_time_types_wrk.hpp> -#include <boost/interprocess/errors.hpp> -#include <boost/interprocess/exceptions.hpp> -#include <limits> - -namespace boost { -namespace interprocess { -namespace ipcdetail { - -inline void winapi_wrapper_wait_for_single_object(void *handle) -{ - unsigned long ret = winapi::wait_for_single_object(handle, winapi::infinite_time); - if(ret != winapi::wait_object_0){ - if(ret != winapi::wait_abandoned){ - error_info err = system_error_code(); - throw interprocess_exception(err); - } - else{ //Special case for orphaned mutexes - winapi::release_mutex(handle); - throw interprocess_exception(owner_dead_error); - } - } -} - -inline bool winapi_wrapper_try_wait_for_single_object(void *handle) -{ - unsigned long ret = winapi::wait_for_single_object(handle, 0); - if(ret == winapi::wait_object_0){ - return true; - } - else if(ret == winapi::wait_timeout){ - return false; - } - else{ - error_info err = system_error_code(); - throw interprocess_exception(err); - } -} - -inline bool winapi_wrapper_timed_wait_for_single_object(void *handle, const boost::posix_time::ptime &abs_time) -{ - //Windows does not support infinity abs_time so check it - if(abs_time == boost::posix_time::pos_infin){ - winapi_wrapper_wait_for_single_object(handle); - return true; - } - const boost::posix_time::ptime cur_time = microsec_clock::universal_time(); - //Windows uses relative wait times so check for negative waits - //and implement as 0 wait to allow try-semantics as POSIX mandates. - unsigned long ret = winapi::wait_for_single_object - ( handle - , (abs_time <= cur_time) ? 0u - : (abs_time - cur_time).total_milliseconds() - ); - if(ret == winapi::wait_object_0){ - return true; - } - else if(ret == winapi::wait_timeout){ - return false; - } - else{ - error_info err = system_error_code(); - throw interprocess_exception(err); - } -} - -} //namespace ipcdetail { -} //namespace interprocess { -} //namespace boost { - -#include <boost/interprocess/detail/config_end.hpp> - -#endif //BOOST_INTERPROCESS_DETAIL_WINAPI_MUTEX_WRAPPER_HPP |