You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
69 lines
1.7 KiB
69 lines
1.7 KiB
// 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
|
|
|