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; // NO_CODESONAR (cpp:S3657)
65 
77  virtual Status create(FwEnumStoreType id,
78  const Fw::ConstStringBase& name,
79  FwSizeType depth,
80  FwSizeType messageSize) = 0;
81 
86  virtual void teardown() = 0;
87 
102  virtual Status send(const U8* buffer, FwSizeType size, FwQueuePriorityType priority, BlockingType blockType) = 0;
103 
119  virtual Status receive(U8* destination,
120  FwSizeType capacity,
121  BlockingType blockType,
122  FwSizeType& actualSize,
123  FwQueuePriorityType& priority) = 0;
124 
130  virtual FwSizeType getMessagesAvailable() const = 0;
131 
137  virtual FwSizeType getMessageHighWaterMark() const = 0;
138 
141  virtual QueueHandle* getHandle() = 0;
142 
162  static QueueInterface* getDelegate(QueueHandleStorage& aligned_placement_new_memory);
163 };
164 
165 class Queue final : public QueueInterface {
166  public:
168  Queue();
169 
171  virtual ~Queue();
172 
174  Queue(const Queue& other) = delete;
175 
177  Queue(const Queue* other) = delete;
178 
180  QueueInterface& operator=(const QueueInterface& other) override = delete;
181 
193  const Fw::ConstStringBase& name,
194  FwSizeType depth,
195  FwSizeType messageSize) override;
196 
202  void teardown() override;
203 
218  Status send(const U8* buffer, FwSizeType size, FwQueuePriorityType priority, BlockingType blockType) override;
219 
236  Status receive(U8* destination,
237  FwSizeType capacity,
238  BlockingType blockType,
239  FwSizeType& actualSize,
240  FwQueuePriorityType& priority) override;
241 
248  FwSizeType getMessagesAvailable() const override;
249 
255  FwSizeType getMessageHighWaterMark() const override;
256 
259  QueueHandle* getHandle() override;
260 
271  Status send(const Fw::LinearBufferBase& message, FwQueuePriorityType priority, BlockingType blockType);
272 
284  Status receive(Fw::LinearBufferBase& destination, BlockingType blockType, FwQueuePriorityType& priority);
285 
287  FwSizeType getDepth() const;
288 
290  FwSizeType getMessageSize() const;
291 
293  const QueueString& getName() const;
294 
296  static FwSizeType getNumQueues();
297 
299  static Os::Mutex& getStaticMutex();
300 
301  private:
302  QueueString m_name;
303  FwSizeType m_depth;
304  FwSizeType m_size;
305  static Os::Mutex s_countLock;
306  static FwSizeType s_queueCount;
307 
308 #if FW_QUEUE_REGISTRATION
309  public:
313  static void setRegistry(QueueRegistry* registry);
314 
315  private:
316  static QueueRegistry* s_queueRegistry;
317 #endif
318 
319  // This section is used to store the implementation-defined file handle. To Os::File and fprime, this type is
320  // opaque and thus normal allocation cannot be done. Instead, we allow the implementor to store then handle in
321  // the byte-array here and set `handle` to that address for storage.
322  //
323  alignas(FW_HANDLE_ALIGNMENT) QueueHandleStorage m_handle_storage;
324  QueueInterface& m_delegate;
325 };
331  public:
333  QueueRegistry() = default;
335  virtual ~QueueRegistry() = default;
336 
342  virtual void registerQueue(Queue* queue) = 0;
343 };
344 } // namespace Os
345 #endif
Status create(FwEnumStoreType id, const Fw::ConstStringBase &name, FwSizeType depth, FwSizeType messageSize) override
create queue storage through delegate
Definition: Queue.cpp:22
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:71
I32 FwEnumStoreType
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:139
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:127
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
message send error
Definition: Queue.hpp:36
Queue()
queue constructor
Definition: Queue.cpp:16
virtual ~QueueInterface()=default
default queue destructor
virtual void registerQueue(Queue *queue)=0
queue registry callback
virtual ~Queue()
default queue destructor
Definition: Queue.cpp:18
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
virtual Status create(FwEnumStoreType id, const Fw::ConstStringBase &name, FwSizeType depth, FwSizeType messageSize)=0
create queue storage
QueueHandle * getHandle() override
return the underlying queue handle (implementation specific). Delegates to implementation.
Definition: Queue.cpp:99
virtual QueueHandle * getHandle()=0
return the underlying queue handle (implementation specific)
const QueueString & getName() const
get the queue&#39;s name
Definition: Queue.cpp:135
FwSizeType getMessageSize() const
get the queue&#39;s message maximum size
Definition: Queue.cpp:131
Status send(const U8 *buffer, FwSizeType size, FwQueuePriorityType priority, BlockingType blockType) override
send a message into the queue through delegate
Definition: Queue.cpp:54
message receive error
Definition: Queue.hpp:37
virtual void teardown()=0
teardown the queue
Queue wasn&#39;t initialized successfully.
Definition: Queue.hpp:34
void teardown() override
teardown the queue
Definition: Queue.cpp:49
If non-blocking, all the messages have been drained.
Definition: Queue.hpp:33
uint8_t U8
8-bit unsigned integer
Definition: BasicTypes.h:53
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:144
QueueInterface()=default
default queue interface constructor
FwSizeType getMessagesAvailable() const override
get number of messages available
Definition: Queue.cpp:89
PlatformQueuePriorityType FwQueuePriorityType
The type of queue priorities used.
Declarations for Fw::ObjBase and Fw::ObjRegistry.
Queue feature is not supported.
Definition: Queue.hpp:40
A read-only abstract superclass for StringBase.
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:94
message sent/received okay
Definition: Queue.hpp:31
queue registry interface
Definition: Queue.hpp:330
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