Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/thread/lock_concepts.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DEPENDENCIES/generic/include/boost/thread/lock_concepts.hpp Tue Aug 05 11:11:38 2014 +0100 @@ -0,0 +1,197 @@ +// (C) Copyright 2012 Vicente Botet +// +// 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_THREAD_LOCK_CONCEPTS_HPP +#define BOOST_THREAD_LOCK_CONCEPTS_HPP + +#include <boost/thread/lock_traits.hpp> +#include <boost/thread/lock_options.hpp> +#include <boost/thread/lockable_concepts.hpp> +#include <boost/thread/exceptions.hpp> +#include <boost/thread/detail/move.hpp> + +#include <boost/chrono/chrono.hpp> +#include <boost/concept_check.hpp> +#include <boost/static_assert.hpp> + +namespace boost +{ + + /** + * BasicLock object supports the basic features + * required to delimit a critical region + * Supports the basic lock, unlock and try_lock functions and + * defines the lock traits + */ + + template <typename Lk> + struct BasicLock + { + typedef typename Lk::mutex_type mutex_type; + void cvt_mutex_ptr(mutex_type*) {} + BOOST_CONCEPT_ASSERT(( BasicLockable<mutex_type> )); + + BOOST_CONCEPT_USAGE(BasicLock) + { + const Lk l1(mtx); + Lk l2(mtx, defer_lock); + Lk l3(mtx, adopt_lock); + Lk l4(( Lk())); + Lk l5(( boost::move(l2))); + cvt_mutex_ptr(l1.mutex()); + if (l1.owns_lock()) return; + if (l1) return; + if (!l1) return; + + l2.lock(); + l2.unlock(); + l2.release(); + + } + BasicLock() : + mtx(*static_cast<mutex_type*>(0)) + {} + private: + BasicLock operator=(BasicLock const&); + mutex_type& mtx; + } + ; + + template <typename Lk> + struct Lock + { + BOOST_CONCEPT_ASSERT(( BasicLock<Lk> )); + typedef typename Lk::mutex_type mutex_type; + BOOST_CONCEPT_ASSERT(( Lockable<mutex_type> )); + + BOOST_CONCEPT_USAGE(Lock) + { + Lk l1(mtx, try_to_lock); + if (l1.try_lock()) return; + } + Lock() : + mtx(*static_cast<mutex_type*>(0)) + {} + private: + Lock operator=(Lock const&); + mutex_type& mtx; + }; + + template <typename Lk> + struct TimedLock + { + BOOST_CONCEPT_ASSERT(( Lock<Lk> )); + typedef typename Lk::mutex_type mutex_type; + BOOST_CONCEPT_ASSERT(( TimedLockable<mutex_type> )); + + BOOST_CONCEPT_USAGE(TimedLock) + { + const Lk l1(mtx, t); + Lk l2(mtx, d); + if (l1.try_lock_until(t)) return; + if (l1.try_lock_for(d)) return; + } + TimedLock() : + mtx(*static_cast<mutex_type*>(0)) + {} + private: + TimedLock operator=(TimedLock const&); + mutex_type& mtx; + boost::chrono::system_clock::time_point t; + boost::chrono::system_clock::duration d; + }; + + template <typename Lk> + struct UniqueLock + { + BOOST_CONCEPT_ASSERT(( TimedLock<Lk> )); + typedef typename Lk::mutex_type mutex_type; + + BOOST_CONCEPT_USAGE(UniqueLock) + { + + } + UniqueLock() : + mtx(*static_cast<mutex_type*>(0)) + {} + private: + UniqueLock operator=(UniqueLock const&); + mutex_type& mtx; + }; + + template <typename Lk> + struct SharedLock + { + BOOST_CONCEPT_ASSERT(( TimedLock<Lk> )); + typedef typename Lk::mutex_type mutex_type; + + BOOST_CONCEPT_USAGE(SharedLock) + { + } + SharedLock() : + mtx(*static_cast<mutex_type*>(0)) + {} + private: + SharedLock operator=(SharedLock const&); + mutex_type& mtx; + + }; + + template <typename Lk> + struct UpgradeLock + { + BOOST_CONCEPT_ASSERT(( SharedLock<Lk> )); + typedef typename Lk::mutex_type mutex_type; + + BOOST_CONCEPT_USAGE(UpgradeLock) + { + } + UpgradeLock() : + mtx(*static_cast<mutex_type*>(0)) + {} + private: + UpgradeLock operator=(UpgradeLock const&); + mutex_type& mtx; + }; + + /** + * An StrictLock is a scoped lock guard ensuring the mutex is locked on the + * scope of the lock, by locking the mutex on construction and unlocking it on + * destruction. + * + * Essentially, a StrictLock's role is only to live on the stack as an + * automatic variable. strict_lock must adhere to a non-copy and non-alias + * policy. StrictLock disables copying by making the copy constructor and the + * assignment operator private. While we're at it, let's disable operator new + * and operator delete; strict locks are not intended to be allocated on the + * heap. StrictLock avoids aliasing by using a slightly less orthodox and + * less well-known technique: disable address taking. + */ + + template <typename Lk> + struct StrictLock + { + typedef typename Lk::mutex_type mutex_type; + BOOST_CONCEPT_ASSERT(( BasicLockable<mutex_type> )); + BOOST_STATIC_ASSERT(( is_strict_lock<Lk>::value )); + + BOOST_CONCEPT_USAGE( StrictLock) + { + if (l1.owns_lock(&mtx)) return; + } + StrictLock() : + l1(*static_cast<Lk*>(0)), + mtx(*static_cast<mutex_type*>(0)) + {} + private: + StrictLock operator=(StrictLock const&); + + Lk const& l1; + mutex_type const& mtx; + + }; + +} +#endif