fujuntang
2021-11-16 d52c87dee3aac4af66ad2e1a86094ca27209d816
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 */
}