}
-Mutex::Mutex(bool recursive) :
+Mutex::Mutex() :
impl_(NULL)
{
pthread_mutexattr_t attributes;
Deinitializer deinitializer(attributes);
// TODO: Distinguish if debug mode is enabled in compilation.
// If so, it should be PTHREAD_MUTEX_NORMAL or NULL
- int type = PTHREAD_MUTEX_ERRORCHECK;
- if (recursive) {
- type = PTHREAD_MUTEX_RECURSIVE;
- }
- result = pthread_mutexattr_settype(&attributes, type);
+ result = pthread_mutexattr_settype(&attributes, PTHREAD_MUTEX_ERRORCHECK);
if (result != 0) {
isc_throw(isc::InvalidOperation, strerror(result));
}
public:
/// \brief Constructor.
///
- /// Creates a mutex. Depending on the parameter, it is either recursive
- /// (the same thread may lock it multiple times, others wait; it must be
- /// unlocked as many times to become really unlocked) or normal (can be
- /// locked just once, if the same threads tries to lock it again, Bad
- /// Things Happen).
+ /// Creates a mutex. It is a non-recursive mutex (can be locked just once,
+ /// if the same threads tries to lock it again, Bad Things Happen).
///
/// Depending on compilation parameters and OS, the mutex may or may not
/// do some error and sanity checking. However, such checking is meant
/// only to aid development, not rely on it as a feature.
///
- /// \param recursive If the thread should be recursive (lockable multiple
- /// times from the same thread) or not.
/// \throw std::bad_alloc In case allocation of something (memory, the
/// OS mutex) fails.
/// \throw isc::InvalidOperation Other unspecified errors around the mutex.
/// This should be rare.
- Mutex(bool recursive = false);
+ Mutex();
/// \brief Destructor.
///
///
/// \throw isc::InvalidOperation when OS reports error. This usually
/// means an attempt to use the mutex in a wrong way (locking
- /// a non-recursive mutex a second time from the same thread,
- /// for example).
+ /// a mutex second time from the same thread, for example).
Locker(Mutex& mutex) :
mutex_(NULL)
{
namespace {
-// Test a recursive mutex can be locked multiple times
-TEST(MutexTest, recursiveLockMultiple) {
- Mutex mutex(true);
- EXPECT_FALSE(mutex.locked()); // Debug-only build
- Mutex::Locker l1(mutex);
- EXPECT_TRUE(mutex.locked()); // Debug-only build
- Mutex::Locker l2(mutex);
- Mutex::Locker l3(mutex);
- Mutex::Locker l4(mutex);
- Mutex::Locker l5(mutex);
-}
-
// If we try to lock the debug mutex multiple times, it should throw.
TEST(MutexTest, lockMultiple) {
// TODO: Once we support non-debug mutexes, disable the test if we compile