wangzhengquan
2020-12-22 2b43ef443f14889e086bdf0ccb28e66d17efd2ae
src/queue/mm.c
@@ -300,6 +300,48 @@
  return first;
}
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到共享内存上
    if(shmid_ds.shm_nattch == 1) {
      hashtable_destroy(hashtable);
      //detache
      if (shmdt(shmp) == -1) {
        LoggerFactory::getLogger()->error(errno, "mm_destroy shmdt");
        SemUtil::inc(mutex);
        return false;
      }
      //remove shared memery
      if (shmctl(shmid, IPC_RMID, 0) == -1)
        err_exit(errno, "mm_destroy shmctl IPC_RMID");
      else
         LoggerFactory::getLogger()->debug("shared memory destroy\n");
      SemUtil::inc(mutex);
      SemUtil::remove(mutex);
      return true;
    } else {
      SemUtil::inc(mutex);
      return false;
    }
  } else {
    err_msg(errno, "mm_destroy shmctl IPC_STAT");
    SemUtil::inc(mutex);
    return false;
  }
}
hashtable_t * mm_get_hashtable() {
  return hashtable;
}
@@ -321,111 +363,7 @@
int mm_alloc_key() {
  return hashtable_alloc_key(hashtable);
}
/*
 * mm_init - Initialize the memory manager
 */
// bool mm_init2(size_t offset, void **addr)
// {
//   //已经初始化过了
//   SemUtil::dec(mutex);
//   if (shmid != -1){
//     *addr = shmp;
//     SemUtil::inc(mutex);
//     return false;
//   }
//   bool first = true;
//   shmid = shmget(SHM_KEY, MAX_HEAP, IPC_CREAT | IPC_EXCL | OBJ_PERMS);
//   if (shmid == -1 && errno == EEXIST) {
//     first = false;
//     shmid  = shmget(SHM_KEY, 0, 0);
//   }
//   if (shmid == -1)
//     err_exit(errno, "mm_init shmget");
//   shmp = shmat(shmid, key_addr, 0);
//   if ((long)shmp == -1)
//     err_exit(errno, "mm_init shmat");
//   mem_start_brk = (void*)ALIGN((size_t)((char *)shmp + offset + ALIGNMENT));
//   mem_max_addr = (void *)((char *)shmp+ MAX_HEAP);
//   mem_max_size = (char *)mem_max_addr - (char*)mem_start_brk;
//   mem_brk = mem_start_brk;
//   void *free_listp;
//   /* Create the initial empty heap */
//   int initsize = ALIGN(3 * SIZE_T_SIZE + 2 * PTR_SIZE);
//   heap_listp = (char *)mem_start_brk + initsize - 2 * SIZE_T_SIZE - 2 * PTR_SIZE;
//   if(!first) {
//     *addr = shmp;
//     SemUtil::inc(mutex);
//     return first;
//   }
//   if ((mem_sbrk(initsize)) == (void *) - 1)
//     err_exit(errno, "mm_init mem_sbrk");
//   PUT((char *)mem_start_brk + initsize - SIZE_T_SIZE, PACK(0, 1));   /* Epilogue header */
//   /*PUT(HDRP(heap_listp), PACK(initsize - SIZE_T_SIZE, 1));
//   PUT(FTRP(heap_listp), PACK(initsize - SIZE_T_SIZE, 1));*/
//   PUT(HDRP(heap_listp), PACK(initsize - SIZE_T_SIZE, 1));
//   PUT(FTRP(heap_listp), PACK(initsize - SIZE_T_SIZE, 1));
//   /**
//    * here the heap_listp can be look as a ancher which concat the header and tail of free-list to form a ring, and the heap_list itself will never be used as a free block
//   */
//   PUT_PTR(SUCCRP(heap_listp), heap_listp);
//   PUT_PTR(PREDRP(heap_listp), heap_listp);
//   /* Extend the empty heap with a free block of CHUNKSIZE bytes */
//   if ((free_listp = extend_heap(mem_max_size - initsize - ALIGNMENT)) == NULL)
//     err_exit(errno, "mm_init extend_heap");
//   *addr = shmp;
//   SemUtil::inc(mutex);
//   return first;
// }
bool mm_destroy(void) {
  struct shmid_ds shmid_ds;
  //detache
  SemUtil::dec(mutex);
  if (shmdt(shmp) == -1) {
    err_msg(errno, "mm_destroy shmdt");
    SemUtil::inc(mutex);
  }
  if(shmctl(shmid, IPC_STAT, &shmid_ds) == 0) {
    //LoggerFactory::getLogger()->debug("shm_nattch=%d\n", shmid_ds.shm_nattch);
    if(shmid_ds.shm_nattch == 0) {
      //remove shared memery
       if (shmctl(shmid, IPC_RMID, 0) == -1)
        err_exit(errno, "mm_destroy shmctl IPC_RMID");
       else
         LoggerFactory::getLogger()->debug("shared memory destroy\n");
       SemUtil::inc(mutex);
       SemUtil::remove(mutex);
       return true;
    } else {
      SemUtil::inc(mutex);
    }
    return false;
  } else {
    err_msg(errno, "mm_destroy shmctl IPC_STAT");
    SemUtil::inc(mutex);
    return false;
  }
}
/*
 * extend_heap - Extend heap with free block and return its block pointer
 */