summaryrefslogtreecommitdiff
path: root/src/third_party/boost-1.56.0/boost/interprocess
diff options
context:
space:
mode:
Diffstat (limited to 'src/third_party/boost-1.56.0/boost/interprocess')
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/allocators/allocator.hpp306
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/allocators/detail/allocator_common.hpp850
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/containers/allocation_type.hpp40
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/containers/containers_fwd.hpp40
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/containers/list.hpp33
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/containers/vector.hpp33
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/containers/version_type.hpp33
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/creation_tags.hpp77
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/detail/atomic.hpp562
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/detail/cast_tags.hpp29
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/detail/config_begin.hpp48
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/detail/config_end.hpp17
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/detail/config_external_begin.hpp18
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/detail/config_external_end.hpp12
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/detail/in_place_interface.hpp73
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/detail/intermodule_singleton_common.hpp500
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/detail/interprocess_tester.hpp31
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/detail/managed_memory_impl.hpp776
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/detail/managed_open_or_create_impl.hpp493
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/detail/math_functions.hpp110
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/detail/min_max.hpp40
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/detail/mpl.hpp152
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/detail/named_proxy.hpp349
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/detail/os_file_functions.hpp727
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/detail/os_thread_functions.hpp594
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/detail/pointer_type.hpp74
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/detail/posix_time_types_wrk.hpp42
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/detail/preprocessor.hpp203
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/detail/segment_manager_helper.hpp521
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/detail/shared_dir_helpers.hpp191
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/detail/transform_iterator.hpp195
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/detail/type_traits.hpp158
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/detail/utilities.hpp220
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/detail/variadic_templates_tools.hpp153
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/detail/win32_api.hpp2333
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/detail/windows_intermodule_singleton.hpp310
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/detail/workaround.hpp194
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/errors.hpp237
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/exceptions.hpp150
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/indexes/iset_index.hpp150
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/interprocess_fwd.hpp418
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/managed_shared_memory.hpp221
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/mapped_region.hpp910
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/mem_algo/detail/mem_algo_common.hpp591
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/mem_algo/rbtree_best_fit.hpp1414
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/offset_ptr.hpp738
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/permissions.hpp132
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/segment_manager.hpp1341
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/shared_memory_object.hpp430
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/smart_ptr/deleter.hpp64
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/smart_ptr/unique_ptr.hpp553
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/streams/bufferstream.hpp483
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/sync/detail/common_algorithms.hpp73
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/sync/interprocess_mutex.hpp184
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/sync/interprocess_recursive_mutex.hpp177
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/sync/lock_options.hpp55
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/sync/mutex_family.hpp56
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/sync/null_mutex.hpp147
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/sync/posix/mutex.hpp139
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/sync/posix/pthread_helpers.hpp168
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/sync/posix/ptime_to_timespec.hpp40
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/sync/posix/recursive_mutex.hpp129
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/sync/scoped_lock.hpp372
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/sync/spin/mutex.hpp83
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/sync/spin/recursive_mutex.hpp172
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/sync/spin/wait.hpp181
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/sync/windows/mutex.hpp114
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/sync/windows/recursive_mutex.hpp43
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/sync/windows/sync_utils.hpp236
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/sync/windows/winapi_mutex_wrapper.hpp130
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/sync/windows/winapi_semaphore_wrapper.hpp164
-rw-r--r--src/third_party/boost-1.56.0/boost/interprocess/sync/windows/winapi_wrapper_common.hpp93
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 &map;
- }
- //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