示例#1
0
static void free_pages(void *p, size_t len)
{
  free_used_pages(len);
  sfree(p, len);

  LOGICALLY_FREEING_PAGES(len);
  ACTUALLY_FREEING_PAGES(len);
}
示例#2
0
static void flush_freed_pages(void)
{
    int i;

    collapse_adjacent_pages();

    for (i = 0; i < BLOCKFREE_CACHE_SIZE; i++) {
        if (blockfree[i].start) {
            if (blockfree[i].age == BLOCKFREE_UNMAP_AGE) {
                system_free_pages(blockfree[i].start, blockfree[i].len);
                ACTUALLY_FREEING_PAGES(blockfree[i].len);
                blockfree[i].start = NULL;
                blockfree[i].len = 0;
            } else
                blockfree[i].age++;
        }
    }
}
示例#3
0
static void free_actual_pages(void *p, size_t len, int zeroed)
{
    int i;

    /* Round up to nearest page: */
    if (len & (page_size - 1))
        len += page_size - (len & (page_size - 1));

    /* Try to free pages in larger blocks, since the OS may be slow. */

    for (i = 0; i < BLOCKFREE_CACHE_SIZE; i++)
        if(blockfree[i].start && (blockfree[i].len < (1024 * 1024))) {
            if (p == blockfree[i].start + blockfree[i].len) {
                blockfree[i].len += len;
                if (!zeroed)
                    blockfree[i].zeroed = 0;
                return;
            }
            if (p + len == blockfree[i].start) {
                blockfree[i].start = p;
                blockfree[i].len += len;
                if (!zeroed)
                    blockfree[i].zeroed = 0;
                return;
            }
        }

    for (i = 0; i < BLOCKFREE_CACHE_SIZE; i++) {
        if (!blockfree[i].start) {
            blockfree[i].start = p;
            blockfree[i].len = len;
            blockfree[i].age = 0;
            blockfree[i].zeroed = zeroed;
            return;
        }
    }

    /* Might help next time around: */
    collapse_adjacent_pages();

    system_free_pages(p, len);

    ACTUALLY_FREEING_PAGES(len);
}
示例#4
0
static void flush_freed_pages(void)
{
#if CACHE_SLOTS
  int i;
  void *p, *next;

  for (i = 0; i < CACHE_SLOTS; i++) {
    if (cache[1][i].len) {
      for (p = cache[1][i].page; p; p = next) {
	next = *(void **)p;
	ACTUALLY_FREEING_PAGES(cache[i].len);
	VirtualFree(p, 0, MEM_RELEASE);
      }
    }
    cache[1][i].len = cache[0][i].len;
    cache[1][i].page = cache[0][i].page;
    cache[0][i].len = 0;
    cache[0][i].page = NULL;
  }
#endif
}
示例#5
0
static void free_pages(void *p, size_t len)
{
  LOGICALLY_FREEING_PAGES(len);

#if CACHE_SLOTS
  {
    int i;
   
    for (i = 0; i < CACHE_SLOTS; i++) {
      if (!cache[0][i].len)
	cache[0][i].len = len;
      if (cache[0][i].len == len) {
	*(void **)p = cache[0][i].page;
	cache[0][i].page = p;
	return;
      }
    }
  }
#endif

  ACTUALLY_FREEING_PAGES(len);

  VirtualFree(p, 0, MEM_RELEASE);
}