Ocean
Loading...
Searching...
No Matches
MessageQueue.h
Go to the documentation of this file.
1/*
2 * Copyright (c) Meta Platforms, Inc. and affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 */
7
8#ifndef FACEBOOK_NETWORK_MESSAGE_QUEUE_H
9#define FACEBOOK_NETWORK_MESSAGE_QUEUE_H
10
12
13#include "ocean/base/Lock.h"
14
15#include <queue>
16
17namespace Ocean
18{
19
20namespace Network
21{
22
23/**
24 * This class implements a message queue.
25 * @ingroup network
26 */
27class OCEAN_NETWORK_EXPORT MessageQueue
28{
29 public:
30
31 /**
32 * Definition of a message id.
33 */
34 using Id = uint32_t;
35
36 /**
37 * Returns an invalid message id.
38 * @return Invalid message id
39 */
40 static constexpr Id invalidId();
41
42 private:
43
44 /**
45 * Definition of a message pair.
46 */
47 using Message = std::pair<std::string, std::string>;
48
49 /**
50 * Definition of a queue holding message pairs.
51 */
52 using Queue = std::queue<Message>;
53
54 /**
55 * Definition of a map mapping message ids to message queues.
56 */
57 using MessageMap = std::unordered_map<Id, Queue>;
58
59 public:
60
61 /**
62 * Creates a new message queue.
63 */
64 MessageQueue() = default;
65
66 /**
67 * Move constructor.
68 * @param messageQueue The message queue object to be moved
69 */
70 MessageQueue(MessageQueue&& messageQueue);
71
72 /**
73 * Creates a new message queue.
74 * @param oldMessageAge The capacity of the queue, with range [1, infinity)
75 */
76 explicit MessageQueue(const unsigned int oldMessageAge);
77
78 /**
79 * Destructs a message queue.
80 */
82
83 /**
84 * Pushes a new message.
85 * Beware: To avoid a message overflow all messages older than the defined 'age' will be released.
86 * @param id Message id
87 * @param message The message to push
88 * @param value Optional message value to push
89 * @return True, if succeeded
90 */
91 bool push(const Id id, const std::string& message, const std::string& value);
92
93 /**
94 * Gets the front message for a given message id.
95 * @param id Message id to get the front message for
96 * @param message Resulting message
97 * @param value Resulting optional value
98 * @param popMessage True to pop the message after reading; False to leave it in the queue
99 * @return True, if succeeded
100 */
101 bool front(const Id id, std::string& message, std::string& value, const bool popMessage = false);
102
103 /**
104 * Gets the front message for a given message id and waits a specified time if no message is available.
105 * @param id Message id to get the front message for
106 * @param timeout Time to wait in seconds
107 * @param message Resulting message
108 * @param value Resulting optional value
109 * @param popMessage True to pop the message after reading; False to leave it in the queue
110 * @return True, if a message could be returned within the specified wait time
111 */
112 bool front(const Id id, const double timeout, std::string& message, std::string& value, const bool popMessage = false);
113
114 /**
115 * Pops the front message with a specified message id from the queue.
116 * @param id Message id to pop the front message for
117 */
118 void pop(const Id id);
119
120 /**
121 * Returns and pops the front message for a given message id and waits a specified time if no message is available.
122 * @param id Message id to get the front message for
123 * @param timeout Time to wait in seconds
124 * @return Resulting message, if any
125 */
126 std::string pop(const Id id, const double timeout);
127
128 /**
129 * Returns and pops the front message for a given message id and waits a specified time if no message is available.
130 * @param id Message id to get the front message for
131 * @param timeout Time to wait in seconds
132 * @param message Resulting message
133 * @param value Resulting optional value
134 * @return True, if a message could be popped within the specified wait time
135 */
136 bool pop(const Id id, const double timeout, std::string& message, std::string& value);
137
138 /**
139 * Clears the entire message queue.
140 */
141 void clear();
142
143 /**
144 * Clears all messages with a specified message id.
145 * @param id Message id to clear all messages for
146 */
147 void clear(const Id id);
148
149 /**
150 * Returns a unique message id within this message queue.
151 * @return Unique message id
152 */
154
155 /**
156 * Returns the last unique message id again.
157 * Beware: Do no use this id directly, use it for control purpose only!
158 * @return Last unique id
159 */
161
162 /**
163 * Move operator.
164 * @param messageQueue The message queue to be moved
165 * @return Reference to this object
166 */
168
169 protected:
170
171 /// Map holding all messages.
173
174 /// Definition of an message age of old and therefore unused messages.
175 unsigned int oldMessageAge_ = 500u;
176
177 /// Message id counter.
178 Id idCounter_ = invalidId();
179
180 /// Map lock.
182};
183
185{
186 return Id(0);
187}
188
189}
190
191}
192
193#endif // FACEBOOK_NETWORK_MESSAGE_QUEUE_H
This class implements a recursive lock object.
Definition Lock.h:31
This class implements a message queue.
Definition MessageQueue.h:28
Lock lock_
Map lock.
Definition MessageQueue.h:181
MessageQueue()=default
Creates a new message queue.
void clear()
Clears the entire message queue.
bool push(const Id id, const std::string &message, const std::string &value)
Pushes a new message.
MessageMap messageMap_
Map holding all messages.
Definition MessageQueue.h:172
std::string pop(const Id id, const double timeout)
Returns and pops the front message for a given message id and waits a specified time if no message is...
void pop(const Id id)
Pops the front message with a specified message id from the queue.
bool front(const Id id, std::string &message, std::string &value, const bool popMessage=false)
Gets the front message for a given message id.
bool front(const Id id, const double timeout, std::string &message, std::string &value, const bool popMessage=false)
Gets the front message for a given message id and waits a specified time if no message is available.
Id uniqueId()
Returns a unique message id within this message queue.
~MessageQueue()
Destructs a message queue.
static constexpr Id invalidId()
Returns an invalid message id.
Definition MessageQueue.h:184
MessageQueue(MessageQueue &&messageQueue)
Move constructor.
Id lastUniqueId()
Returns the last unique message id again.
MessageQueue & operator=(MessageQueue &&messageQueue)
Move operator.
MessageQueue(const unsigned int oldMessageAge)
Creates a new message queue.
bool pop(const Id id, const double timeout, std::string &message, std::string &value)
Returns and pops the front message for a given message id and waits a specified time if no message is...
std::pair< std::string, std::string > Message
Definition of a message pair.
Definition MessageQueue.h:47
void clear(const Id id)
Clears all messages with a specified message id.
uint32_t Id
Definition of a message id.
Definition MessageQueue.h:34
std::unordered_map< Id, Queue > MessageMap
Definition of a map mapping message ids to message queues.
Definition MessageQueue.h:57
std::queue< Message > Queue
Definition of a queue holding message pairs.
Definition MessageQueue.h:52
The namespace covering the entire Ocean framework.
Definition Accessor.h:15