From 8bfe9f711612efde96a0d7b7aa3ba7178ab51640 Mon Sep 17 00:00:00 2001 From: wangzhengquan <wangzhengquan85@126.com> Date: 星期六, 20 二月 2021 15:10:11 +0800 Subject: [PATCH] Merge branch 'master' into dev --- src/shm/shm_mm_wrapper.cpp | 54 +++++++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 45 insertions(+), 9 deletions(-) diff --git a/src/shm/shm_mm_wrapper.cpp b/src/shm/shm_mm_wrapper.cpp index 92350c8..f726f8a 100644 --- a/src/shm/shm_mm_wrapper.cpp +++ b/src/shm/shm_mm_wrapper.cpp @@ -4,12 +4,16 @@ #include "lock_free_queue.h" #include "shm_socket.h" +#define BUFFER_TIME 10 + + void shm_mm_wrapper_init(int size) { - mem_pool_init(size); + shm_mm_init(size); + } void shm_mm_wrapper_destroy() { - mem_pool_destroy(); + shm_mm_destroy(); } int shm_mm_wrapper_alloc_key() { @@ -17,6 +21,31 @@ } +/** + * 鍥炴敹鍋囧垹闄ょ殑key + */ +int shm_mm_wrapper_start_resycle() { + ShmQueueStMap * shmQueueStMap = shm_mm_attach<ShmQueueStMap>(SHM_QUEUE_ST_KEY); + hashtable_t *hashtable = mm_get_hashtable(); + LockFreeQueue<shm_packet_t> *mqueue; + while(true) { + for(auto it = shmQueueStMap->begin(); it != shmQueueStMap->end(); ++it ) { + if(it->second.status = SHM_QUEUE_ST_CLOSED && difftime(time(NULL), it->second.closeTime) > 2 ) { + mqueue = (LockFreeQueue<shm_packet_t> *)hashtable_get(hashtable, keys[i]); + if(mqueue != NULL) { + delete mqueue; + hashtable_remove(hashtable, it->first); + printf("reove queue %d\n", it->first); + // 涓嶈兘 erase ,鍚﹀垯浼氬嚭鐜板杩涚▼涔嬮棿鐨勫悓姝ラ棶棰橈紝 鑰岃繖姝f槸杩欓噷瑕佽В鍐崇殑闂 + // it = shmQueueStMap->erase(it); + // continue; + } + } + } + + sleep(1); + } +} //鍒犻櫎鍖呭惈鍦╧eys鍐呯殑queue int shm_mm_wrapper_remove_keys(int keys[], int length) { @@ -29,9 +58,13 @@ if(mqueue == NULL) { continue; } - delete mqueue; - hashtable_remove(hashtable, keys[i]); - count++; + if(difftime(time(NULL), mqueue->getCreateTime()) > BUFFER_TIME ) { + delete mqueue; + hashtable_remove(hashtable, keys[i]); + LoggerFactory::getLogger()->debug("remove queue %d", keys[i]); + count++; + } + } return count; } @@ -57,10 +90,13 @@ if (!found && *keyItr > 100) { // 閿�姣佸叡浜唴瀛樼殑queue mqueue = (LockFreeQueue<shm_packet_t> *)hashtable_get(hashtable, *keyItr); - - delete mqueue; - hashtable_remove(hashtable, *keyItr); - count++; + if(difftime(time(NULL), mqueue->getCreateTime()) > BUFFER_TIME ) { + delete mqueue; + hashtable_remove(hashtable, *keyItr); + LoggerFactory::getLogger()->debug("remove queue %d", *keyItr); + count++; + } + } } delete keyset; -- Gitblit v1.8.0