aboutsummaryrefslogtreecommitdiff
path: root/src/server/shared/Threading/ProducerConsumerQueue.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/shared/Threading/ProducerConsumerQueue.h')
-rw-r--r--src/server/shared/Threading/ProducerConsumerQueue.h14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/server/shared/Threading/ProducerConsumerQueue.h b/src/server/shared/Threading/ProducerConsumerQueue.h
index 45a1cbc692a..1fee1d0685f 100644
--- a/src/server/shared/Threading/ProducerConsumerQueue.h
+++ b/src/server/shared/Threading/ProducerConsumerQueue.h
@@ -22,12 +22,11 @@
#include <mutex>
#include <queue>
#include <atomic>
+#include <type_traits>
template <typename T>
class ProducerConsumerQueue
{
- static_assert(std::is_pointer<T>::value, "T for ProducerConsumerQueue must be a pointer");
-
private:
std::mutex _queueLock;
std::queue<T> _queue;
@@ -94,7 +93,7 @@ public:
{
T& value = _queue.front();
- delete value;
+ DeleteQueuedObject(value);
_queue.pop();
}
@@ -105,8 +104,13 @@ public:
_condition.notify_all();
}
-};
-#endif
+private:
+ template<typename E = T>
+ typename std::enable_if<std::is_pointer<E>::value>::type DeleteQueuedObject(E& obj) { delete obj; }
+ template<typename E = T>
+ typename std::enable_if<!std::is_pointer<E>::value>::type DeleteQueuedObject(E const& /*packet*/) { }
+};
+#endif