123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- // Copyright (C) 2000 Stephen Cleary
- //
- // Distributed under 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)
- //
- // See http://www.boost.org for updates, documentation, and revision history.
- #ifndef BOOST_POOL_GUARD_HPP
- #define BOOST_POOL_GUARD_HPP
- /*!
- \file
- \brief Extremely Light-Weight guard class.
- \details Auto-lock/unlock-er
- detail/guard.hpp provides a type guard<Mutex>
- that allows scoped access to the Mutex's locking and unlocking operations.
- It is used to ensure that a Mutex is unlocked, even if an exception is thrown.
- */
- namespace boost {
- namespace details {
- namespace pool {
- template <typename Mutex> //!< \tparam Mutex (platform-specific) mutex class.
- class guard
- { //! Locks the mutex, binding guard<Mutex> to Mutex.
- /*! Example:
- Given a (platform-specific) mutex class, we can wrap code as follows:
- extern mutex global_lock;
- static void f()
- {
- boost::details::pool::guard<mutex> g(global_lock);
- // g's constructor locks "global_lock"
- ... // do anything:
- // throw exceptions
- // return
- // or just fall through
- } // g's destructor unlocks "global_lock"
- */
- private:
- Mutex & mtx;
- guard(const guard &); //!< Guards the mutex, ensuring unlocked on destruction, even if exception is thrown.
- void operator=(const guard &);
- public:
- explicit guard(Mutex & nmtx)
- :mtx(nmtx)
- { //! Locks the mutex of the guard class.
- mtx.lock();
- }
- ~guard()
- { //! destructor unlocks the mutex of the guard class.
- mtx.unlock();
- }
- }; // class guard
- } // namespace pool
- } // namespace details
- } // namespace boost
- #endif
|