Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/boost_1_33_1/libs/regex/src/static_mutex.cpp @ 14

Last change on this file since 14 was 12, checked in by landauf, 17 years ago

added boost

File size: 3.5 KB
Line 
1/*
2 *
3 * Copyright (c) 2004
4 * John Maddock
5 *
6 * Use, modification and distribution are subject to the
7 * Boost Software License, Version 1.0. (See accompanying file
8 * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9 *
10 */
11 
12 /*
13  *   LOCATION:    see http://www.boost.org for most recent version.
14  *   FILE         static_mutex.cpp
15  *   VERSION      see <boost/version.hpp>
16  *   DESCRIPTION: Declares static_mutex lock type.
17  */
18
19#define BOOST_REGEX_SOURCE
20#include <boost/config.hpp>
21
22#ifdef BOOST_HAS_THREADS
23
24#include <boost/regex/pending/static_mutex.hpp>
25
26#if defined(BOOST_HAS_WINTHREADS)
27#define NOMINMAX
28#define WIN32_LEAN_AND_MEAN
29#include <windows.h>
30#include <boost/static_assert.hpp>
31#endif
32
33
34namespace boost{
35
36#if defined(BOOST_HAS_PTHREADS) && defined(PTHREAD_MUTEX_INITIALIZER)
37
38scoped_static_mutex_lock::scoped_static_mutex_lock(static_mutex& m, bool lk)
39: m_mutex(m), m_have_lock(false)
40{
41   if(lk)
42      lock();
43}
44
45scoped_static_mutex_lock::~scoped_static_mutex_lock()
46{
47   if(m_have_lock)
48      unlock();
49}
50
51void scoped_static_mutex_lock::lock()
52{
53   if(0 == m_have_lock)
54   {
55      pthread_mutex_lock(&(m_mutex.m_mutex));
56      m_have_lock = true;
57   }
58}
59
60void scoped_static_mutex_lock::unlock()
61{
62   if(m_have_lock)
63   {
64      pthread_mutex_unlock(&(m_mutex.m_mutex));
65      m_have_lock = false;
66   }
67}
68
69#elif defined(BOOST_HAS_WINTHREADS)
70
71BOOST_STATIC_ASSERT(sizeof(LONG) == sizeof(boost::int32_t));
72
73scoped_static_mutex_lock::scoped_static_mutex_lock(static_mutex& m, bool lk)
74: m_mutex(m), m_have_lock(false)
75{
76   if(lk)
77      lock();
78}
79
80scoped_static_mutex_lock::~scoped_static_mutex_lock()
81{
82   if(m_have_lock)
83      unlock();
84}
85
86void scoped_static_mutex_lock::lock()
87{
88   if(0 == m_have_lock)
89   {
90#if !defined(InterlockedCompareExchangePointer)
91      while(0 != InterlockedCompareExchange(reinterpret_cast<void**>((boost::uint_least16_t*)&(m_mutex.m_mutex)), (void*)1, 0))
92#else
93      while(0 != InterlockedCompareExchange(reinterpret_cast<LONG*>(&(m_mutex.m_mutex)), 1, 0))
94#endif
95      {
96         Sleep(0);
97      }
98      m_have_lock = true;
99   }
100}
101
102void scoped_static_mutex_lock::unlock()
103{
104   if(m_have_lock)
105   {
106#if !defined(InterlockedCompareExchangePointer)
107      InterlockedExchange((LONG*)&(m_mutex.m_mutex), 0);
108#else
109      InterlockedExchange(reinterpret_cast<LONG*>(&(m_mutex.m_mutex)), 0);
110#endif
111      m_have_lock = false;
112   }
113}
114
115#else
116//
117// Portable version of a static mutex based on Boost.Thread library:
118//
119#include <stdlib.h>
120#include <boost/assert.hpp>
121
122boost::recursive_mutex* static_mutex::m_pmutex = 0;
123boost::once_flag static_mutex::m_once = BOOST_ONCE_INIT;
124
125extern "C" BOOST_REGEX_DECL void free_static_mutex()
126{
127   delete static_mutex::m_pmutex;
128   static_mutex::m_pmutex = 0;
129}
130
131void static_mutex::init()
132{
133   m_pmutex = new boost::recursive_mutex();
134   int r = atexit(free_static_mutex);
135   BOOST_ASSERT(0 == r);
136}
137
138scoped_static_mutex_lock::scoped_static_mutex_lock(static_mutex& , bool lk)
139: m_plock(0), m_have_lock(false)
140{
141   if(lk)
142      lock();
143}
144
145scoped_static_mutex_lock::~scoped_static_mutex_lock()
146{
147   if(m_have_lock)
148      unlock();
149   delete m_plock;
150}
151
152void scoped_static_mutex_lock::lock()
153{
154   if(0 == m_have_lock)
155   {
156      boost::call_once(&static_mutex::init, static_mutex::m_once);
157      if(0 == m_plock)
158         m_plock = new boost::recursive_mutex::scoped_lock(*static_mutex::m_pmutex, false);
159      m_plock->lock();
160      m_have_lock = true;
161   }
162}
163
164void scoped_static_mutex_lock::unlock()
165{
166   if(m_have_lock)
167   {
168      m_plock->unlock();
169      m_have_lock = false;
170   }
171}
172
173#endif
174
175}
176
177#endif // BOOST_HAS_THREADS
Note: See TracBrowser for help on using the repository browser.