]> granicus.if.org Git - icinga2/blob - lib/base/objectlock.cpp
Merge pull request #7185 from Icinga/bugfix/gelfwriter-wrong-log-facility
[icinga2] / lib / base / objectlock.cpp
1 /* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
2
3 #include "base/objectlock.hpp"
4 #include <thread>
5
6 using namespace icinga;
7
8 #define I2MUTEX_UNLOCKED 0
9 #define I2MUTEX_LOCKED 1
10
11 ObjectLock::~ObjectLock()
12 {
13         Unlock();
14 }
15
16 ObjectLock::ObjectLock(const Object::Ptr& object)
17         : ObjectLock(object.get())
18 {
19 }
20
21 ObjectLock::ObjectLock(const Object *object)
22         : m_Object(object), m_Locked(false)
23 {
24         if (m_Object)
25                 Lock();
26 }
27
28 void ObjectLock::Lock()
29 {
30         ASSERT(!m_Locked && m_Object);
31
32         m_Object->m_Mutex.lock();
33
34         m_Locked = true;
35
36 #ifdef I2_DEBUG
37         if (++m_Object->m_LockCount == 1u) {
38                 m_Object->m_LockOwner.store(std::this_thread::get_id());
39         }
40 #endif /* I2_DEBUG */
41 }
42
43 void ObjectLock::Unlock()
44 {
45 #ifdef I2_DEBUG
46         if (m_Locked && !--m_Object->m_LockCount) {
47                 m_Object->m_LockOwner.store(decltype(m_Object->m_LockOwner.load())());
48         }
49 #endif /* I2_DEBUG */
50
51         if (m_Locked) {
52                 m_Object->m_Mutex.unlock();
53                 m_Locked = false;
54         }
55 }