183 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			183 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| /*
 | |
|  *
 | |
|  * Copyright (c) 2004
 | |
|  * John Maddock
 | |
|  *
 | |
|  * Use, modification and distribution are subject to 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)
 | |
|  *
 | |
|  */
 | |
|  
 | |
|  /*
 | |
|   *   LOCATION:    see http://www.boost.org for most recent version.
 | |
|   *   FILE         static_mutex.hpp
 | |
|   *   VERSION      see <boost/version.hpp>
 | |
|   *   DESCRIPTION: Declares static_mutex lock type, there are three different
 | |
|   *                implementations: POSIX pthreads, WIN32 threads, and portable,
 | |
|   *                these are described in more detail below.
 | |
|   */
 | |
| 
 | |
| #ifndef BOOST_REGEX_STATIC_MUTEX_HPP
 | |
| #define BOOST_REGEX_STATIC_MUTEX_HPP
 | |
| 
 | |
| #include <boost/config.hpp>
 | |
| #include <boost/regex/config.hpp> // dll import/export options.
 | |
| 
 | |
| #ifdef BOOST_HAS_PTHREADS
 | |
| #include <pthread.h>
 | |
| #endif
 | |
| 
 | |
| #if defined(BOOST_HAS_PTHREADS) && defined(PTHREAD_MUTEX_INITIALIZER)
 | |
| //
 | |
| // pthreads version:
 | |
| // simple wrap around a pthread_mutex_t initialized with
 | |
| // PTHREAD_MUTEX_INITIALIZER.
 | |
| //
 | |
| namespace boost{
 | |
| 
 | |
| class static_mutex;
 | |
| 
 | |
| #define BOOST_STATIC_MUTEX_INIT { PTHREAD_MUTEX_INITIALIZER, }
 | |
| 
 | |
| class BOOST_REGEX_DECL scoped_static_mutex_lock
 | |
| {
 | |
| public:
 | |
|    scoped_static_mutex_lock(static_mutex& mut, bool lk = true);
 | |
|    ~scoped_static_mutex_lock();
 | |
|    inline bool locked()const
 | |
|    {
 | |
|       return m_have_lock;
 | |
|    }
 | |
|    inline operator void const*()const
 | |
|    {
 | |
|       return locked() ? this : 0;
 | |
|    }
 | |
|    void lock();
 | |
|    void unlock();
 | |
| private:
 | |
|    static_mutex& m_mutex;
 | |
|    bool m_have_lock;
 | |
| };
 | |
| 
 | |
| class static_mutex
 | |
| {
 | |
| public:
 | |
|    typedef scoped_static_mutex_lock scoped_lock;
 | |
|    pthread_mutex_t m_mutex;
 | |
| };
 | |
| 
 | |
| } // namespace boost
 | |
| #elif defined(BOOST_HAS_WINTHREADS)
 | |
| //
 | |
| // Win32 version:
 | |
| // Use a 32-bit int as a lock, along with a test-and-set
 | |
| // implementation using InterlockedCompareExchange.
 | |
| //
 | |
| 
 | |
| #include <boost/cstdint.hpp>
 | |
| 
 | |
| namespace boost{
 | |
| 
 | |
| class BOOST_REGEX_DECL scoped_static_mutex_lock;
 | |
| 
 | |
| class static_mutex
 | |
| {
 | |
| public:
 | |
|    typedef scoped_static_mutex_lock scoped_lock;
 | |
|    boost::int32_t m_mutex;
 | |
| };
 | |
| 
 | |
| #define BOOST_STATIC_MUTEX_INIT { 0, }
 | |
| 
 | |
| class BOOST_REGEX_DECL scoped_static_mutex_lock
 | |
| {
 | |
| public:
 | |
|    scoped_static_mutex_lock(static_mutex& mut, bool lk = true);
 | |
|    ~scoped_static_mutex_lock();
 | |
|    operator void const*()const
 | |
|    {
 | |
|       return locked() ? this : 0;
 | |
|    }
 | |
|    bool locked()const
 | |
|    {
 | |
|       return m_have_lock;
 | |
|    }
 | |
|    void lock();
 | |
|    void unlock();
 | |
| private:
 | |
|    static_mutex& m_mutex;
 | |
|    bool m_have_lock;
 | |
|    scoped_static_mutex_lock(const scoped_static_mutex_lock&);
 | |
|    scoped_static_mutex_lock& operator=(const scoped_static_mutex_lock&);
 | |
| };
 | |
| 
 | |
| } // namespace
 | |
| 
 | |
| #else
 | |
| //
 | |
| // Portable version of a static mutex based on Boost.Thread library:
 | |
| // This has to use a single mutex shared by all instances of static_mutex
 | |
| // because boost::call_once doesn't alow us to pass instance information
 | |
| // down to the initialisation proceedure.  In fact the initialisation routine
 | |
| // may need to be called more than once - but only once per instance.
 | |
| //
 | |
| // Since this preprocessor path is almost never taken, we hide these header
 | |
| // dependencies so that build tools don't find them.
 | |
| //
 | |
| #define BOOST_REGEX_H1 <boost/thread/once.hpp>
 | |
| #define BOOST_REGEX_H2 <boost/thread/recursive_mutex.hpp>
 | |
| #define BOOST_REGEX_H3 <boost/thread/lock_types.hpp>
 | |
| #include BOOST_REGEX_H1
 | |
| #include BOOST_REGEX_H2
 | |
| #include BOOST_REGEX_H3
 | |
| #undef BOOST_REGEX_H1
 | |
| #undef BOOST_REGEX_H2
 | |
| #undef BOOST_REGEX_H3
 | |
| 
 | |
| namespace boost{
 | |
| 
 | |
| class BOOST_REGEX_DECL scoped_static_mutex_lock;
 | |
| extern "C" BOOST_REGEX_DECL void boost_regex_free_static_mutex();
 | |
| 
 | |
| class BOOST_REGEX_DECL static_mutex
 | |
| {
 | |
| public:
 | |
|    typedef scoped_static_mutex_lock scoped_lock;
 | |
|    static void init();
 | |
|    static boost::recursive_mutex* m_pmutex;
 | |
|    static boost::once_flag m_once;
 | |
| };
 | |
| 
 | |
| #define BOOST_STATIC_MUTEX_INIT {  }
 | |
| 
 | |
| class BOOST_REGEX_DECL scoped_static_mutex_lock
 | |
| {
 | |
| public:
 | |
|    scoped_static_mutex_lock(static_mutex& mut, bool lk = true);
 | |
|    ~scoped_static_mutex_lock();
 | |
|    operator void const*()const;
 | |
|    bool locked()const;
 | |
|    void lock();
 | |
|    void unlock();
 | |
| private:
 | |
|    boost::unique_lock<boost::recursive_mutex>* m_plock;
 | |
|    bool m_have_lock;
 | |
| };
 | |
| 
 | |
| inline scoped_static_mutex_lock::operator void const*()const
 | |
| {
 | |
|    return locked() ? this : 0;
 | |
| }
 | |
| 
 | |
| inline bool scoped_static_mutex_lock::locked()const
 | |
| {
 | |
|    return m_have_lock;
 | |
| }
 | |
| 
 | |
| } // namespace
 | |
| 
 | |
| #endif
 | |
| 
 | |
| #endif
 | 
