// 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 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 //!< \tparam Mutex (platform-specific) mutex class. class guard { //! Locks the mutex, binding guard 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 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