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 |