From 14c345b38d57fd814f217eb8465963a08ca79f7e Mon Sep 17 00:00:00 2001
From: wangzhengquan <wangzhengquan85@126.com>
Date: 星期五, 05 二月 2021 17:41:09 +0800
Subject: [PATCH] update

---
 src/socket/shm_socket.cpp |   44 ++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 42 insertions(+), 2 deletions(-)

diff --git a/src/socket/shm_socket.cpp b/src/socket/shm_socket.cpp
index fc410bf..14274ca 100644
--- a/src/socket/shm_socket.cpp
+++ b/src/socket/shm_socket.cpp
@@ -65,7 +65,7 @@
   return queue;
 }
 
-
+//鍒犻櫎鍖呭惈鍦╧eys鍐呯殑queue
 size_t shm_socket_remove_keys(int keys[], size_t length) {
   hashtable_t *hashtable = mm_get_hashtable();
   LockFreeQueue<shm_packet_t> *mqueue;
@@ -79,6 +79,38 @@
   }
   return count;
 }
+
+ 
+// 鍒犻櫎涓嶅湪keys鍐呯殑queue 
+size_t shm_socket_remove_keys_exclude(int keys[], size_t 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;
+  size_t 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
+      mqueue = (LockFreeQueue<shm_packet_t> *)hashtable_get(hashtable, *keyItr);
+      delete mqueue;
+      hashtable_remove(hashtable, *keyItr);
+      count++;
+    }
+  }
+  delete keyset;
+  return count;
+}
+
+
 
 shm_socket_t *shm_open_socket(shm_socket_type_t socket_type) {
   int s, type;
@@ -493,11 +525,15 @@
 
   if( sockt->queue != NULL) 
     goto LABEL_PUSH;
+
+  if(hashtable_get_queue_count(hashtable) > QUEUE_COUNT_LIMIT) {
+    return EBUS_EXCEED_LIMIT;
+  }
  
   {
     if ((rv = pthread_mutex_lock(&(sockt->mutex))) != 0)
     err_exit(rv, "shm_sendto : pthread_mutex_lock");
-
+    
     if (sockt->queue == NULL) {
       if (sockt->key == 0) {
         sockt->key = hashtable_alloc_key(hashtable);
@@ -545,6 +581,10 @@
   if( sockt->queue != NULL) 
     goto LABEL_POP;
 
+  if(hashtable_get_queue_count(hashtable) > QUEUE_COUNT_LIMIT) {
+    return EBUS_EXCEED_LIMIT;
+  }
+
   {
     if ((rv = pthread_mutex_lock(&(sockt->mutex))) != 0)
       err_exit(rv, "shm_recvfrom : pthread_mutex_lock");

--
Gitblit v1.8.0