From b90ba316b54db321d3e8aaac7df93b46d80b9d9c Mon Sep 17 00:00:00 2001
From: wangzhengquan <wangzhengquan85@126.com>
Date: 星期二, 22 十二月 2020 15:47:41 +0800
Subject: [PATCH] 三个没有回收的信号

---
 src/queue/mm.c |  158 ++++++++++++++++++++--------------------------------
 1 files changed, 60 insertions(+), 98 deletions(-)

diff --git a/src/queue/mm.c b/src/queue/mm.c
index bfd27d9..dc6f5be 100644
--- a/src/queue/mm.c
+++ b/src/queue/mm.c
@@ -81,7 +81,7 @@
 static void *place(void *bp, size_t size);
 static void *find_fit(size_t size);
 static void *coalesce(void *bp);
-static void rm_fblock(void *bp);
+static inline void rm_fblock(void *bp);
 static void insert_fblock (void *bp);
 
 static void *mem_sbrk(int incr);
@@ -300,115 +300,76 @@
   return first;
 }
 
-hashtable_t * mm_get_hashtable() {
-  return 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 {
+    //LoggerFactory::getLogger()->debug("shm_nattch=%d\n", shmid_ds.shm_nattch);
+    // 鍙湁褰撳墠涓�涓繘绋媋ttach鍒板叡浜唴瀛樹笂
+    if (shmid_ds.shm_nattch > 1) {
+      //detache
+      if (shmdt(shmp) == -1) {
+        LoggerFactory::getLogger()->error(errno, "mm_destroy shmdt");
+      }
       SemUtil::inc(mutex);
-    }
-    return false;
+      return false;
+    } else  {
+      
+      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");
+
+      LoggerFactory::getLogger()->debug(errno, "mm_destroy: real destroy.");
+
+      SemUtil::inc(mutex);
+      SemUtil::remove(mutex);
+      return true;
+
+    } 
+    
   } else {
     err_msg(errno, "mm_destroy shmctl IPC_STAT");
     SemUtil::inc(mutex);
     return false;
   }
- 
-  
 }
+
+hashtable_t * mm_get_hashtable() {
+  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);
+}
+
 /*
  * extend_heap - Extend heap with free block and return its block pointer
  */
@@ -444,9 +405,10 @@
 /**
  * remove a block form free list
  */
-static void rm_fblock(void *rbp)
+static inline void rm_fblock(void *rbp)
 {
   // the successor of the previous block of rbp point to next block of rbp
+
   PUT_PTR(SUCCRP(PREV_FBLKP(rbp)), NEXT_FBLKP(rbp));
   // the predecessor of then next block of rbp point to previous block of rbp
   PUT_PTR(PREDRP(NEXT_FBLKP(rbp)), PREV_FBLKP(rbp));

--
Gitblit v1.8.0