| | |
| | | { |
| | | |
| | | private: |
| | | static hashtable_t * getHashTable() { |
| | | static hashtable_t *hashtable = NULL; |
| | | |
| | | if(hashtable == NULL) { |
| | | int first = mm_init(sizeof(hashtable_t), (void **)&hashtable); |
| | | if (first) |
| | | hashtable_init(hashtable); |
| | | } |
| | | return hashtable; |
| | | |
| | | } |
| | | |
| | | private: |
| | | const int KEY; |
| | | |
| | | public: |
| | |
| | | SHMQueue<ELEM_T>::SHMQueue(int key, size_t qsize): KEY(key) |
| | | { |
| | | |
| | | hashtable_t *hashtable = getHashTable(); |
| | | hashtable_t *hashtable = get_mm_hashtable(); |
| | | //LockFreeQueue<int, 10000> q; |
| | | if ((queue = (LockFreeQueue<ELEM_T> *)hashtable_get(hashtable, key)) == NULL ) { |
| | | queue = new LockFreeQueue<ELEM_T>(qsize); |
| | |
| | | { |
| | | queue->reference--; |
| | | LoggerFactory::getLogger().debug("SHMQueue destructor reference===%d", queue->reference.load()); |
| | | if(queue->reference == 0) { |
| | | if(queue->reference.load() == 0) { |
| | | delete queue; |
| | | hashtable_t *hashtable = getHashTable(); |
| | | hashtable_t *hashtable = get_mm_hashtable(); |
| | | hashtable_remove(hashtable, KEY); |
| | | LoggerFactory::getLogger().debug("SHMQueue destructor delete queue"); |
| | | } |
| | | } |
| | | |