wangzhengquan
2020-08-01 5f7b0d34f54fee057814c3f146c871c474d53b75
fix alloc_key
8个文件已修改
97 ■■■■■ 已修改文件
src/queue/hashtable.c 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/queue/include/mem_pool.h 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/queue/include/mm.h 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/queue/include/shm_queue.h 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/queue/mm.c 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/queue/shm_mm.c 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/socket/shm_socket.c 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
test_socket/dgram_mod_req_rep.c 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/queue/hashtable.c
@@ -300,7 +300,7 @@
  while(_hashtable_get(hashtable, key) != NULL) {
    key++;
  }
  // 占用key
  _hashtable_put(hashtable, key, (void *)1);
  SemUtil::inc(hashtable->wlock);
  return key;
src/queue/include/mem_pool.h
@@ -34,6 +34,15 @@
    return ptr;
}
static inline void mem_pool_free (void *ptr) {
    mm_free(ptr);
    // notify malloc
    SemUtil::set(mem_pool_cond, 1);
}
template <typename T>
static inline  T* mem_pool_attach(int key) {
    void *ptr;
@@ -51,30 +60,17 @@
}
static inline void mem_pool_free_by_key(int key) {
    void *ptr;
    // T* tptr;
    hashtable_t *hashtable = mm_get_hashtable();
  ptr = hashtable_get(hashtable, key);
  if(ptr != NULL) {
      mm_free(ptr);
      hashtable_remove(hashtable, key);
  }
    return mm_free_by_key(key);
}
static inline void mem_pool_free (void *ptr) {
    mm_free(ptr);
    // notify malloc
    SemUtil::set(mem_pool_cond, 1);
}
static inline void *mem_pool_realloc (void *ptr, size_t size) {
    return mm_realloc(ptr, size);
}
static inline int mem_pool_alloc_key() {
    hashtable_t *hashtable = mm_get_hashtable();
    return hashtable_alloc_key(hashtable);
    return mm_alloc_key();
}
 
src/queue/include/mm.h
@@ -11,6 +11,13 @@
extern void *mm_malloc (size_t size);
extern void mm_free (void *ptr);
extern void *mm_realloc(void *ptr, size_t size);
extern void * mm_get_by_key(int key);
extern void mm_free_by_key(int key);
extern int mm_alloc_key() ;
extern hashtable_t * mm_get_hashtable();
// extern int mm_checkheap(int verbose);
src/queue/include/shm_queue.h
@@ -103,12 +103,11 @@
  SemUtil::dec(queue->mutex);
  queue->reference--;
  // LoggerFactory::getLogger().debug("SHMQueue destructor  reference===%d",
  // queue->reference.load());
  if (queue->reference.load() == 0) {
   // delete queue;
    delete queue;
    hashtable_t *hashtable = mm_get_hashtable();
    hashtable_remove(hashtable, KEY);
    // LoggerFactory::getLogger().debug("SHMQueue destructor delete queue\n");
    // printf("SHMQueue destructor delete queue\n");
  } else {
    SemUtil::inc(queue->mutex);
  }
src/queue/mm.c
@@ -304,6 +304,23 @@
  return hashtable;
}
void * mm_get_by_key(int key) {
  return hashtable_get(hashtable, key);
}
void mm_free_by_key(int key) {
  void *ptr;
  ptr = hashtable_get(hashtable, key);
  if(ptr != NULL) {
    mm_free(ptr);
    hashtable_remove(hashtable, key);
  }
}
int mm_alloc_key() {
  return hashtable_alloc_key(hashtable);
}
/*
 * mm_init - Initialize the memory manager
 */
src/queue/shm_mm.c
@@ -11,6 +11,5 @@
}
int shm_alloc_key() {
    hashtable_t *hashtable = mm_get_hashtable();
    return  hashtable_alloc_key(hashtable);
    return mm_alloc_key();
}
src/socket/shm_socket.c
@@ -17,6 +17,15 @@
int _shm_close_stream_socket(shm_socket_t *socket, bool notifyRemote);
static inline int  _shm_socket_check_key(shm_socket_t *socket) {
   void *tmp_ptr = mm_get_by_key(socket->port);
    if (tmp_ptr!= NULL && tmp_ptr != (void *)1 && !socket->force_bind ) {
      err_exit(0, "key %d has already been in used!", socket->port);
      return 0;
    }
    return 1;
}
SHMQueue<shm_msg_t> *_attach_remote_queue(int port);
shm_socket_t *shm_open_socket(shm_socket_type_t socket_type) {
@@ -67,9 +76,7 @@
    socket->port = port;
  } else {
    if (hashtable_get(hashtable, socket->port) != NULL && !socket->force_bind) {
      err_exit(0, "key %d has already been in used!", socket->port);
    }
   _shm_socket_check_key(socket);
  }
  socket->queue = new SHMQueue<shm_msg_t>(socket->port, 16);
@@ -137,6 +144,7 @@
  return NULL;
}
int shm_connect(shm_socket_t *socket, int port) {
  if (socket->socket_type != SHM_SOCKET_STREAM) {
    err_exit(0, "can not invoke shm_connect method with a socket which is not "
@@ -150,10 +158,7 @@
  if (socket->port == -1) {
    socket->port = hashtable_alloc_key(hashtable);
  } else {
    if (hashtable_get(hashtable, socket->port) != NULL && !socket->force_bind ) {
      err_exit(0, "key %d has already been in used!", socket->port);
    }
    _shm_socket_check_key(socket);
  }
  socket->queue = new SHMQueue<shm_msg_t>(socket->port, 16);
@@ -249,10 +254,7 @@
      socket->port = hashtable_alloc_key(hashtable);
    } else {
      if (hashtable_get(hashtable, socket->port) != NULL) {
        if(!socket->force_bind)
          err_exit(0, "key %d has already been in used!", socket->port);
      }
     _shm_socket_check_key(socket);
    }
    socket->queue = new SHMQueue<shm_msg_t>(socket->port, 16);
@@ -306,10 +308,7 @@
      socket->port = hashtable_alloc_key(hashtable);
    } else {
      if (hashtable_get(hashtable, socket->port) != NULL) {
        if(!socket->force_bind)
          err_exit(0, "key %d has already been in used!", socket->port);
      }
      _shm_socket_check_key(socket);
    }
    socket->queue = new SHMQueue<shm_msg_t>(socket->port, 16);
@@ -351,6 +350,8 @@
  return -1;
}
// ============================================================================================================
/**
 * 绑定key到队列,但是并不会创建队列。如果没有对应指定key的队列提示错误并退出
 */
test_socket/dgram_mod_req_rep.c
@@ -146,7 +146,9 @@
  port = atoi(argv[2]);
  if (strcmp("server", argv[1]) == 0) {
    server(port);
    int temp = shm_alloc_key();
    printf("tmp=%d\n", temp);
    server(temp);
  }
  if (strcmp("client", argv[1]) == 0)