]> granicus.if.org Git - icinga2/commitdiff
Make Object#m_Mutex std::recursive_mutex 7128/head
authorAlexander A. Klimov <alexander.klimov@icinga.com>
Wed, 17 Apr 2019 16:15:32 +0000 (18:15 +0200)
committerAlexander A. Klimov <alexander.klimov@icinga.com>
Wed, 17 Apr 2019 16:26:29 +0000 (18:26 +0200)
refs #7123

lib/base/object.cpp
lib/base/object.hpp
lib/base/objectlock.cpp
lib/base/objectlock.hpp

index 1d40a753d4dcac63a14b8e136dfb8a09c1fb02ff..58e2a916086272bc7728084b00f1cfd8c6b48aca 100644 (file)
@@ -36,7 +36,6 @@ Object::Object()
  */
 Object::~Object()
 {
-       delete reinterpret_cast<boost::recursive_mutex *>(m_Mutex);
 }
 
 /**
index 43cf7cee7c51eda9a3116880c5645d83a5dbc4cb..5a90cfa64f55b81b403f6b3c8d06ff37f3f35ff3 100644 (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;
index 5a06488e9c0f6523eb220f81f9a22a993c9078ab..fc0c7c6314199bc7e1ae7f29a0d4eb891b7741a4 100644 (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;
        }
 }
index 96cbac3d77762af48800491b4a75cc1eba5b7981..277f99041294bcbce9f73110eb6ed34de52e835a 100644 (file)
@@ -19,12 +19,7 @@ public:
 
        ~ObjectLock();
 
-       static void LockMutex(const Object *object);
-
        void Lock();
-
-       static void Spin(unsigned int it);
-
        void Unlock();
 
 private: