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