• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (C) 2000 Stephen Cleary
2 //
3 // Distributed under the Boost Software License, Version 1.0. (See
4 // accompanying file LICENSE_1_0.txt or copy at
5 // http://www.boost.org/LICENSE_1_0.txt)
6 //
7 // See http://www.boost.org for updates, documentation, and revision history.
8 
9 #ifndef BOOST_POOL_GUARD_HPP
10 #define BOOST_POOL_GUARD_HPP
11 
12 /*!
13   \file
14   \brief Extremely Light-Weight guard class.
15   \details Auto-lock/unlock-er
16   detail/guard.hpp provides a type guard<Mutex>
17   that allows scoped access to the Mutex's locking and unlocking operations.
18   It is used to ensure that a Mutex is unlocked, even if an exception is thrown.
19 */
20 
21 namespace boost {
22 
23 namespace details {
24 namespace pool {
25 
26 template <typename Mutex> //!< \tparam Mutex (platform-specific) mutex class.
27 class guard
28 { //! Locks the mutex, binding guard<Mutex> to Mutex.
29 	/*! Example:
30 	Given a (platform-specific) mutex class, we can wrap code as follows:
31 
32 	extern mutex global_lock;
33 
34 	static void f()
35 	{
36 		boost::details::pool::guard<mutex> g(global_lock);
37 		// g's constructor locks "global_lock"
38 
39 		... // do anything:
40 				//   throw exceptions
41 				//   return
42 				//   or just fall through
43 	} // g's destructor unlocks "global_lock"
44 	*/
45   private:
46     Mutex & mtx;
47 
48     guard(const guard &); //!< Guards the mutex, ensuring unlocked on destruction, even if exception is thrown.
49     void operator=(const guard &);
50 
51   public:
guard(Mutex & nmtx)52     explicit guard(Mutex & nmtx)
53     :mtx(nmtx)
54     { //! Locks the mutex of the guard class.
55 			mtx.lock();
56 		}
57 
~guard()58     ~guard()
59     { //! destructor unlocks the mutex of the guard class.
60 			mtx.unlock();
61 		}
62 }; // class guard
63 
64 } // namespace pool
65 } // namespace details
66 
67 } // namespace boost
68 
69 #endif
70