From c479ef57baaaa28964fc3ec8d80ff99dffa7d49f Mon Sep 17 00:00:00 2001
From: fujuntang <fujuntang@smartai.com>
Date: 星期三, 10 十一月 2021 09:49:29 +0800
Subject: [PATCH] Fix the system hang issue when the app is killed contantly.

---
 src/shm/mm.cpp |   49 ++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 38 insertions(+), 11 deletions(-)

diff --git a/src/shm/mm.cpp b/src/shm/mm.cpp
index 13ec443..5837906 100644
--- a/src/shm/mm.cpp
+++ b/src/shm/mm.cpp
@@ -4,6 +4,7 @@
 #include "mm.h"
 #include "sem_util.h"
 #include "logger_factory.h"
+#include "bh_api.h"
 #include <sys/sem.h>
 #include <sys/shm.h>
 
@@ -135,10 +136,10 @@
 /*
  * mm_free - Free a block
  */
-void mm_free(void *ptr)
+void mm_free(void *ptr, int enable)
 {
-  if (ptr == 0)
-    return;
+  if ((ptr == 0) || (*(size_t *)(ptr - SIZE_T_SIZE) == 0x00)) 
+    return; 
 
   /*
    *if (!is_allocated(ptr) ) {
@@ -147,15 +148,19 @@
    *}
    */
 
-  SemUtil::dec_uni(mutex);
+  if (enable == true) {
+    SemUtil::dec_uni(mutex);
+  }
+  ptr -= SIZE_T_SIZE;
   size_t size = GET_SIZE(HDRP(ptr));
   PUT(HDRP(ptr), PACK(size, 0));
   PUT(FTRP(ptr), PACK(size, 0));
+  *(size_t *)ptr = 0x00;
   coalesce(ptr);
-  SemUtil::inc(mutex);
+  if (enable == true) {
+    SemUtil::inc(mutex);
+  }
 }
-
-
 
 /*
  * mm_realloc - Naive implementation of realloc
@@ -389,15 +394,13 @@
   PUT(HDRP(bp), PACK(size, 0));         /* Free block header */   //line:vm:mm:freeblockhdr
   PUT(FTRP(bp), PACK(size, 0));         /* Free block footer */   //line:vm:mm:freeblockftr
   PUT(HDRP(NEXT_BLKP(bp)), PACK(0, 1)); /* New epilogue header */ //line:vm:mm:newepihdr
-
+  
   /* Coalesce if the previous block was free */
   return coalesce(bp);                                          //line:vm:mm:returnblock
 }
 
 static void insert_fblock (void *bp)
 {
-  //鍚庤繘鍏堝嚭鐨勬柟寮忔彃鍏ワ紝鍗虫彃鍏ラ摼琛ㄥご浣嶇疆
-
   // insert into the header of the free list
   PUT_PTR(SUCCRP(bp), NEXT_FBLKP(heap_listp)); //the successor of bp point to the old first free block
   PUT_PTR(PREDRP(NEXT_FBLKP(heap_listp)), bp); //the predecessor of the old first free block point to bp
@@ -489,7 +492,10 @@
     PUT(FTRP(bp), PACK(csize, 1));
     rm_fblock(bp);
   }
-  return bp;
+
+  *(size_t *)bp = inter_key_get();
+  
+  return (bp + SIZE_T_SIZE);
 }
 
 static int is_allocated(void *ptr)
@@ -514,6 +520,24 @@
 
 }
 
+void find_mm_data(int val)
+{
+  void *bp = heap_listp;
+
+  SemUtil::dec(mutex);
+  for (bp = heap_listp; GET_SIZE(HDRP(bp)) > 0; bp = NEXT_BLKP(bp))
+  {
+    if (GET_ALLOC(HDRP(bp))) {
+      if ((*(size_t *)bp) == val) {
+        mm_free(bp + SIZE_T_SIZE, false);
+      }
+    }
+  }
+  SemUtil::inc(mutex);
+
+  return;
+}
+
 /*
  * find_fit - Find a fit for a block with size bytes
  */
@@ -526,6 +550,9 @@
     if (!GET_ALLOC(HDRP(bp)) && (size <= GET_SIZE(HDRP(bp))))
     {
       return bp;
+    } else if (GET_ALLOC(HDRP(bp)) && (GET_SIZE(HDRP(bp)) == 0)) 
+    {
+      break;
     }
   }
   return NULL; /* No fit */

--
Gitblit v1.8.0