Ejemplo n.º 1
0
void*
ssmem_alloc(ssmem_allocator_t* a, size_t size)
{
  void* m = NULL;

#ifdef TIGHT_ALLOC
  m = (void*) malloc(size);
#else

  /* 1st try to use from the collected memory */
  ssmem_free_set_t* cs = a->collected_set_list;
  if (cs != NULL)
    {
      m = (void*) cs->set[--cs->curr];
      PREFETCHW(m);

      if (cs->curr <= 0)
  {
    a->collected_set_list = cs->set_next;
    a->collected_set_num--;

    ssmem_free_set_make_avail(a, cs);
  }
    }
  else
    {
      if ((a->mem_curr + size) >= a->mem_size)
  {
    /* printf("[ALLOC] out of mem, need to allocate\n"); */
    a->mem = (void*) memalign(CACHE_LINE_SIZE, a->mem_size);
    assert(a->mem != NULL);
    a->mem_curr = 0;

    a->tot_size += a->mem_size;

    a->mem_chunks = ssmem_list_node_new(a->mem, a->mem_chunks);
  }

      m = a->mem + a->mem_curr;
      a->mem_curr += size;
    }
#endif

#if SSMEM_TS_INCR_ON == SSMEM_TS_INCR_ON_ALLOC || SSMEM_TS_INCR_ON == SSMEM_TS_INCR_ON_BOTH
  ssmem_ts_next();
#endif
  return m;
}
Ejemplo n.º 2
0
void* 
ssmem_alloc(ssmem_allocator_t* a, size_t size)
{
  void* m = NULL;

  /* 1st try to use from the collected memory */
  ssmem_free_set_t* cs = a->collected_set_list;
  if (cs != NULL)
    {
      m = (void*) cs->set[--cs->curr];
      PREFETCHW(m);

      if (cs->curr <= 0)
	{
	  a->collected_set_list = cs->set_next;
	  a->collected_set_num--;

	  ssmem_free_set_make_avail(a, cs);
	}
    }
  else
    {
      if ((a->mem_curr + size) >= a->mem_size)
	{
#if SSMEM_MEM_SIZE_DOUBLE == 1
	  a->mem_size <<= 1;
	  if (a->mem_size > SSMEM_MEM_SIZE_MAX)
	    {
	      a->mem_size = SSMEM_MEM_SIZE_MAX;
	    }
#endif
	  /* printf("[ALLOC] out of mem, need to allocate (chunk = %llu MB)\n", */
	  /* 	 a->mem_size / (1LL<<20)); */
	  if (size > a->mem_size)
	    {
	      /* printf("[ALLOC] asking for large mem. chunk\n"); */
	      while (a->mem_size < size)
		{
		  if (a->mem_size > SSMEM_MEM_SIZE_MAX)
		    {
		      fprintf(stderr, "[ALLOC] asking for memory chunk larger than max (%llu MB) \n",
			      SSMEM_MEM_SIZE_MAX / (1024 * 1024LL));
		      assert(a->mem_size <= SSMEM_MEM_SIZE_MAX);
		    }
		  a->mem_size <<= 1;
		}
	      /* printf("[ALLOC] new mem size chunk is %llu MB\n", a->mem_size / (1024 * 1024LL)); */
	    }
#if SSMEM_TRANSPARENT_HUGE_PAGES
	  int ret = posix_memalign(&a->mem, CACHE_LINE_SIZE, a->mem_size);
	  assert(ret == 0);
#else
	  a->mem = (void*) memalign(CACHE_LINE_SIZE, a->mem_size);
#endif
	  assert(a->mem != NULL);
#if SSMEM_ZERO_MEMORY == 1
	  memset(a->mem, 0, a->mem_size);
#endif

	  a->mem_curr = 0;
      
	  a->tot_size += a->mem_size;

	  a->mem_chunks = ssmem_list_node_new(a->mem, a->mem_chunks);
	}

      m = a->mem + a->mem_curr;
      a->mem_curr += size;
    }

#if SSMEM_TS_INCR_ON == SSMEM_TS_INCR_ON_ALLOC || SSMEM_TS_INCR_ON == SSMEM_TS_INCR_ON_BOTH
  ssmem_ts_next();
#endif
  return m;
}
Ejemplo n.º 3
0
static int
ssmem_mem_reclaim(ssmem_allocator_t* a)
{
  ssmem_free_set_t* fs_cur = a->free_set_list;
  ssmem_free_set_t* fs_nxt = fs_cur->set_next;

  if (__builtin_expect(a->released_num > 0, 0))
    {
      size_t* ts_ref = fs_cur->ts_set;
      ssmem_released_t* rel_cur = NULL;
      ssmem_released_t* rel_nxt = a->released_mem_list;
      int gc_rest = 0;
      int num_cannot_release = 0;
      int num_release = 0;
      while (rel_nxt != NULL)
	{
	  if (gc_rest || ssmem_ts_compare(ts_ref, rel_nxt->ts_set))
	    {
	      gc_rest = 1;
	      if (rel_cur == NULL)
		{
		  a->released_mem_list = rel_nxt->next;
		}
	      else
		{
		  rel_cur->next = rel_nxt->next;
		}
	      num_release++;
	      ssmem_released_t* rel_free = rel_nxt;
	      rel_nxt = rel_nxt->next;
	      free(rel_free->mem);
	      /* free(rel_free->ts_set); */
	      free(rel_free);
	    }
	  else
	    {
	      num_cannot_release++;
	      rel_cur = rel_nxt;
	      rel_nxt = rel_nxt->next;
	    }
	}
      a->released_num = num_cannot_release;
    }

  int gced_num = 0;

  if (fs_nxt == NULL)		/* need at least 2 sets to compare */
    {
      return 0;
    }

  if (ssmem_ts_compare(fs_cur->ts_set, fs_nxt->ts_set))
    {
      gced_num = a->free_set_num - 1;
      /* take the the suffix of the list (all collected free_sets) away from the
	 free_set list of a and set the correct num of free_sets*/
      fs_cur->set_next = NULL;
      a->free_set_num = 1;

#ifdef TIGHT_ALLOC
      int i;
      ssmem_free_set_t* fs_nxt_nxt;
      while (fs_nxt != NULL) {
        for (i = 0; i < fs_nxt->size; i++) {
          free((void *) fs_nxt->set[i]);
        }
        fs_nxt_nxt = fs_nxt->set_next;
        ssmem_free_set_make_avail(a, fs_nxt);
        fs_nxt = fs_nxt_nxt;
      }
#else

      /* find the tail for the collected_set list in order to append the new
   free_sets that were just collected */
      ssmem_free_set_t* collected_set_cur = a->collected_set_list;
      if (collected_set_cur != NULL)
  {
    while (collected_set_cur->set_next != NULL)
      {
        collected_set_cur = collected_set_cur->set_next;
      }

    collected_set_cur->set_next = fs_nxt;
  }
      else
  {
    a->collected_set_list = fs_nxt;
  }
      a->collected_set_num += gced_num;
#endif
    }

  /* if (gced_num) */
  /*   { */
  /*     printf("//collected %d sets\n", gced_num); */
  /*   } */
  return gced_num;
}