From d52c87dee3aac4af66ad2e1a86094ca27209d816 Mon Sep 17 00:00:00 2001
From: fujuntang <fujuntang@smartai.com>
Date: 星期二, 16 十一月 2021 16:19:45 +0800
Subject: [PATCH] Fix the service manager exits exceptionally issue.

---
 src/shm/mm.cpp |   50 +++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 45 insertions(+), 5 deletions(-)

diff --git a/src/shm/mm.cpp b/src/shm/mm.cpp
index 5837906..29e6364 100644
--- a/src/shm/mm.cpp
+++ b/src/shm/mm.cpp
@@ -3,6 +3,8 @@
  */
 #include "mm.h"
 #include "sem_util.h"
+#include "hashtable.h"
+#include "key_def.h"
 #include "logger_factory.h"
 #include "bh_api.h"
 #include <sys/sem.h>
@@ -62,8 +64,6 @@
 #define PREV_FBLKP(bp) (*PREDRP(bp))
 
 /* $end mallocmacros */
-
-
 
 // #define MAX_HEAP (512*(1<<20))  /* 20 MB */
 #define MAX_HEAP (512)  /* 20 MB */
@@ -138,8 +138,11 @@
  */
 void mm_free(void *ptr, int enable)
 {
-  if ((ptr == 0) || (*(size_t *)(ptr - SIZE_T_SIZE) == 0x00)) 
-    return; 
+  if (ptr == 0) 
+    return;
+
+  if (check_mm_valid(ptr) == false)
+    return;
 
   /*
    *if (!is_allocated(ptr) ) {
@@ -494,7 +497,7 @@
   }
 
   *(size_t *)bp = inter_key_get();
-  
+
   return (bp + SIZE_T_SIZE);
 }
 
@@ -524,6 +527,10 @@
 {
   void *bp = heap_listp;
 
+  unsigned int diff;
+  struct timeval start, end;
+
+  gettimeofday(&start, NULL);
   SemUtil::dec(mutex);
   for (bp = heap_listp; GET_SIZE(HDRP(bp)) > 0; bp = NEXT_BLKP(bp))
   {
@@ -532,10 +539,33 @@
         mm_free(bp + SIZE_T_SIZE, false);
       }
     }
+
+    gettimeofday(&end, NULL);
+
+    diff = end.tv_sec - start.tv_sec;
+    if (diff >= TIME_DUR)
+      break;
   }
   SemUtil::inc(mutex);
 
   return;
+}
+
+int check_mm_valid(void *bp)
+{
+  int val;
+
+  if ((bp >= mem_start_brk) && (bp <= mem_max_addr) && (GET_ALLOC(HDRP(bp - SIZE_T_SIZE)))) {
+
+    val = *(size_t *)(bp - SIZE_T_SIZE);
+    if (((val >= START_KEY) && (val <= (START_KEY + MAPSIZE))) || (val == SHM_BUS_KEY)) {
+      return true;
+    }
+
+    return false;
+  }
+
+  return false;
 }
 
 /*
@@ -544,7 +574,10 @@
 static void *find_fit(size_t size)
 {
   void *bp;
+  unsigned int diff;
+  struct timeval start, end;
 
+  gettimeofday(&start, NULL);  
   for (bp = NEXT_FBLKP(heap_listp); bp != heap_listp; bp = NEXT_FBLKP(bp))
   {
     if (!GET_ALLOC(HDRP(bp)) && (size <= GET_SIZE(HDRP(bp))))
@@ -554,7 +587,14 @@
     {
       break;
     }
+
+    gettimeofday(&end, NULL);
+    
+    diff = end.tv_sec - start.tv_sec;
+    if (diff >= TIME_DUR)
+      break;
   }
+  
   return NULL; /* No fit */
 }
 

--
Gitblit v1.8.0