#include <atomic>
#include <cstddef>
#include <cstdint>
+#include <mutex>
#include <thread>
#include <vector>
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;
/* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
#include "base/objectlock.hpp"
-#include <boost/thread/recursive_mutex.hpp>
#include <thread>
using namespace icinga;
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;
#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
#endif /* I2_DEBUG */
if (m_Locked) {
- reinterpret_cast<boost::recursive_mutex *>(m_Object->m_Mutex)->unlock();
+ m_Object->m_Mutex.unlock();
m_Locked = false;
}
}