1 /* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
3 #include "base/objectlock.hpp"
6 using namespace icinga;
8 #define I2MUTEX_UNLOCKED 0
9 #define I2MUTEX_LOCKED 1
11 ObjectLock::~ObjectLock()
16 ObjectLock::ObjectLock(const Object::Ptr& object)
17 : ObjectLock(object.get())
21 ObjectLock::ObjectLock(const Object *object)
22 : m_Object(object), m_Locked(false)
28 void ObjectLock::Lock()
30 ASSERT(!m_Locked && m_Object);
32 m_Object->m_Mutex.lock();
37 if (++m_Object->m_LockCount == 1u) {
38 m_Object->m_LockOwner.store(std::this_thread::get_id());
43 void ObjectLock::Unlock()
46 if (m_Locked && !--m_Object->m_LockCount) {
47 m_Object->m_LockOwner.store(decltype(m_Object->m_LockOwner.load())());
52 m_Object->m_Mutex.unlock();