wangzhengquan
2020-07-08 7d3086a481899b03c230eb06a29aa57677041725
squeue/include/queue_factory.h
@@ -1,70 +1,71 @@
#ifndef QFACTORY_H
#define QFACTORY_H
#include "usg_common.h"
#include "mm.h"
#include "hashtable.h"
#include "lock_free_queue.h"
// #ifndef QFACTORY_H
// #define QFACTORY_H
// #include "usg_common.h"
// #include "mm.h"
// #include "hashtable.h"
// #include "lock_free_queue.h"
class QueueFactory{
private:
// class QueueFactory{
// private:
   static hashtable_t * getHashTable() {
      static hashtable_t *hashtable = NULL;
      int first;
//    static hashtable_t * getHashTable() {
//       static hashtable_t *hashtable = NULL;
//       int first;
        
      if(hashtable == NULL) {
         first = mm_init(sizeof(hashtable_t), (void **)&hashtable);
         if (first)
            hashtable_init(hashtable);
      }
      return hashtable;
//       if(hashtable == NULL) {
//          first = mm_init(sizeof(hashtable_t), (void **)&hashtable);
//          if (first)
//             hashtable_init(hashtable);
//       }
//       return hashtable;
      
   }
//    }
   template <typename T> static
   LockFreeQueue<T>* _createQueue(int key, size_t size = 16) {
      LockFreeQueue<T> *queue;
      hashtable_t *hashtable = getHashTable();
      //LockFreeQueue<int, 10000> q;
      if ((queue = (LockFreeQueue<T> *)hashtable_get(hashtable, key)) == NULL ) {
         queue = new LockFreeQueue<T>(size);
         hashtable_put(hashtable,  key, (void *)queue);
      }
//    template <typename T> static
//    LockFreeQueue<T>* _createQueue(int key, size_t size = 16) {
//       LockFreeQueue<T> *queue;
//       hashtable_t *hashtable = getHashTable();
//       //LockFreeQueue<int, 10000> q;
//       if ((queue = (LockFreeQueue<T> *)hashtable_get(hashtable, key)) == NULL ) {
//          queue = new LockFreeQueue<T>(size);
//          hashtable_put(hashtable,  key, (void *)queue);
//       }
      
      return queue;
   }
//       return queue;
//    }
    
public:
// public:
   template <typename T> static
   LockFreeQueue<T>* createQueue(int key, size_t size = 16) {
      LockFreeQueue<T> *queue = _createQueue<T>(key, size);
      queue->reference++;
      LoggerFactory::getLogger().debug("createQueue reference===%d", queue->reference.load());
      return queue;
   }
//    template <typename T> static
//    LockFreeQueue<T>* createQueue(int key, size_t size = 16) {
//       LockFreeQueue<T> *queue = _createQueue<T>(key, size);
//       queue->reference++;
//       LoggerFactory::getLogger().debug("createQueue reference===%d", queue->reference.load());
//       return queue;
//    }
   /**
    * destroy queue
   */
   template <typename T> static
   void dropQueue(int key) {
      LockFreeQueue<T> *queue = _createQueue<T> (key);
      if(queue == NULL)
         return;
//    /**
//     * destroy queue
//    */
//    template <typename T> static
//    void dropQueue(int key) {
//       LockFreeQueue<T> *queue = _createQueue<T> (key);
//       if(queue == NULL)
//          return;
      queue->reference--;
      LoggerFactory::getLogger().debug("dropQueue reference===%d", queue->reference.load());
      if(queue->reference == 0) {
         delete queue;
         hashtable_t *hashtable = getHashTable();
         hashtable_remove(hashtable, key);
      }
//       queue->reference--;
//       LoggerFactory::getLogger().debug("dropQueue reference===%d", queue->reference.load());
//       if(queue->reference == 0) {
//          delete queue;
//          hashtable_t *hashtable = getHashTable();
//          hashtable_remove(hashtable, key);
//       }
      
   }
//    }
};
#endif
// };
// #endif