wangzhengquan
2021-02-05 14c345b38d57fd814f217eb8465963a08ca79f7e
src/shm/shm_mm_wrapper.cpp
@@ -1,6 +1,8 @@
#include "shm_mm_wrapper.h"
#include "mem_pool.h"
#include "hashtable.h"
#include "lock_free_queue.h"
#include "shm_socket.h"
void shm_mm_wrapper_init(int size) {
   mem_pool_init(size);
@@ -13,3 +15,54 @@
int shm_mm_wrapper_alloc_key() {
   return mm_alloc_key();
}
//删除包含在keys内的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
    mqueue = (LockFreeQueue<shm_packet_t> *)hashtable_get(hashtable, keys[i]);
    if(mqueue == NULL) {
       continue;
    }
    delete mqueue;
    hashtable_remove(hashtable, 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内的是bus内部自己用的
    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;
}