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