From acbf282b23b4cbdebca562d67132573de3902f94 Mon Sep 17 00:00:00 2001
From: Fu Juntang <StrongTiger_001@163.com>
Date: 星期五, 17 九月 2021 10:45:43 +0800
Subject: [PATCH] Merge branch 'master' of http://os.smartai.com:9091/valib/c_bhomebus
---
src/shm/shm_mm_wrapper.cpp | 89 ++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 85 insertions(+), 4 deletions(-)
diff --git a/src/shm/shm_mm_wrapper.cpp b/src/shm/shm_mm_wrapper.cpp
index 6175923..672fadb 100644
--- a/src/shm/shm_mm_wrapper.cpp
+++ b/src/shm/shm_mm_wrapper.cpp
@@ -1,15 +1,96 @@
-#include "shm_mm_wraper.h"
-#include "mem_pool.h"
+#include "shm_mm_wrapper.h"
+#include "shm_mm.h"
#include "hashtable.h"
+#include "lock_free_queue.h"
+#include "shm_socket.h"
+
+#define BUFFER_TIME 1
+
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() {
return mm_alloc_key();
}
+
+
+/**
+ * 鍥炴敹鍋囧垹闄ょ殑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) > BUFFER_TIME ) {
+ // mqueue = (LockFreeQueue<shm_packet_t> *)hashtable_get(hashtable, keys[i]);
+ // if(mqueue != NULL) {
+ // delete mqueue;
+ // }
+
+ hashtable_remove(hashtable, it->first);
+ printf("reomved queue %d\n\n", it->first);
+ it->second.status = SHM_QUEUE_ST_RECYCLED;
+ // 涓嶈兘 erase ,鍚﹀垯浼氬嚭鐜板杩涚▼涔嬮棿鐨勫悓姝ラ棶棰橈紝 鑰岃繖姝f槸杩欓噷瑕佽В鍐崇殑闂
+ // it = shmQueueStMap->erase(it);
+ // continue;
+ }
+ }
+
+ sleep(1);
+ }
+ return 0;
+}
+
+//鍒犻櫎鍖呭惈鍦╧eys鍐呯殑queue
+int shm_mm_wrapper_remove_keys(int keys[], int length) {
+ hashtable_t *hashtable = mm_get_hashtable();
+ LockFreeQueue<shm_packet_t> *mqueue;
+ int count = 0;
+ for(int i = 0; i< length; i++) {
+ // 閿�姣佸叡浜唴瀛樼殑queue
+ hashtable_remove(hashtable, keys[i]);
+ LoggerFactory::getLogger()->debug("remove queue %d", keys[i]);
+ count++;
+
+ }
+ return count;
+}
+
+
+// 鍒犻櫎涓嶅湪keys鍐呯殑queue
+int shm_mm_wrapper_remove_keys_exclude(int keys[], int length) {
+ hashtable_t *hashtable = mm_get_hashtable();
+ std::set<int> *keyset = hashtable_keyset(hashtable);
+ std::set<int>::iterator keyItr;
+ LockFreeQueue<shm_packet_t> *mqueue;
+ bool found;
+ int count = 0;
+ for (keyItr = keyset->begin(); keyItr != keyset->end(); keyItr++) {
+ found = false;
+ for (size_t i = 0; i < length; i++) {
+ if (*keyItr == keys[i]) {
+ found = true;
+ break;
+ }
+ }
+ // 100鍐呯殑鏄痓us鍐呴儴鑷繁鐢ㄧ殑
+ if (!found && *keyItr > 100) {
+ // 閿�姣佸叡浜唴瀛樼殑queue
+ hashtable_remove(hashtable, *keyItr);
+ LoggerFactory::getLogger()->debug("remove queue %d", *keyItr);
+ count++;
+
+ }
+ }
+ delete keyset;
+ return count;
+}
--
Gitblit v1.8.0