From 2b43ef443f14889e086bdf0ccb28e66d17efd2ae Mon Sep 17 00:00:00 2001
From: wangzhengquan <wangzhengquan85@126.com>
Date: 星期二, 22 十二月 2020 12:01:13 +0800
Subject: [PATCH] update

---
 src/queue/mm.c |  146 ++++++++++++++----------------------------------
 1 files changed, 42 insertions(+), 104 deletions(-)

diff --git a/src/queue/mm.c b/src/queue/mm.c
index f09fbab..979cced 100644
--- a/src/queue/mm.c
+++ b/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);
+    // 鍙湁褰撳墠涓�涓繘绋媋ttach鍒板叡浜唴瀛樹笂
+    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
  */

--
Gitblit v1.8.0