From 082633f08aae8eea19bd7050cbe4a75e5ed1ac6f Mon Sep 17 00:00:00 2001 From: wangzhengquan <wangzhengquan85@126.com> Date: 星期二, 07 七月 2020 12:07:29 +0800 Subject: [PATCH] update --- squeue/include/queue_factory.h | 56 +++++++++++++++++++++++++++++--------------------------- 1 files changed, 29 insertions(+), 27 deletions(-) diff --git a/squeue/include/queue_factory.h b/squeue/include/queue_factory.h index 6c71d14..23446b0 100644 --- a/squeue/include/queue_factory.h +++ b/squeue/include/queue_factory.h @@ -4,40 +4,30 @@ #include "mm.h" #include "hashtable.h" #include "lock_free_queue.h" -#include "SLinkedLockFreeQueue.h" -namespace QueueFactory{ +class QueueFactory{ +private: - template <typename T> - SLinkedLockFreeQueue<T>* createLinkedLockFreeQueue(int key, size_t size) { - hashtable_t *hashtable; - SLinkedLockFreeQueue<T> *queue; + static hashtable_t * getHashTable() { + static hashtable_t *hashtable = NULL; int first; - first = mm_init(sizeof(hashtable_t), (void **)&hashtable); - - if (first) - hashtable_init(hashtable); - - if ((queue = (SLinkedLockFreeQueue<T> *)hashtable_get(hashtable, key)) == NULL ) { - queue = new SLinkedLockFreeQueue<T>(size); - hashtable_put(hashtable, key, (void *)queue); + if(hashtable == NULL) { + first = mm_init(sizeof(hashtable_t), (void **)&hashtable); + if (first) + hashtable_init(hashtable); } - - return queue; + return hashtable; + } + - template <typename T> + template <typename T> static LockFreeQueue<T>* createArrayLockFreeQueue(int key, size_t size=16) { - hashtable_t *hashtable; + LockFreeQueue<T> *queue; - int first; - - first = mm_init(sizeof(hashtable_t), (void **)&hashtable); - - if (first) - hashtable_init(hashtable);; + hashtable_t *hashtable = getHashTable(); //LockFreeQueue<int, 10000> q; if ((queue = (LockFreeQueue<T> *)hashtable_get(hashtable, key)) == NULL ) { queue = new LockFreeQueue<T>(size); @@ -47,11 +37,23 @@ return queue; } +public: - template <typename T> - LockFreeQueue<T>* createQueue(int key, size_t size) { + template <typename T> static + LockFreeQueue<T>* createQueue(int key, size_t size = 16) { return QueueFactory::createArrayLockFreeQueue<T>(key, size); } -} + /** + * destroy queue + */ + template <typename T> static + void dropQueue(int key) { + LockFreeQueue<T> *queue = QueueFactory::createQueue<T> (key); + delete queue; + hashtable_t *hashtable = getHashTable(); + hashtable_remove(hashtable, key); + } + +}; #endif -- Gitblit v1.8.0