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 
77  virtual Status create(FwEnumStoreType id,
78  const Fw::ConstStringBase& name,
79  FwSizeType depth,
80  FwSizeType messageSize) = 0;
81 
88  virtual void teardown() {}
89 
104  virtual Status send(const U8* buffer, FwSizeType size, FwQueuePriorityType priority, BlockingType blockType) = 0;
105 
121  virtual Status receive(U8* destination,
122  FwSizeType capacity,
123  BlockingType blockType,
124  FwSizeType& actualSize,
125  FwQueuePriorityType& priority) = 0;
126 
132  virtual FwSizeType getMessagesAvailable() const = 0;
133 
139  virtual FwSizeType getMessageHighWaterMark() const = 0;
140 
143  virtual QueueHandle* getHandle() = 0;
144 
164  static QueueInterface* getDelegate(QueueHandleStorage& aligned_placement_new_memory);
165 };
166 
167 class Queue final : public QueueInterface {
168  public:
170  Queue();
171 
173  virtual ~Queue();
174 
176  Queue(const Queue& other) = delete;
177 
179  Queue(const Queue* other) = delete;
180 
182  QueueInterface& operator=(const QueueInterface& other) override = delete;
183 
195  const Fw::ConstStringBase& name,
196  FwSizeType depth,
197  FwSizeType messageSize) override;
198 
204  void teardown() override;
205 
220  Status send(const U8* buffer, FwSizeType size, FwQueuePriorityType priority, BlockingType blockType) override;
221 
238  Status receive(U8* destination,
239  FwSizeType capacity,
240  BlockingType blockType,
241  FwSizeType& actualSize,
242  FwQueuePriorityType& priority) override;
243 
250  FwSizeType getMessagesAvailable() const override;
251 
257  FwSizeType getMessageHighWaterMark() const override;
258 
261  QueueHandle* getHandle() override;
262 
273  Status send(const Fw::LinearBufferBase& message, FwQueuePriorityType priority, BlockingType blockType);
274 
286  Status receive(Fw::LinearBufferBase& destination, BlockingType blockType, FwQueuePriorityType& priority);
287 
289  FwSizeType getDepth() const;
290 
292  FwSizeType getMessageSize() const;
293 
295  const QueueString& getName() const;
296 
298  static FwSizeType getNumQueues();
299 
301  static Os::Mutex& getStaticMutex();
302 
303  private:
304  QueueString m_name;
305  FwSizeType m_depth;
306  FwSizeType m_size;
307  static Os::Mutex s_countLock;
308  static FwSizeType s_queueCount;
309 
310 #if FW_QUEUE_REGISTRATION
311  public:
315  static void setRegistry(QueueRegistry* registry);
316 
317  private:
318  static QueueRegistry* s_queueRegistry;
319 #endif
320 
321  // This section is used to store the implementation-defined file handle. To Os::File and fprime, this type is
322  // opaque and thus normal allocation cannot be done. Instead, we allow the implementor to store then handle in
323  // the byte-array here and set `handle` to that address for storage.
324  //
325  alignas(FW_HANDLE_ALIGNMENT) QueueHandleStorage m_handle_storage;
326  QueueInterface& m_delegate;
327 };
333  public:
335  QueueRegistry() = default;
337  virtual ~QueueRegistry() = default;
338 
344  virtual void registerQueue(Queue* queue) = 0;
345 };
346 } // namespace Os
347 #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
virtual void teardown()
teardown the queue
Definition: Queue.hpp:88
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
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:332
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