/* 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 #if !defined(BOOST_HAS_THREADS)||!defined(BOOST_HAS_PTHREADS) #include 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 */ #include #include 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