You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
concurrentqueue/benchmarks/dlib/threads/auto_mutex_extension_abstra...

186 lines
6.0 KiB
C++

// Copyright (C) 2005 Davis E. King (davis@dlib.net)
// License: Boost Software License See LICENSE.txt for the full license.
#undef DLIB_AUTO_MUTEX_EXTENSIOn_ABSTRACT_
#ifdef DLIB_AUTO_MUTEX_EXTENSIOn_ABSTRACT_
#include "threads_kernel_abstract.h"
#include "rmutex_extension_abstract.h"
#include "read_write_mutex_extension_abstract.h"
namespace dlib
{
// ----------------------------------------------------------------------------------------
class auto_mutex
{
/*!
INITIAL VALUE
The mutex given in the constructor is locked and associated with this
object.
WHAT THIS OBJECT REPRESENTS
This object represents a mechanism for automatically locking and unlocking
a mutex object.
!*/
public:
explicit auto_mutex (
const mutex& m
);
/*!
ensures
- #*this is properly initialized
- m will be locked
!*/
explicit auto_mutex (
const rmutex& m
);
/*!
ensures
- #*this is properly initialized
- m will be locked
!*/
explicit auto_mutex (
const read_write_mutex& m
);
/*!
ensures
- #*this is properly initialized
- m will be locked via m.lock() (i.e. a write lock will be obtained)
!*/
void unlock(
);
/*!
ensures
- if (unlock() has not already been called) then
- The mutex associated with *this has been unlocked. This is useful if
you want to unlock a mutex before the auto_mutex destructor executes.
!*/
~auto_mutex (
);
/*!
ensures
- all resources allocated by *this have been freed
- calls unlock()
!*/
private:
// restricted functions
auto_mutex(auto_mutex&); // copy constructor
auto_mutex& operator=(auto_mutex&); // assignment operator
};
// ----------------------------------------------------------------------------------------
class auto_mutex_readonly
{
/*!
INITIAL VALUE
The mutex given in the constructor is locked using a read-only lock and
associated with this object.
WHAT THIS OBJECT REPRESENTS
This object represents a mechanism for automatically locking and unlocking
a read_write_mutex object. In particular, a readonly lock is used.
!*/
public:
explicit auto_mutex_readonly (
const read_write_mutex& m
);
/*!
ensures
- #*this is properly initialized
- a readonly lock will be obtained on m using m.lock_readonly()
- #has_read_lock() == true
!*/
~auto_mutex_readonly (
);
/*!
ensures
- all resources allocated by *this have been freed
- the mutex associated with *this has been unlocked
!*/
bool has_read_lock (
);
/*!
ensures
- returns true if this object has called read_write_mutex::lock_readonly()
on its associated mutex and has yet to release that lock.
!*/
bool has_write_lock (
);
/*!
ensures
- returns true if this object has called read_write_mutex::lock() on its
associated mutex and has yet to release that lock.
!*/
void lock_readonly (
);
/*!
ensures
- This function converts the lock on the associated mutex into a readonly lock.
Specifically:
if (!has_read_lock()) then
- if (has_write_lock()) then
- unlocks the associated mutex and then relocks it by calling
read_write_mutex::lock_readonly()
- else
- locks the associated mutex by calling read_write_mutex::lock_readonly()
- #has_read_lock() == true
- Note that the lock switch is not atomic. This means that whatever
resource is protected by the mutex might have been modified during the
call to lock_readonly().
!*/
void lock_write (
);
/*!
ensures
- This function converts the lock on the associated mutex into a write lock.
Specifically:
if (!has_write_lock()) then
- if (has_read_lock()) then
- unlocks the associated mutex and then relocks it by calling
read_write_mutex::lock()
- else
- locks the associated mutex by calling read_write_mutex::lock()
- #has_write_lock() == true
- Note that the lock switch is not atomic. This means that whatever
resource is protected by the mutex might have been modified during the
call to lock_write().
!*/
void unlock (
);
/*!
ensures
- if (has_read_lock() || has_write_lock()) then
- unlocks the associated mutex. This is useful if you want to unlock a
mutex before the auto_mutex_readonly destructor executes.
- #has_read_lock() == false
- #has_write_lock() == false
!*/
private:
// restricted functions
auto_mutex_readonly(auto_mutex_readonly&); // copy constructor
auto_mutex_readonly& operator=(auto_mutex_readonly&); // assignment operator
};
// ----------------------------------------------------------------------------------------
}
#endif // DLIB_AUTO_MUTEX_EXTENSIOn_ABSTRACT_