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