From 3feff4ae44fd74c32158ed5f505e063b154c4d76 Mon Sep 17 00:00:00 2001
From: wangzhengquan <wangzhengquan85@126.com>
Date: 星期四, 16 七月 2020 11:43:34 +0800
Subject: [PATCH] udpate

---
 queue/include/array_lock_free_queue.h |   51 +++++++++++++++++++++++++++------------------------
 1 files changed, 27 insertions(+), 24 deletions(-)

diff --git a/queue/include/array_lock_free_queue.h b/queue/include/array_lock_free_queue.h
index 056f53b..0ba35ae 100644
--- a/queue/include/array_lock_free_queue.h
+++ b/queue/include/array_lock_free_queue.h
@@ -5,6 +5,7 @@
 #include <sched.h>  // sched_yield()
 #include "logger_factory.h"
 #include "mem_pool.h"
+#include "shm_allocator.h"
 
 /// @brief implementation of an array based lock free queue with support for 
 ///        multiple producers
@@ -16,13 +17,15 @@
 
 #define _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE
 
-template <typename ELEM_T>
+template <typename ELEM_T, typename Allocator = SHM_Allocator>
 class ArrayLockFreeQueue
 {
     // ArrayLockFreeQueue will be using this' private members
     template <
         typename ELEM_T_, 
-        template <typename T> class Q_TYPE >
+        typename Allocator_,
+        template <typename T, typename AT> class Q_TYPE
+        >
     friend class LockFreeQueue;
 
 private:
@@ -76,13 +79,13 @@
     
 private:
     /// @brief disable copy constructor declaring it private
-    ArrayLockFreeQueue<ELEM_T>(const ArrayLockFreeQueue<ELEM_T> &a_src);
+    ArrayLockFreeQueue<ELEM_T, Allocator>(const ArrayLockFreeQueue<ELEM_T> &a_src);
 
 };
 
 
-template <typename ELEM_T>
-ArrayLockFreeQueue<ELEM_T>::ArrayLockFreeQueue(size_t qsize):
+template <typename ELEM_T, typename Allocator>
+ArrayLockFreeQueue<ELEM_T, Allocator>::ArrayLockFreeQueue(size_t qsize):
     Q_SIZE(qsize),
     m_writeIndex(0),      // initialisation is not atomic
     m_readIndex(0),       //
@@ -91,30 +94,30 @@
     ,m_count(0)           //
 #endif
 {
-    m_theQueue = (ELEM_T*)mem_pool_malloc(Q_SIZE * sizeof(ELEM_T));
+    m_theQueue = (ELEM_T*)Allocator::malloc(Q_SIZE * sizeof(ELEM_T));
 
 }
 
-template <typename ELEM_T>
-ArrayLockFreeQueue<ELEM_T>::~ArrayLockFreeQueue()
+template <typename ELEM_T, typename Allocator>
+ArrayLockFreeQueue<ELEM_T, Allocator>::~ArrayLockFreeQueue()
 {
     // std::cout << "destroy ArrayLockFreeQueue\n";
-    mem_pool_free(m_theQueue);
+    Allocator::free(m_theQueue);
     
 }
 
-template <typename ELEM_T>
+template <typename ELEM_T, typename Allocator>
 inline 
-uint32_t ArrayLockFreeQueue<ELEM_T>::countToIndex(uint32_t a_count)
+uint32_t ArrayLockFreeQueue<ELEM_T, Allocator>::countToIndex(uint32_t a_count)
 {
     // if Q_SIZE is a power of 2 this statement could be also written as 
     // return (a_count & (Q_SIZE - 1));
     return (a_count % Q_SIZE);
 }
 
-template <typename ELEM_T>
+template <typename ELEM_T, typename Allocator>
 inline 
-uint32_t ArrayLockFreeQueue<ELEM_T>::size()
+uint32_t ArrayLockFreeQueue<ELEM_T, Allocator>::size()
 {
 #ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE
 
@@ -147,9 +150,9 @@
 #endif // _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE
 }
 
-template <typename ELEM_T>
+template <typename ELEM_T, typename Allocator>
 inline 
-bool ArrayLockFreeQueue<ELEM_T>::full()
+bool ArrayLockFreeQueue<ELEM_T, Allocator>::full()
 {
 #ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE
 
@@ -172,9 +175,9 @@
 #endif // _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE
 }
 
-template <typename ELEM_T>
+template <typename ELEM_T, typename Allocator>
 inline 
-bool ArrayLockFreeQueue<ELEM_T>::empty()
+bool ArrayLockFreeQueue<ELEM_T, Allocator>::empty()
 {
 #ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE
 
@@ -199,8 +202,8 @@
 
 
 
-template <typename ELEM_T>
-bool ArrayLockFreeQueue<ELEM_T>::push(const ELEM_T &a_data)
+template <typename ELEM_T, typename Allocator>
+bool ArrayLockFreeQueue<ELEM_T, Allocator>::push(const ELEM_T &a_data)
 {
     uint32_t currentReadIndex;
     uint32_t currentWriteIndex;
@@ -248,8 +251,8 @@
 }
 
 
-template <typename ELEM_T>
-bool ArrayLockFreeQueue<ELEM_T>::pop(ELEM_T &a_data)
+template <typename ELEM_T, typename Allocator>
+bool ArrayLockFreeQueue<ELEM_T, Allocator>::pop(ELEM_T &a_data)
 {
     uint32_t currentMaximumReadIndex;
     uint32_t currentReadIndex;
@@ -303,14 +306,14 @@
     return false;
 }
 
-template <typename ELEM_T>
-ELEM_T& ArrayLockFreeQueue<ELEM_T>::operator[](unsigned int i)
+template <typename ELEM_T, typename Allocator>
+ELEM_T& ArrayLockFreeQueue<ELEM_T, Allocator>::operator[](unsigned int i)
 {
     int currentCount = m_count;
     uint32_t currentReadIndex = m_readIndex;
     if (i < 0 || i >= currentCount)
     {
-        std::cerr << "ArrayLockFreeQueue<ELEM_T>::operator[] , Error in array limits: " << i << " is out of range\n";
+        std::cerr << "ArrayLockFreeQueue<ELEM_T, Allocator>::operator[] , Error in array limits: " << i << " is out of range\n";
         std::exit(EXIT_FAILURE);
     }
     return m_theQueue[countToIndex(currentReadIndex+i)];

--
Gitblit v1.8.0