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