From 27d8bc7cad4a8f68c2da3efbb77f45ec70ae40e6 Mon Sep 17 00:00:00 2001
From: liuxiaolong <liuxiaolong@aiotlink.com>
Date: 星期三, 05 一月 2022 14:11:39 +0800
Subject: [PATCH] pb.go MsgQueryProcReply add subLocalTopics and subNetTopics

---
 src/shm/mm.cpp |  109 ++++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 88 insertions(+), 21 deletions(-)

diff --git a/src/shm/mm.cpp b/src/shm/mm.cpp
index 2b52b51..bcfc1a7 100644
--- a/src/shm/mm.cpp
+++ b/src/shm/mm.cpp
@@ -3,7 +3,10 @@
  */
 #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>
 #include <sys/shm.h>
 
@@ -62,8 +65,6 @@
 
 /* $end mallocmacros */
 
-
-
 // #define MAX_HEAP (512*(1<<20))  /* 20 MB */
 #define MAX_HEAP (512)  /* 20 MB */
 /* Hard-coded keys for IPC objects */
@@ -113,7 +114,6 @@
 
   newsize = ALIGN(size +  (SIZE_T_SIZE << 1) +  (PTR_SIZE << 1) );
 
-    //fprintf(stderr, "mm_malloc : size=%u\n", size);
   /* Search the free list for a fit */
   SemUtil::dec(mutex);
   if ((ptr = find_fit(newsize)) != NULL)
@@ -123,8 +123,11 @@
     return aptr;
   } else {
     SemUtil::inc(mutex);
-    abort();
-    err_exit(0, "mm_malloc : out of memery\n");
+    err_msg(0, "mm_malloc : out of memery\n");
+    LoggerFactory::getLogger()->fatal("mm_malloc : out of memery\n");
+    // abort();
+    exit(1);
+    
     return NULL;
   }
 
@@ -133,9 +136,12 @@
 /*
  * mm_free - Free a block
  */
-void mm_free(void *ptr)
+void mm_free(void *ptr, int enable)
 {
-  if (ptr == 0)
+  if (ptr == 0) 
+    return;
+
+  if (check_mm_valid(ptr) == false)
     return;
 
   /*
@@ -145,15 +151,19 @@
    *}
    */
 
-  SemUtil::dec(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
@@ -235,7 +245,7 @@
 {
   
   //鍚屼竴杩涚▼鍐呭凡缁忓垵濮嬪寲杩囦簡
-  SemUtil::dec(mutex);
+  SemUtil::dec_uni(mutex);
   if (shmid != -1){
     hashtable = (hashtable_t *)shmp;
     SemUtil::inc(mutex);
@@ -254,6 +264,7 @@
     first = false;
     shmid  = shmget(SHM_KEY, 0, 0);
   }
+
   if (shmid == -1)
     err_exit(errno, "mm_init shmget");
   shmp = shmat(shmid, key_addr, 0);
@@ -308,7 +319,7 @@
 bool mm_destroy(void) {
   struct shmid_ds shmid_ds;
   
-  SemUtil::dec(mutex);
+  SemUtil::dec_uni(mutex);
   
   if(shmctl(shmid, IPC_STAT, &shmid_ds) == 0) {
     //LoggerFactory::getLogger()->debug("shm_nattch=%d\n", shmid_ds.shm_nattch);
@@ -333,10 +344,6 @@
       //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( "mm_destroy: real destroy.");
 
       SemUtil::inc(mutex);
       SemUtil::remove(mutex);
@@ -361,6 +368,7 @@
 
 void mm_free_by_key(int key) {
   void *ptr;
+
   ptr = hashtable_get(hashtable, key);
   if(ptr != NULL) {
     mm_free(ptr);
@@ -389,15 +397,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 +495,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,20 +523,78 @@
 
 }
 
+void find_mm_data(int val)
+{
+  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))
+  {
+    if (GET_ALLOC(HDRP(bp))) {
+      if ((*(size_t *)bp) == val) {
+        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 == SHM_BUS_KEY)) {
+      return true;
+    }
+
+    return false;
+  }
+
+  return false;
+}
+
 /*
  * find_fit - Find a fit for a block with size bytes
  */
 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))))
     {
       return bp;
+    } else if (GET_ALLOC(HDRP(bp)) && (GET_SIZE(HDRP(bp)) == 0)) 
+    {
+      break;
     }
+
+    gettimeofday(&end, NULL);
+    
+    diff = end.tv_sec - start.tv_sec;
+    if (diff >= TIME_DUR)
+      break;
   }
+  
   return NULL; /* No fit */
 }
 

--
Gitblit v1.8.0