/* 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 |