wangzhengquan
2021-02-20 e0aea3742aed09a0a9ed384ccd7db203b6efc650
src/shm/shm_mm_wrapper.cpp
@@ -5,18 +5,48 @@
#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() {
   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) > 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 ,否则会出现多进程之间的同步问题, 而这正是这里要解决的问题
          // it = shmQueueStMap->erase(it);
          // continue;
        }
      }
    }
    sleep(1);
  }
}
//删除包含在keys内的queue
int shm_mm_wrapper_remove_keys(int keys[], int length) {
  hashtable_t *hashtable = mm_get_hashtable();