From 37a7bd95042c19d7334b099d50ac6dc8e07e4b4e Mon Sep 17 00:00:00 2001 From: wangzhengquan <wangzhengquan85@126.com> Date: 星期二, 07 七月 2020 16:40:51 +0800 Subject: [PATCH] update --- squeue/include/queue_factory.h | 56 ++++++++++++++++++++++++++------------------------------ 1 files changed, 26 insertions(+), 30 deletions(-) diff --git a/squeue/include/queue_factory.h b/squeue/include/queue_factory.h index b898a86..ca88de6 100644 --- a/squeue/include/queue_factory.h +++ b/squeue/include/queue_factory.h @@ -4,10 +4,11 @@ #include "mm.h" #include "hashtable.h" #include "lock_free_queue.h" -#include "SLinkedLockFreeQueue.h" -namespace QueueFactory{ - hashtable_t * getHashTable() { +class QueueFactory{ +private: + + static hashtable_t * getHashTable() { static hashtable_t *hashtable = NULL; int first; @@ -20,26 +21,9 @@ } - template <typename T> - SLinkedLockFreeQueue<T>* createLinkedLockFreeQueue(int key, size_t size) { - - SLinkedLockFreeQueue<T> *queue; - hashtable_t *hashtable = getHashTable(); - - - if ((queue = (SLinkedLockFreeQueue<T> *)hashtable_get(hashtable, key)) == NULL ) { - queue = new SLinkedLockFreeQueue<T>(size); - hashtable_put(hashtable, key, (void *)queue); - } - - return queue; - } - - - template <typename T> - LockFreeQueue<T>* createArrayLockFreeQueue(int key, size_t size=16) { - + template <typename T> static + LockFreeQueue<T>* _createQueue(int key, size_t size = 16) { LockFreeQueue<T> *queue; hashtable_t *hashtable = getHashTable(); //LockFreeQueue<int, 10000> q; @@ -48,26 +32,38 @@ hashtable_put(hashtable, key, (void *)queue); } + std::cout << "createQueue reference===" << queue->reference << std::endl; return queue; } + +public: - template <typename T> + template <typename T> static LockFreeQueue<T>* createQueue(int key, size_t size = 16) { - return QueueFactory::createArrayLockFreeQueue<T>(key, size); + LockFreeQueue<T> *queue = _createQueue<T>(key, size); + queue->reference++; + return queue; } /** * destroy queue */ - template <typename T> + template <typename T> static void dropQueue(int key) { + LockFreeQueue<T> *queue = _createQueue<T> (key); + if(queue == NULL) + return; - LockFreeQueue<T> *queue = QueueFactory::createQueue<T> (key); - delete queue; - hashtable_t *hashtable = getHashTable(); - hashtable_remove(hashtable, key); + queue->reference--; +std::cout << "dropQueue reference===" << queue->reference << std::endl; + if(queue->reference == 0) { + delete queue; + hashtable_t *hashtable = getHashTable(); + hashtable_remove(hashtable, key); + } + } -} +}; #endif -- Gitblit v1.8.0