Update contrib.
1 // Copyright (C) 2001-2003
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 #ifndef BOOST_XLOCK_WEK070601_HPP
8 #define BOOST_XLOCK_WEK070601_HPP
10 #include <boost/thread/detail/config.hpp>
12 #include <boost/utility.hpp>
13 #include <boost/thread/exceptions.hpp>
20 namespace detail { namespace thread {
22 template <typename Mutex>
23 class lock_ops : private noncopyable
29 typedef typename Mutex::cv_state lock_state;
31 static void lock(Mutex& m)
35 static bool trylock(Mutex& m)
37 return m.do_trylock();
39 static bool timedlock(Mutex& m, const xtime& xt)
41 return m.do_timedlock(xt);
43 static void unlock(Mutex& m)
47 static void lock(Mutex& m, lock_state& state)
51 static void unlock(Mutex& m, lock_state& state)
57 template <typename Mutex>
58 class scoped_lock : private noncopyable
61 typedef Mutex mutex_type;
63 explicit scoped_lock(Mutex& mx, bool initially_locked=true)
64 : m_mutex(mx), m_locked(false)
66 if (initially_locked) lock();
70 if (m_locked) unlock();
75 if (m_locked) throw lock_error();
76 lock_ops<Mutex>::lock(m_mutex);
81 if (!m_locked) throw lock_error();
82 lock_ops<Mutex>::unlock(m_mutex);
86 bool locked() const { return m_locked; }
87 operator const void*() const { return m_locked ? this : 0; }
90 friend class boost::condition;
96 template <typename TryMutex>
97 class scoped_try_lock : private noncopyable
100 typedef TryMutex mutex_type;
102 explicit scoped_try_lock(TryMutex& mx)
103 : m_mutex(mx), m_locked(false)
107 scoped_try_lock(TryMutex& mx, bool initially_locked)
108 : m_mutex(mx), m_locked(false)
110 if (initially_locked) lock();
114 if (m_locked) unlock();
119 if (m_locked) throw lock_error();
120 lock_ops<TryMutex>::lock(m_mutex);
125 if (m_locked) throw lock_error();
126 return (m_locked = lock_ops<TryMutex>::trylock(m_mutex));
130 if (!m_locked) throw lock_error();
131 lock_ops<TryMutex>::unlock(m_mutex);
135 bool locked() const { return m_locked; }
136 operator const void*() const { return m_locked ? this : 0; }
139 friend class boost::condition;
145 template <typename TimedMutex>
146 class scoped_timed_lock : private noncopyable
149 typedef TimedMutex mutex_type;
151 scoped_timed_lock(TimedMutex& mx, const xtime& xt)
152 : m_mutex(mx), m_locked(false)
156 scoped_timed_lock(TimedMutex& mx, bool initially_locked)
157 : m_mutex(mx), m_locked(false)
159 if (initially_locked) lock();
163 if (m_locked) unlock();
168 if (m_locked) throw lock_error();
169 lock_ops<TimedMutex>::lock(m_mutex);
174 if (m_locked) throw lock_error();
175 return (m_locked = lock_ops<TimedMutex>::trylock(m_mutex));
177 bool timed_lock(const xtime& xt)
179 if (m_locked) throw lock_error();
180 return (m_locked = lock_ops<TimedMutex>::timedlock(m_mutex, xt));
184 if (!m_locked) throw lock_error();
185 lock_ops<TimedMutex>::unlock(m_mutex);
189 bool locked() const { return m_locked; }
190 operator const void*() const { return m_locked ? this : 0; }
193 friend class boost::condition;
199 } // namespace thread
200 } // namespace detail
203 #endif // BOOST_XLOCK_WEK070601_HPP
206 // 8 Feb 01 WEKEMPF Initial version.
207 // 22 May 01 WEKEMPF Modified to use xtime for time outs.
208 // 30 Jul 01 WEKEMPF Moved lock types into boost::detail::thread. Renamed
209 // some types. Added locked() methods.