diff options
Diffstat (limited to 'boost/flyweight/detail/recursive_lw_mutex.hpp')
-rw-r--r-- | boost/flyweight/detail/recursive_lw_mutex.hpp | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/boost/flyweight/detail/recursive_lw_mutex.hpp b/boost/flyweight/detail/recursive_lw_mutex.hpp new file mode 100644 index 0000000000..5bb2082074 --- /dev/null +++ b/boost/flyweight/detail/recursive_lw_mutex.hpp @@ -0,0 +1,91 @@ +/* Copyright 2006-2008 Joaquin M Lopez Munoz. + * 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/flyweight for library home page. + */ + +#ifndef BOOST_FLYWEIGHT_DETAIL_RECURSIVE_LW_MUTEX_HPP +#define BOOST_FLYWEIGHT_DETAIL_RECURSIVE_LW_MUTEX_HPP + +#if defined(_MSC_VER)&&(_MSC_VER>=1200) +#pragma once +#endif + +/* Recursive lightweight mutex. Relies entirely on + * boost::detail::lightweight_mutex, except in Pthreads, where we + * explicitly use the PTHREAD_MUTEX_RECURSIVE attribute + * (lightweight_mutex uses the default mutex type instead). + */ + +#include <boost/config.hpp> + +#if !defined(BOOST_HAS_PTHREADS) +#include <boost/detail/lightweight_mutex.hpp> +namespace boost{ + +namespace flyweights{ + +namespace detail{ + +typedef boost::detail::lightweight_mutex recursive_lightweight_mutex; + +} /* namespace flyweights::detail */ + +} /* namespace flyweights */ + +} /* namespace boost */ +#else +/* code shamelessly ripped from <boost/detail/lwm_pthreads.hpp> */ + +#include <boost/noncopyable.hpp> +#include <pthread.h> + +namespace boost{ + +namespace flyweights{ + +namespace detail{ + +struct recursive_lightweight_mutex:noncopyable +{ + recursive_lightweight_mutex() + { + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&m_,&attr); + pthread_mutexattr_destroy(&attr); + } + + ~recursive_lightweight_mutex(){pthread_mutex_destroy(&m_);} + + struct scoped_lock; + friend struct scoped_lock; + struct scoped_lock:noncopyable + { + public: + scoped_lock(recursive_lightweight_mutex& m):m_(m.m_) + { + pthread_mutex_lock(&m_); + } + + ~scoped_lock(){pthread_mutex_unlock(&m_);} + + private: + pthread_mutex_t& m_; + }; + +private: + pthread_mutex_t m_; +}; + +} /* namespace flyweights::detail */ + +} /* namespace flyweights */ + +} /* namespace boost */ +#endif + +#endif |