static void free_pages(void *p, size_t len) { free_used_pages(len); sfree(p, len); LOGICALLY_FREEING_PAGES(len); ACTUALLY_FREEING_PAGES(len); }
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++; } } }
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); }
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 }
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); }