Fu Juntang
2021-09-17 5c912c70e9333298ff48f7ea15424f72ca977b99
src/shm/mm.cpp
@@ -113,7 +113,6 @@
  newsize = ALIGN(size +  (SIZE_T_SIZE << 1) +  (PTR_SIZE << 1) );
    //fprintf(stderr, "mm_malloc : size=%u\n", size);
  /* Search the free list for a fit */
  SemUtil::dec(mutex);
  if ((ptr = find_fit(newsize)) != NULL)
@@ -123,8 +122,11 @@
    return aptr;
  } else {
    SemUtil::inc(mutex);
    abort();
    err_exit(0, "mm_malloc : out of memery\n");
    err_msg(0, "mm_malloc : out of memery\n");
    LoggerFactory::getLogger()->fatal("mm_malloc : out of memery\n");
    // abort();
    exit(1);
    return NULL;
  }
@@ -229,6 +231,7 @@
/*
 * mm_init - Initialize the memory manager, M unit
 * @return 是否第一次创建
 */
bool mm_init(size_t heap_size)
{
@@ -253,6 +256,7 @@
    first = false;
    shmid  = shmget(SHM_KEY, 0, 0);
  }
  if (shmid == -1)
    err_exit(errno, "mm_init shmget");
  shmp = shmat(shmid, key_addr, 0);
@@ -301,16 +305,17 @@
  return first;
}
/**
 * @return 是否真正销毁成功
 */
bool mm_destroy(void) {
  struct shmid_ds shmid_ds;
  
  SemUtil::dec(mutex);
  
  if(shmctl(shmid, IPC_STAT, &shmid_ds) == 0) {
    //LoggerFactory::getLogger()->debug("shm_nattch=%d\n", shmid_ds.shm_nattch);
    // 只有当前一个进程attach到共享内存上
    // 多个进程attach在共享内存上
    if (shmid_ds.shm_nattch > 1) {
      //detache
      if (shmdt(shmp) == -1) {
@@ -319,7 +324,7 @@
      SemUtil::inc(mutex);
      return false;
    } else  {
      // 只有当前一个进程attach到共享内存上
      hashtable_destroy(hashtable);
      //detache
      if (shmdt(shmp) == -1) {
@@ -333,8 +338,6 @@
        err_exit(errno, "mm_destroy shmctl IPC_RMID");
      else 
         LoggerFactory::getLogger()->debug("shared memory destroy\n");
      LoggerFactory::getLogger()->debug( "mm_destroy: real destroy.");
      SemUtil::inc(mutex);
      SemUtil::remove(mutex);
@@ -359,6 +362,7 @@
void mm_free_by_key(int key) {
  void *ptr;
  ptr = hashtable_get(hashtable, key);
  if(ptr != NULL) {
    mm_free(ptr);