Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/log/detail/locking_ptr.hpp @ 101:c530137014c0
Update Boost headers (1.58.0)
author | Chris Cannam |
---|---|
date | Mon, 07 Sep 2015 11:12:49 +0100 |
parents | 2665513ce2d3 |
children |
line wrap: on
line diff
--- a/DEPENDENCIES/generic/include/boost/log/detail/locking_ptr.hpp Fri Sep 04 12:01:02 2015 +0100 +++ b/DEPENDENCIES/generic/include/boost/log/detail/locking_ptr.hpp Mon Sep 07 11:12:49 2015 +0100 @@ -1,5 +1,5 @@ /* - * Copyright Andrey Semashev 2007 - 2013. + * Copyright Andrey Semashev 2007 - 2015. * 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) @@ -16,7 +16,10 @@ #ifndef BOOST_LOG_DETAIL_LOCKING_PTR_HPP_INCLUDED_ #define BOOST_LOG_DETAIL_LOCKING_PTR_HPP_INCLUDED_ +#include <cstddef> +#include <boost/move/core.hpp> #include <boost/smart_ptr/shared_ptr.hpp> +#include <boost/thread/lock_options.hpp> #include <boost/log/detail/config.hpp> #include <boost/utility/explicit_operator_bool.hpp> #include <boost/log/detail/header.hpp> @@ -31,60 +34,41 @@ namespace aux { -//! Shared lock object to support locking_ptr -struct BOOST_LOG_NO_VTABLE locking_ptr_counter_base -{ - unsigned int m_RefCounter; - - locking_ptr_counter_base() : m_RefCounter(0) - { - } - - virtual ~locking_ptr_counter_base() {} - virtual void lock() = 0; - virtual bool try_lock() = 0; - virtual void unlock() = 0; - -private: - locking_ptr_counter_base(locking_ptr_counter_base const&); - locking_ptr_counter_base& operator= (locking_ptr_counter_base const&); -}; - -struct try_lock_tag {}; -BOOST_CONSTEXPR_OR_CONST try_lock_tag try_lock = {}; - //! A pointer type that locks the backend until it's destroyed -template< typename T > +template< typename T, typename LockableT > class locking_ptr { + typedef locking_ptr this_type; + BOOST_COPYABLE_AND_MOVABLE_ALT(this_type) + public: //! Pointed type typedef T element_type; private: + //! Lockable type + typedef LockableT lockable_type; + +private: //! The pointer to the backend shared_ptr< element_type > m_pElement; //! Reference to the shared lock control object - locking_ptr_counter_base* m_pLock; + lockable_type* m_pLock; public: - //! Constructor - locking_ptr(shared_ptr< element_type > const& p, locking_ptr_counter_base& l) - : m_pElement(p), m_pLock(&l) + //! Default constructor + locking_ptr() BOOST_NOEXCEPT : m_pLock(NULL) { - if (m_pLock->m_RefCounter == 0) - m_pLock->lock(); - ++m_pLock->m_RefCounter; } //! Constructor - locking_ptr(shared_ptr< element_type > const& p, locking_ptr_counter_base& l, try_lock_tag const&) - : m_pElement(p), m_pLock(&l) + locking_ptr(shared_ptr< element_type > const& p, lockable_type& l) : m_pElement(p), m_pLock(&l) { - if (m_pLock->m_RefCounter > 0 || m_pLock->try_lock()) - { - ++m_pLock->m_RefCounter; - } - else + m_pLock->lock(); + } + //! Constructor + locking_ptr(shared_ptr< element_type > const& p, lockable_type& l, try_to_lock_t const&) : m_pElement(p), m_pLock(&l) + { + if (!m_pLock->try_lock()) { m_pElement.reset(); m_pLock = NULL; @@ -94,54 +78,61 @@ locking_ptr(locking_ptr const& that) : m_pElement(that.m_pElement), m_pLock(that.m_pLock) { if (m_pLock) - ++m_pLock->m_RefCounter; + m_pLock->lock(); } + //! Move constructor + locking_ptr(BOOST_RV_REF(this_type) that) BOOST_NOEXCEPT : m_pLock(that.m_pLock) + { + m_pElement.swap(that.m_pElement); + that.m_pLock = NULL; + } + //! Destructor ~locking_ptr() { - if (m_pLock && --m_pLock->m_RefCounter == 0) + if (m_pLock) m_pLock->unlock(); } //! Assignment - locking_ptr& operator= (locking_ptr that) + locking_ptr& operator= (locking_ptr that) BOOST_NOEXCEPT { this->swap(that); return *this; } //! Indirection - element_type* operator-> () const { return m_pElement.get(); } + element_type* operator-> () const BOOST_NOEXCEPT { return m_pElement.get(); } //! Dereferencing - element_type& operator* () const { return *m_pElement; } + element_type& operator* () const BOOST_NOEXCEPT { return *m_pElement; } //! Accessor to the raw pointer - element_type* get() const { return m_pElement.get(); } + element_type* get() const BOOST_NOEXCEPT { return m_pElement.get(); } //! Checks for null pointer - BOOST_EXPLICIT_OPERATOR_BOOL() + BOOST_EXPLICIT_OPERATOR_BOOL_NOEXCEPT() //! Checks for null pointer - bool operator! () const { return !m_pElement; } + bool operator! () const BOOST_NOEXCEPT { return !m_pElement; } //! Swaps two pointers - void swap(locking_ptr& that) + void swap(locking_ptr& that) BOOST_NOEXCEPT { m_pElement.swap(that.m_pElement); - register locking_ptr_counter_base* p = m_pLock; + lockable_type* p = m_pLock; m_pLock = that.m_pLock; that.m_pLock = p; } }; //! Free raw pointer getter to assist generic programming -template< typename T > -inline T* get_pointer(locking_ptr< T > const& p) +template< typename T, typename LockableT > +inline T* get_pointer(locking_ptr< T, LockableT > const& p) BOOST_NOEXCEPT { return p.get(); } //! Free swap operation -template< typename T > -inline void swap(locking_ptr< T >& left, locking_ptr< T >& right) +template< typename T, typename LockableT > +inline void swap(locking_ptr< T, LockableT >& left, locking_ptr< T, LockableT >& right) BOOST_NOEXCEPT { left.swap(right); }