aboutsummaryrefslogtreecommitdiff
path: root/src/server/shared/Threading/ProducerConsumerQueue.h
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2014-07-27 17:46:46 +0200
committerShauren <shauren.trinity@gmail.com>2014-07-27 17:46:46 +0200
commit6f272ea5b7d6551844aa1a1f748cee5c79b746f3 (patch)
tree82fd15487be93bad4a2674f10fc4cd0694bd9007 /src/server/shared/Threading/ProducerConsumerQueue.h
parent8a05231994342bc826fa98f3f1df741cc14e19f7 (diff)
Core/Network: Optimized packet sending by removing unneccessary memory copying
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