mirror of
https://github.com/Icinga/icinga2.git
synced 2025-07-24 22:24:44 +02:00
Do not require olock on frozen Namespace
, Dictionary
& Array
This commit is contained in:
parent
2461e0415d
commit
57726fbb66
@ -96,7 +96,7 @@ void Array::Add(Value value)
|
||||
*/
|
||||
Array::Iterator Array::Begin()
|
||||
{
|
||||
ASSERT(OwnsLock());
|
||||
ASSERT(Frozen() || OwnsLock());
|
||||
|
||||
return m_Data.begin();
|
||||
}
|
||||
@ -110,7 +110,7 @@ Array::Iterator Array::Begin()
|
||||
*/
|
||||
Array::Iterator Array::End()
|
||||
{
|
||||
ASSERT(OwnsLock());
|
||||
ASSERT(Frozen() || OwnsLock());
|
||||
|
||||
return m_Data.end();
|
||||
}
|
||||
@ -327,7 +327,12 @@ Array::Ptr Array::Unique() const
|
||||
void Array::Freeze()
|
||||
{
|
||||
ObjectLock olock(this);
|
||||
m_Frozen = true;
|
||||
m_Frozen.store(true, std::memory_order_release);
|
||||
}
|
||||
|
||||
bool Array::Frozen() const
|
||||
{
|
||||
return m_Frozen.load(std::memory_order_acquire);
|
||||
}
|
||||
|
||||
Value Array::GetFieldByName(const String& field, bool sandboxed, const DebugInfo& debugInfo) const
|
||||
|
@ -4,6 +4,7 @@
|
||||
#define ARRAY_H
|
||||
|
||||
#include "base/i2-base.hpp"
|
||||
#include "base/atomic.hpp"
|
||||
#include "base/objectlock.hpp"
|
||||
#include "base/value.hpp"
|
||||
#include <boost/range/iterator.hpp>
|
||||
@ -98,13 +99,14 @@ public:
|
||||
|
||||
Array::Ptr Unique() const;
|
||||
void Freeze();
|
||||
bool Frozen() const;
|
||||
|
||||
Value GetFieldByName(const String& field, bool sandboxed, const DebugInfo& debugInfo) const override;
|
||||
void SetFieldByName(const String& field, const Value& value, const DebugInfo& debugInfo) override;
|
||||
|
||||
private:
|
||||
std::vector<Value> m_Data; /**< The data for the array. */
|
||||
bool m_Frozen{false};
|
||||
Atomic<bool> m_Frozen{false};
|
||||
};
|
||||
|
||||
Array::Iterator begin(const Array::Ptr& x);
|
||||
|
@ -132,7 +132,7 @@ bool Dictionary::Contains(const String& key) const
|
||||
*/
|
||||
Dictionary::Iterator Dictionary::Begin()
|
||||
{
|
||||
ASSERT(OwnsLock());
|
||||
ASSERT(Frozen() || OwnsLock());
|
||||
|
||||
return m_Data.begin();
|
||||
}
|
||||
@ -146,7 +146,7 @@ Dictionary::Iterator Dictionary::Begin()
|
||||
*/
|
||||
Dictionary::Iterator Dictionary::End()
|
||||
{
|
||||
ASSERT(OwnsLock());
|
||||
ASSERT(Frozen() || OwnsLock());
|
||||
|
||||
return m_Data.end();
|
||||
}
|
||||
@ -276,7 +276,12 @@ String Dictionary::ToString() const
|
||||
void Dictionary::Freeze()
|
||||
{
|
||||
ObjectLock olock(this);
|
||||
m_Frozen = true;
|
||||
m_Frozen.store(true, std::memory_order_release);
|
||||
}
|
||||
|
||||
bool Dictionary::Frozen() const
|
||||
{
|
||||
return m_Frozen.load(std::memory_order_acquire);
|
||||
}
|
||||
|
||||
Value Dictionary::GetFieldByName(const String& field, bool, const DebugInfo& debugInfo) const
|
||||
|
@ -4,6 +4,7 @@
|
||||
#define DICTIONARY_H
|
||||
|
||||
#include "base/i2-base.hpp"
|
||||
#include "base/atomic.hpp"
|
||||
#include "base/object.hpp"
|
||||
#include "base/value.hpp"
|
||||
#include <boost/range/iterator.hpp>
|
||||
@ -69,6 +70,7 @@ public:
|
||||
String ToString() const override;
|
||||
|
||||
void Freeze();
|
||||
bool Frozen() const;
|
||||
|
||||
Value GetFieldByName(const String& field, bool sandboxed, const DebugInfo& debugInfo) const override;
|
||||
void SetFieldByName(const String& field, const Value& value, const DebugInfo& debugInfo) override;
|
||||
@ -78,7 +80,7 @@ public:
|
||||
private:
|
||||
std::map<String, Value> m_Data; /**< The data for the dictionary. */
|
||||
mutable std::shared_timed_mutex m_DataMutex;
|
||||
bool m_Frozen{false};
|
||||
Atomic<bool> m_Frozen{false};
|
||||
};
|
||||
|
||||
Dictionary::Iterator begin(const Dictionary::Ptr& x);
|
||||
|
@ -119,7 +119,12 @@ void Namespace::Remove(const String& field)
|
||||
void Namespace::Freeze() {
|
||||
ObjectLock olock(this);
|
||||
|
||||
m_Frozen = true;
|
||||
m_Frozen.store(true, std::memory_order_release);
|
||||
}
|
||||
|
||||
bool Namespace::Frozen() const
|
||||
{
|
||||
return m_Frozen.load(std::memory_order_acquire);
|
||||
}
|
||||
|
||||
std::shared_lock<std::shared_timed_mutex> Namespace::ReadLockUnlessFrozen() const
|
||||
@ -160,14 +165,14 @@ bool Namespace::GetOwnField(const String& field, Value *result) const
|
||||
|
||||
Namespace::Iterator Namespace::Begin()
|
||||
{
|
||||
ASSERT(OwnsLock());
|
||||
ASSERT(Frozen() || OwnsLock());
|
||||
|
||||
return m_Data.begin();
|
||||
}
|
||||
|
||||
Namespace::Iterator Namespace::End()
|
||||
{
|
||||
ASSERT(OwnsLock());
|
||||
ASSERT(Frozen() || OwnsLock());
|
||||
|
||||
return m_Data.end();
|
||||
}
|
||||
|
@ -73,6 +73,7 @@ public:
|
||||
bool Contains(const String& field) const;
|
||||
void Remove(const String& field);
|
||||
void Freeze();
|
||||
bool Frozen() const;
|
||||
|
||||
Iterator Begin();
|
||||
Iterator End();
|
||||
|
Loading…
x
Reference in New Issue
Block a user