From: Alexander A. Klimov Date: Wed, 17 Apr 2019 16:15:32 +0000 (+0200) Subject: Make Object#m_Mutex std::recursive_mutex X-Git-Tag: v2.11.0-rc1~145^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d8c9fdf1d4723896915b8e734d53dc78f70d1866;p=icinga2 Make Object#m_Mutex std::recursive_mutex refs #7123 --- diff --git a/lib/base/object.cpp b/lib/base/object.cpp index 1d40a753d..58e2a9160 100644 --- a/lib/base/object.cpp +++ b/lib/base/object.cpp @@ -36,7 +36,6 @@ Object::Object() */ Object::~Object() { - delete reinterpret_cast(m_Mutex); } /** diff --git a/lib/base/object.hpp b/lib/base/object.hpp index 43cf7cee7..5a90cfa64 100644 --- a/lib/base/object.hpp +++ b/lib/base/object.hpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -191,7 +192,7 @@ private: Object& operator=(const Object& rhs) = delete; std::atomic m_References; - mutable uintptr_t m_Mutex{0}; + mutable std::recursive_mutex m_Mutex; #ifdef I2_DEBUG mutable std::atomic m_LockOwner; diff --git a/lib/base/objectlock.cpp b/lib/base/objectlock.cpp index 5a06488e9..fc0c7c631 100644 --- a/lib/base/objectlock.cpp +++ b/lib/base/objectlock.cpp @@ -1,7 +1,6 @@ /* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */ #include "base/objectlock.hpp" -#include #include using namespace icinga; @@ -26,48 +25,11 @@ ObjectLock::ObjectLock(const Object *object) Lock(); } -void ObjectLock::LockMutex(const Object *object) -{ - unsigned int it = 0; - -#ifdef _WIN32 -# ifdef _WIN64 - while (likely(InterlockedCompareExchange64((LONGLONG *)&object->m_Mutex, I2MUTEX_LOCKED, I2MUTEX_UNLOCKED) != I2MUTEX_UNLOCKED)) { -# else /* _WIN64 */ - while (likely(InterlockedCompareExchange(&object->m_Mutex, I2MUTEX_LOCKED, I2MUTEX_UNLOCKED) != I2MUTEX_UNLOCKED)) { -# endif /* _WIN64 */ -#else /* _WIN32 */ - while (likely(!__sync_bool_compare_and_swap(&object->m_Mutex, I2MUTEX_UNLOCKED, I2MUTEX_LOCKED))) { -#endif /* _WIN32 */ - if (likely(object->m_Mutex > I2MUTEX_LOCKED)) { - auto *mtx = reinterpret_cast(object->m_Mutex); - mtx->lock(); - - return; - } - - Spin(it); - it++; - } - - auto *mtx = new boost::recursive_mutex(); - mtx->lock(); -#ifdef _WIN32 -# ifdef _WIN64 - InterlockedCompareExchange64((LONGLONG *)&object->m_Mutex, reinterpret_cast(mtx), I2MUTEX_LOCKED); -# else /* _WIN64 */ - InterlockedCompareExchange(&object->m_Mutex, reinterpret_cast(mtx), I2MUTEX_LOCKED); -# endif /* _WIN64 */ -#else /* _WIN32 */ - __sync_bool_compare_and_swap(&object->m_Mutex, I2MUTEX_LOCKED, reinterpret_cast(mtx)); -#endif /* _WIN32 */ -} - void ObjectLock::Lock() { ASSERT(!m_Locked && m_Object); - LockMutex(m_Object); + m_Object->m_Mutex.lock(); m_Locked = true; @@ -78,25 +40,6 @@ void ObjectLock::Lock() #endif /* I2_DEBUG */ } -void ObjectLock::Spin(unsigned int it) -{ - if (it < 8) { - /* Do nothing. */ - } -#ifdef SPIN_PAUSE - else if (it < 16) { - SPIN_PAUSE(); - } -#endif /* SPIN_PAUSE */ - else { -#ifdef _WIN32 - Sleep(0); -#else /* _WIN32 */ - sched_yield(); -#endif /* _WIN32 */ - } -} - void ObjectLock::Unlock() { #ifdef I2_DEBUG @@ -106,7 +49,7 @@ void ObjectLock::Unlock() #endif /* I2_DEBUG */ if (m_Locked) { - reinterpret_cast(m_Object->m_Mutex)->unlock(); + m_Object->m_Mutex.unlock(); m_Locked = false; } } diff --git a/lib/base/objectlock.hpp b/lib/base/objectlock.hpp index 96cbac3d7..277f99041 100644 --- a/lib/base/objectlock.hpp +++ b/lib/base/objectlock.hpp @@ -19,12 +19,7 @@ public: ~ObjectLock(); - static void LockMutex(const Object *object); - void Lock(); - - static void Spin(unsigned int it); - void Unlock(); private: