F´ Flight Software - C/C++ Documentation
A framework for building embedded system applications to NASA flight quality standards.
Queue.hpp
Go to the documentation of this file.
1 // ======================================================================
2 // \title Os/Queue.hpp
3 // \brief common function definitions for Os::Queue
4 // ======================================================================
5 #ifndef Os_Queue_hpp_
6 #define Os_Queue_hpp_
7 
9 #include <Fw/Obj/ObjBase.hpp>
11 #include <Os/Mutex.hpp>
12 #include <Os/Os.hpp>
13 #include <Os/QueueString.hpp>
14 namespace Os {
15 // Forward declaration for registry
16 class QueueRegistry;
17 
19 class QueueHandle {};
20 
28  public:
30  enum Status {
39  FULL,
43  };
44 
46  enum BlockingType {
49  };
50 
52  QueueInterface() = default;
53 
55  virtual ~QueueInterface() = default;
56 
58  QueueInterface(const QueueInterface& other) = delete;
59 
61  QueueInterface(const QueueInterface* other) = delete;
62 
64  virtual QueueInterface& operator=(const QueueInterface& other) = delete;
65 
76  virtual Status create(const Fw::StringBase& name, FwSizeType depth, FwSizeType messageSize) = 0;
77 
92  virtual Status send(const U8* buffer, FwSizeType size, FwQueuePriorityType priority, BlockingType blockType) = 0;
93 
109  virtual Status receive(U8* destination,
110  FwSizeType capacity,
111  BlockingType blockType,
112  FwSizeType& actualSize,
113  FwQueuePriorityType& priority) = 0;
114 
120  virtual FwSizeType getMessagesAvailable() const = 0;
121 
127  virtual FwSizeType getMessageHighWaterMark() const = 0;
128 
131  virtual QueueHandle* getHandle() = 0;
132 
152  static QueueInterface* getDelegate(QueueHandleStorage& aligned_placement_new_memory);
153 };
154 
155 class Queue final : public QueueInterface {
156  public:
158  Queue();
159 
161  virtual ~Queue();
162 
164  Queue(const Queue& other) = delete;
165 
167  Queue(const Queue* other) = delete;
168 
170  QueueInterface& operator=(const QueueInterface& other) override = delete;
171 
182  Status create(const Fw::StringBase& name, FwSizeType depth, FwSizeType messageSize) override;
183 
198  Status send(const U8* buffer, FwSizeType size, FwQueuePriorityType priority, BlockingType blockType) override;
199 
216  Status receive(U8* destination,
217  FwSizeType capacity,
218  BlockingType blockType,
219  FwSizeType& actualSize,
220  FwQueuePriorityType& priority) override;
221 
228  FwSizeType getMessagesAvailable() const override;
229 
235  FwSizeType getMessageHighWaterMark() const override;
236 
239  QueueHandle* getHandle() override;
240 
251  Status send(const Fw::SerializeBufferBase& message, FwQueuePriorityType priority, BlockingType blockType);
252 
264  Status receive(Fw::SerializeBufferBase& destination, BlockingType blockType, FwQueuePriorityType& priority);
265 
267  FwSizeType getDepth() const;
268 
270  FwSizeType getMessageSize() const;
271 
273  const QueueString& getName() const;
274 
276  static FwSizeType getNumQueues();
277 
279  static Os::Mutex& getStaticMutex();
280 
281  private:
282  QueueString m_name;
283  FwSizeType m_depth;
284  FwSizeType m_size;
285  static Os::Mutex s_countLock;
286  static FwSizeType s_queueCount;
287 
288 #if FW_QUEUE_REGISTRATION
289  public:
293  static void setRegistry(QueueRegistry* registry);
294 
295  private:
296  static QueueRegistry* s_queueRegistry;
297 #endif
298 
299  // This section is used to store the implementation-defined file handle. To Os::File and fprime, this type is
300  // opaque and thus normal allocation cannot be done. Instead, we allow the implementor to store then handle in
301  // the byte-array here and set `handle` to that address for storage.
302  //
303  alignas(FW_HANDLE_ALIGNMENT) QueueHandleStorage m_handle_storage;
304  QueueInterface& m_delegate;
305 };
311  public:
313  QueueRegistry() = default;
315  virtual ~QueueRegistry() = default;
316 
322  virtual void registerQueue(Queue* queue) = 0;
323 };
324 } // namespace Os
325 #endif
QueueInterface & operator=(const QueueInterface &other) override=delete
assignment operator is forbidden
PlatformSizeType FwSizeType
invalid priority requested
Definition: Queue.hpp:38
Status receive(U8 *destination, FwSizeType capacity, BlockingType blockType, FwSizeType &actualSize, FwQueuePriorityType &priority) override
receive a message from the queue through delegate
Definition: Queue.cpp:59
virtual QueueInterface & operator=(const QueueInterface &other)=delete
assignment operator is forbidden
Status
status returned from the queue send function
Definition: Queue.hpp:30
QueueHandle parent class.
Definition: Queue.hpp:19
static FwSizeType getNumQueues()
get number of queues system-wide
Definition: Queue.cpp:127
QueueRegistry()=default
Default QueueRegistry.
base queue interface
Definition: Queue.hpp:27
virtual Status receive(U8 *destination, FwSizeType capacity, BlockingType blockType, FwSizeType &actualSize, FwQueuePriorityType &priority)=0
receive a message from the queue
FwSizeType getDepth() const
get the queue&#39;s depth in messages
Definition: Queue.cpp:115
static QueueInterface * getDelegate(QueueHandleStorage &aligned_placement_new_memory)
provide a pointer to a queue delegate object
Unexpected error; can&#39;t match with returns.
Definition: Queue.hpp:42
#define FW_HANDLE_ALIGNMENT
Alignment of handle storage.
Definition: FpConfig.h:346
message send error
Definition: Queue.hpp:36
Queue()
queue constructor
Definition: Queue.cpp:14
virtual ~QueueInterface()=default
default queue destructor
virtual void registerQueue(Queue *queue)=0
queue registry callback
virtual ~Queue()
default queue destructor
Definition: Queue.cpp:16
virtual ~QueueRegistry()=default
Default ~QueueRegistry.
Message will block until space is available.
Definition: Queue.hpp:47
virtual FwSizeType getMessagesAvailable() const =0
get number of messages available
required memory could not be allocated
Definition: Queue.hpp:41
QueueHandle * getHandle() override
return the underlying queue handle (implementation specific). Delegates to implementation.
Definition: Queue.cpp:87
virtual QueueHandle * getHandle()=0
return the underlying queue handle (implementation specific)
const QueueString & getName() const
get the queue&#39;s name
Definition: Queue.cpp:123
virtual Status create(const Fw::StringBase &name, FwSizeType depth, FwSizeType messageSize)=0
create queue storage
FwSizeType getMessageSize() const
get the queue&#39;s message maximum size
Definition: Queue.cpp:119
Status send(const U8 *buffer, FwSizeType size, FwQueuePriorityType priority, BlockingType blockType) override
send a message into the queue through delegate
Definition: Queue.cpp:42
message receive error
Definition: Queue.hpp:37
Queue wasn&#39;t initialized successfully.
Definition: Queue.hpp:34
If non-blocking, all the messages have been drained.
Definition: Queue.hpp:33
uint8_t U8
8-bit unsigned integer
Definition: BasicTypes.h:56
BlockingType
message type
Definition: Queue.hpp:46
attempted to send or receive with buffer too large, too small
Definition: Queue.hpp:35
static Os::Mutex & getStaticMutex()
get static mutex
Definition: Queue.cpp:132
QueueInterface()=default
default queue interface constructor
FwSizeType getMessagesAvailable() const override
get number of messages available
Definition: Queue.cpp:77
Status create(const Fw::StringBase &name, FwSizeType depth, FwSizeType messageSize) override
create queue storage through delegate
Definition: Queue.cpp:20
PlatformQueuePriorityType FwQueuePriorityType
The type of queue priorities used.
Declarations for Fw::ObjBase and Fw::ObjRegistry.
Queue feature is not supported.
Definition: Queue.hpp:40
U8 QueueHandleStorage[FW_QUEUE_HANDLE_MAX_SIZE]
Storage type for OSAL handles.
Definition: Os.hpp:10
virtual FwSizeType getMessageHighWaterMark() const =0
get maximum messages stored at any given time
FwSizeType getMessageHighWaterMark() const override
get maximum messages stored at any given time through delegate
Definition: Queue.cpp:82
message sent/received okay
Definition: Queue.hpp:31
queue registry interface
Definition: Queue.hpp:310
Queue was full when attempting to send a message.
Definition: Queue.hpp:39
virtual Status send(const U8 *buffer, FwSizeType size, FwQueuePriorityType priority, BlockingType blockType)=0
send a message into the queue
Message will return with status when space is unavailable.
Definition: Queue.hpp:48
creating an already created queue
Definition: Queue.hpp:32