Plasma Engine  2.0
Loading...
Searching...
No Matches
MessageQueue.h
1
2#pragma once
3
4#include <Foundation/Communication/Message.h>
5#include <Foundation/Containers/Deque.h>
6#include <Foundation/Threading/Lock.h>
7#include <Foundation/Threading/Mutex.h>
8
16template <typename MetaDataType>
18{
19public:
20 struct Entry
21 {
22 PL_DECLARE_POD_TYPE();
23
24 plMessage* m_pMessage;
25 MetaDataType m_MetaData;
26 mutable plUInt64 m_uiMessageHash = 0;
27 };
28
29protected:
31 plMessageQueueBase(plAllocator* pAllocator); // [tested]
32
34 plMessageQueueBase(const plMessageQueueBase& rhs, plAllocator* pAllocator);
35
37 ~plMessageQueueBase(); // [tested]
38
40 void operator=(const plMessageQueueBase& rhs);
41
42public:
44 Entry& operator[](plUInt32 uiIndex); // [tested]
45
47 const Entry& operator[](plUInt32 uiIndex) const; // [tested]
48
50 plUInt32 GetCount() const;
51
53 bool IsEmpty() const;
54
56 void Clear();
57
59 void Reserve(plUInt32 uiCount);
60
62 void Compact();
63
65 void Enqueue(plMessage* pMessage, const MetaDataType& metaData); // [tested]
66
68 bool TryDequeue(plMessage*& out_pMessage, MetaDataType& out_metaData); // [tested]
69
71 bool TryPeek(plMessage*& out_pMessage, MetaDataType& out_metaData); // [tested]
72
74 Entry& Peek();
75
77 void Dequeue();
78
80 template <typename Comparer>
81 void Sort(const Comparer& comparer); // [tested]
82
84 void Lock(); // [tested]
85
87 void Unlock(); // [tested]
88
89private:
91 plMutex m_Mutex;
92};
93
95template <typename MetaDataType, typename AllocatorWrapper = plDefaultAllocatorWrapper>
96class plMessageQueue : public plMessageQueueBase<MetaDataType>
97{
98public:
100 plMessageQueue(plAllocator* pAllocator);
101
104
105 void operator=(const plMessageQueue<MetaDataType, AllocatorWrapper>& rhs);
106 void operator=(const plMessageQueueBase<MetaDataType>& rhs);
107};
108
109#include <Foundation/Communication/Implementation/MessageQueue_inl.h>
Base class for all memory allocators.
Definition Allocator.h:23
Definition Deque.h:270
Base class for all message types. Each message type has it's own id which is used to dispatch message...
Definition Message.h:22
Implementation of a message queue on top of a deque.
Definition MessageQueue.h:18
void operator=(const plMessageQueueBase &rhs)
Assignment operator.
Definition MessageQueue_inl.h:22
bool TryDequeue(plMessage *&out_pMessage, MetaDataType &out_metaData)
Dequeues the first element if the queue is not empty and returns true. Returns false if the queue is ...
Definition MessageQueue_inl.h:84
void Compact()
Tries to compact the array to avoid wasting memory.The resulting capacity is at least 'GetCount' (no ...
Definition MessageQueue_inl.h:64
bool IsEmpty() const
Returns true, if the queue does not contain any elements.
Definition MessageQueue_inl.h:46
void Dequeue()
Removes the first element from the queue. Not thread safe.
Definition MessageQueue_inl.h:125
void Clear()
Destructs all elements and sets the count to zero. Does not deallocate any data.
Definition MessageQueue_inl.h:52
~plMessageQueueBase()
Destructor.
Definition MessageQueue_inl.h:16
void Enqueue(plMessage *pMessage, const MetaDataType &metaData)
Enqueues the given message and meta-data. This method is thread safe.
Definition MessageQueue_inl.h:70
void Lock()
Acquires an exclusive lock on the queue. Do not use this method directly but use plLock instead.
Definition MessageQueue_inl.h:138
plUInt32 GetCount() const
Returns the number of active elements in the queue.
Definition MessageQueue_inl.h:40
bool TryPeek(plMessage *&out_pMessage, MetaDataType &out_metaData)
Gives the first element if the queue is not empty and returns true. Returns false if the queue is emp...
Definition MessageQueue_inl.h:102
Entry & operator[](plUInt32 uiIndex)
Returns the element at the given index. Not thread safe.
Definition MessageQueue_inl.h:28
void Reserve(plUInt32 uiCount)
Expands the queue so it can at least store the given capacity.
Definition MessageQueue_inl.h:58
void Unlock()
Releases a lock that has been previously acquired. Do not use this method directly but use plLock ins...
Definition MessageQueue_inl.h:144
plMessageQueueBase(plAllocator *pAllocator)
No memory is allocated during construction.
Definition MessageQueue_inl.h:3
Entry & Peek()
Returns the first element in the queue. Not thread safe.
Definition MessageQueue_inl.h:119
void Sort(const Comparer &comparer)
Sort with explicit comparer. Not thread safe.
Definition MessageQueue.h:97
Provides a simple mechanism for mutual exclusion to prevent multiple threads from accessing a shared ...
Definition Mutex.h:13
Definition MessageQueue.h:21