MADARA  3.1.8
Queue.inl
Go to the documentation of this file.
1 #include <sstream>
2 
3 #include "Queue.h"
5 
7  const KnowledgeUpdateSettings & settings)
8 : context_ (0), settings_ (settings)
9 {
10 }
11 
13  const std::string & name,
15  const KnowledgeUpdateSettings & settings)
16 : context_ (&(knowledge.get_context ())), name_ (name),
17  count_ (name + ".count", knowledge, 0),
18  head_ (name + ".head", knowledge, 0),
19  tail_ (name + ".tail", knowledge, 0),
20  queue_ (name, knowledge),
21  settings_ (settings)
22 {
23  resize ();
24 }
25 
27  const std::string & name,
29  const KnowledgeUpdateSettings & settings)
30 : context_ (knowledge.get_context ()), name_ (name),
31  count_ (name + ".count", knowledge),
32  head_ (name + ".head", knowledge),
33  tail_ (name + ".tail", knowledge),
34  queue_ (name, knowledge),
35  settings_ (settings)
36 {
37  resize ();
38 }
39 
41  const std::string & name,
43  int size,
44  const KnowledgeUpdateSettings & settings)
45 : context_ (&(knowledge.get_context ())), name_ (name),
46  count_ (name + ".count", knowledge, 0),
47  head_ (name + ".head", knowledge, 0),
48  tail_ (name + ".tail", knowledge, 0),
49  queue_ (name, knowledge, size, false, settings),
50  settings_ (settings)
51 {
52 }
53 
55  const std::string & name,
57  int size,
58  const KnowledgeUpdateSettings & settings)
59 : context_ (knowledge.get_context ()), name_ (name),
60  count_ (name + ".count", knowledge, 0),
61  head_ (name + ".head", knowledge, 0),
62  tail_ (name + ".tail", knowledge, 0),
63  queue_ (name, knowledge, size, false, settings),
64  settings_ (settings)
65 {
66 }
67 
68 
70  : context_ (rhs.context_),
71  name_ (rhs.name_),
72  count_ (rhs.count_),
73  head_ (rhs.head_),
74  tail_ (rhs.tail_),
75  queue_ (rhs.queue_),
76  settings_ (rhs.settings_)
77 {
78 
79 }
80 
81 inline void
83 {
84  if (this != &rhs)
85  {
86  MADARA_GUARD_TYPE guard (mutex_), guard2 (rhs.mutex_);
87 
88  this->context_ = rhs.context_;
89  this->name_ = rhs.name_;
90  this->count_ = rhs.count_;
91  this->head_ = rhs.head_;
92  this->tail_ = rhs.tail_;
93  this->queue_ = rhs.queue_;
94  this->settings_ = rhs.settings_;
95  }
96 }
97 
98 
99 inline bool
101  const Queue & value) const
102 {
103  return name_ == value.get_name ();
104 }
105 
106 inline bool
108  const Queue & value) const
109 {
110  return name_ != value.get_name ();
111 }
112 
113 template<typename... Args>
114 inline bool
116 {
117  return enqueue (KnowledgeRecord (std::forward<Args>(args)...));
118 }
119 
120 inline void
122 {
123  if (context_ && name_ != "" && count_ > 0)
124  {
125  ContextGuard context_guard (*context_);
126  MADARA_GUARD_TYPE guard (mutex_);
127 
128  count_ = 0;
129  head_ = *tail_;
130  }
131 }
132 
135 {
137  if (context_ && name_ != "" &&
138  (KnowledgeRecord::Integer)position < *count_)
139  {
140  ContextGuard context_guard (*context_);
141  MADARA_GUARD_TYPE guard (mutex_);
142 
143  size_t index = (size_t)increment (
144  *head_, (KnowledgeRecord::Integer)position);
145 
146  result = context_->get (queue_.vector_[index], settings_);
147  }
148  return result;
149 }
150 
153 {
154  MADARA_GUARD_TYPE guard (mutex_);
155  return name_;
156 }
157 
158 inline size_t
160 {
161  return queue_.size ();
162 }
163 
164 inline size_t
166 {
167  return (size_t)(*count_);
168 }
169 
170 void
172 {
173  if (context_)
174  {
175  ContextGuard context_guard (*context_);
176  MADARA_GUARD_TYPE guard (mutex_);
177 
178  queue_.resize (size, false);
179 
181  {
183  }
184  }
185 }
186 
189  const KnowledgeUpdateSettings & settings)
190 {
191  MADARA_GUARD_TYPE guard (mutex_);
192 
193  KnowledgeUpdateSettings old_settings = settings_;
194 
195  settings_ = settings;
196 
197  return old_settings;
198 }
199 
200 void
202  uint32_t quality,
203  const KnowledgeReferenceSettings & settings)
204 {
205  if (context_)
206  {
207  ContextGuard context_guard (*context_);
208  MADARA_GUARD_TYPE guard (mutex_);
209  context_->set_quality (name_, quality, true, settings);
210  }
211 }
This class encapsulates an entry in a KnowledgeBase.
bool operator==(const Queue &value) const
Checks for equality.
Definition: Queue.inl:100
Queue(const KnowledgeUpdateSettings &settings=KnowledgeUpdateSettings())
Default constructor.
Definition: Queue.inl:6
void resize(int size=-1)
Resizes the queue.
Definition: Queue.inl:171
bool emplace(Args &&...args)
Enqueues a new record to the end of the queue.
Definition: Queue.inl:115
madara::knowledge::KnowledgeRecord get(const std::string &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Atomically returns the value of a variable.
bool operator!=(const Queue &value) const
Checks for inequality.
Definition: Queue.inl:107
void clear(void)
Clears the queue.
Definition: Queue.inl:121
Integer tail_
Tail of the queue.
Definition: Queue.h:269
size_t count(void)
Returns the number of records in the queue.
Definition: Queue.inl:165
size_t size(void) const
Returns the size of the local vector.
Definition: Vector.cpp:310
std::vector< VariableReference > vector_
Values of the array.
Definition: Vector.h:612
size_t size(void)
Returns the maximum size of the queue.
Definition: Queue.inl:159
Integer count_
Count of elements in queue.
Definition: Queue.h:259
knowledge::KnowledgeRecord::Integer increment(knowledge::KnowledgeRecord::Integer base, knowledge::KnowledgeRecord::Integer value)
Increments the base by the value, using size as a boundary.
Definition: Queue.h:230
void set_quality(uint32_t quality, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings(false))
Sets the quality of writing to the counter variables.
Definition: Queue.inl:201
std::string name_
Prefix of variable.
Definition: Queue.h:254
std::string get_name(void) const
Returns the name of the variable.
Definition: Queue.inl:152
A thread-safe guard for a context or knowledge base.
Definition: ContextGuard.h:23
void resize(int size=-1, bool delete_vars=true)
Resizes the vector.
Definition: Vector.cpp:221
ThreadSafeContext * context_
Variable context that we are modifying.
Definition: Queue.h:249
bool enqueue(const knowledge::KnowledgeRecord &record)
Enqueues a record to the end of the queue.
Definition: Queue.cpp:7
Vector queue_
Underlying array of records.
Definition: Queue.h:274
knowledge::KnowledgeRecord inspect(size_t position)
Retrieves a record at a position in the queue.
Definition: Queue.inl:134
This class provides a distributed knowledge base to users.
Definition: KnowledgeBase.h:44
Integer head_
Head of the queue.
Definition: Queue.h:264
static constexpr struct madara::knowledge::tags::string_t string
KnowledgeUpdateSettings settings_
Settings for modifications.
Definition: Queue.h:279
This class stores thread-safe queue within the knowledge base.
Definition: Queue.h:34
Provides functions and classes for the distributed knowledge base.
void operator=(const Queue &rhs)
Assignment operator.
Definition: Queue.inl:82
Settings for applying knowledge updates.
uint32_t set_quality(const std::string &key, uint32_t quality, bool force_update, const KnowledgeReferenceSettings &settings)
Atomically sets quality of this process for a variable.
KnowledgeUpdateSettings set_settings(const KnowledgeUpdateSettings &settings)
Sets the update settings for the variable.
Definition: Queue.inl:188
Settings for applying knowledge updates.
MADARA_LOCK_TYPE mutex_
guard for access and changes
Definition: Queue.h:244
Provides an interface for external functions into the MADARA KaRL variable settings.