Make Object#m_Mutex std::recursive_mutex

refs #7123
This commit is contained in:
Alexander A. Klimov 2019-04-17 18:15:32 +02:00
parent 7e6868bc99
commit d8c9fdf1d4
4 changed files with 4 additions and 66 deletions

View File

@ -36,7 +36,6 @@ Object::Object()
*/
Object::~Object()
{
delete reinterpret_cast<boost::recursive_mutex *>(m_Mutex);
}
/**

View File

@ -9,6 +9,7 @@
#include <atomic>
#include <cstddef>
#include <cstdint>
#include <mutex>
#include <thread>
#include <vector>
@ -191,7 +192,7 @@ private:
Object& operator=(const Object& rhs) = delete;
std::atomic<uint_fast64_t> m_References;
mutable uintptr_t m_Mutex{0};
mutable std::recursive_mutex m_Mutex;
#ifdef I2_DEBUG
mutable std::atomic<std::thread::id> m_LockOwner;

View File

@ -1,7 +1,6 @@
/* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
#include "base/objectlock.hpp"
#include <boost/thread/recursive_mutex.hpp>
#include <thread>
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<boost::recursive_mutex *>(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<LONGLONG>(mtx), I2MUTEX_LOCKED);
# else /* _WIN64 */
InterlockedCompareExchange(&object->m_Mutex, reinterpret_cast<LONG>(mtx), I2MUTEX_LOCKED);
# endif /* _WIN64 */
#else /* _WIN32 */
__sync_bool_compare_and_swap(&object->m_Mutex, I2MUTEX_LOCKED, reinterpret_cast<uintptr_t>(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<boost::recursive_mutex *>(m_Object->m_Mutex)->unlock();
m_Object->m_Mutex.unlock();
m_Locked = false;
}
}

View File

@ -19,12 +19,7 @@ public:
~ObjectLock();
static void LockMutex(const Object *object);
void Lock();
static void Spin(unsigned int it);
void Unlock();
private: