| | |
| | | #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 |