Esempio n. 1
0
static int
ssmem_mem_reclaim(ssmem_allocator_t* a)
{
  if (__builtin_expect(a->released_num > 0, 0))
    {
      ssmem_released_t* rel_cur = a->released_mem_list;
      ssmem_released_t* rel_nxt = rel_cur->next;

      if (rel_nxt != NULL && ssmem_ts_compare(rel_cur->ts_set, rel_nxt->ts_set))
	{
	  rel_cur->next = NULL;
	  a->released_num = 1;
	  /* find and collect the memory */
	  do
	    {
	      rel_cur = rel_nxt;
	      free(rel_cur->mem);
	      free(rel_cur);
	      rel_nxt = rel_nxt->next;
	    }
	  while (rel_nxt != NULL);
	}
    }

  ssmem_free_set_t* fs_cur = a->free_set_list;
  if (fs_cur->ts_set == NULL)
    {
      return 0;
    }
  ssmem_free_set_t* fs_nxt = fs_cur->set_next;
  int gced_num = 0;

  if (fs_nxt == NULL || fs_nxt->ts_set == 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;

      /* 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;
    }

  /* if (gced_num) */
  /*   { */
  /*     printf("//collected %d sets\n", gced_num); */
  /*   } */
  return gced_num;
}
Esempio n. 2
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;
}