From 8b4ddf10e71e1c8fabd33c72b282f7da65ff682f Mon Sep 17 00:00:00 2001 From: wangzhengquan <wangzhengquan85@126.com> Date: 星期二, 14 七月 2020 15:59:44 +0800 Subject: [PATCH] commit --- queue/include/shm_queue.h | 49 +++++++++++++++++++++++++++++++++---------------- 1 files changed, 33 insertions(+), 16 deletions(-) diff --git a/queue/include/shm_queue.h b/queue/include/shm_queue.h index 16e0d66..3a506c9 100644 --- a/queue/include/shm_queue.h +++ b/queue/include/shm_queue.h @@ -15,19 +15,6 @@ { 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: @@ -52,6 +39,10 @@ inline ELEM_T& operator[](unsigned i); + static void remove_queues_exclue(int *keys, size_t length); +private: + + protected: /// @brief the actual queue-> methods are forwarded into the real /// implementation @@ -64,12 +55,38 @@ template < typename ELEM_T > +void SHMQueue<ELEM_T>::remove_queues_exclue(int *keys, size_t length) +{ + hashtable_t *hashtable = mm_get_hashtable(); + std::set<int>* keyset = hashtable_keyset(hashtable); + std::set<int>::iterator keyItr; + LockFreeQueue<ELEM_T>* mqueue; + bool found; + for (keyItr = keyset->begin(); keyItr != keyset->end(); keyItr++) { + found = false; + for(int i = 0; i < length; i++) { + if(*keyItr == keys[i]) { + found = true; + break; + } + } + if(!found) { + mqueue = (LockFreeQueue<ELEM_T> *)hashtable_get(hashtable, *keyItr); + delete mqueue; + } + } + delete keyset; + +} + +template < typename ELEM_T > SHMQueue<ELEM_T>::SHMQueue(int key, size_t qsize): KEY(key) { - hashtable_t *hashtable = getHashTable(); + hashtable_t *hashtable = mm_get_hashtable(); + queue = (LockFreeQueue<ELEM_T> *)hashtable_get(hashtable, key); //LockFreeQueue<int, 10000> q; - if ((queue = (LockFreeQueue<ELEM_T> *)hashtable_get(hashtable, key)) == NULL ) { + if (queue == NULL || (void *)queue == (void *)1) { queue = new LockFreeQueue<ELEM_T>(qsize); hashtable_put(hashtable, key, (void *)queue); } @@ -84,7 +101,7 @@ LoggerFactory::getLogger().debug("SHMQueue destructor reference===%d", queue->reference.load()); if(queue->reference.load() == 0) { delete queue; - hashtable_t *hashtable = getHashTable(); + hashtable_t *hashtable = mm_get_hashtable(); hashtable_remove(hashtable, KEY); LoggerFactory::getLogger().debug("SHMQueue destructor delete queue"); } -- Gitblit v1.8.0