wangzhengquan
2020-07-07 37a7bd95042c19d7334b099d50ac6dc8e07e4b4e
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