GC: avoid trying to prime a full page cache
This commit is contained in:
parent
49fd1e41da
commit
7fbe6a4097
|
@ -56,8 +56,16 @@ static void alloc_cache_collapse_pages(AllocCacheBlock *blockfree)
|
||||||
int i;
|
int i;
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
/* sort by AllocCacheBlock->start */
|
/* Sorted already? */
|
||||||
my_qsort(blockfree, BLOCKFREE_CACHE_SIZE, sizeof(AllocCacheBlock), alloc_cache_block_compare);
|
for (i = 1; i < BLOCKFREE_CACHE_SIZE; i++) {
|
||||||
|
if (blockfree[i-1].start > blockfree[i].start)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i < BLOCKFREE_CACHE_SIZE) {
|
||||||
|
/* sort by AllocCacheBlock->start */
|
||||||
|
my_qsort(blockfree, BLOCKFREE_CACHE_SIZE, sizeof(AllocCacheBlock), alloc_cache_block_compare);
|
||||||
|
}
|
||||||
|
|
||||||
/* collapse adjacent: */
|
/* collapse adjacent: */
|
||||||
j = 0;
|
j = 0;
|
||||||
|
@ -183,6 +191,18 @@ static intptr_t alloc_cache_flush_freed_pages(AllocCacheBlock *blockfree)
|
||||||
return freed;
|
return freed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int alloc_cache_is_full(AllocCacheBlock *blockfree)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < BLOCKFREE_CACHE_SIZE; i++) {
|
||||||
|
if (!blockfree[i].start)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef NO_ALLOC_CACHE_FREE
|
#ifndef NO_ALLOC_CACHE_FREE
|
||||||
static intptr_t alloc_cache_free_all_pages(AllocCacheBlock *blockfree)
|
static intptr_t alloc_cache_free_all_pages(AllocCacheBlock *blockfree)
|
||||||
{
|
{
|
||||||
|
@ -220,7 +240,13 @@ static void *alloc_cache_alloc_page(AllocCacheBlock *blockfree, size_t len, siz
|
||||||
r = alloc_cache_find_pages(blockfree, len, alignment, dirty_ok);
|
r = alloc_cache_find_pages(blockfree, len, alignment, dirty_ok);
|
||||||
if(!r) {
|
if(!r) {
|
||||||
/* attempt to allocate from OS */
|
/* attempt to allocate from OS */
|
||||||
size_t extra = (alignment ? (alignment + CACHE_SEED_PAGES * APAGE_SIZE) : 0);
|
size_t extra;
|
||||||
|
|
||||||
|
if (alloc_cache_is_full(blockfree))
|
||||||
|
extra = alignment;
|
||||||
|
else
|
||||||
|
extra = (alignment ? (alignment + CACHE_SEED_PAGES * APAGE_SIZE) : 0);
|
||||||
|
|
||||||
r = os_alloc_pages(len + extra);
|
r = os_alloc_pages(len + extra);
|
||||||
if(!r) { return NULL; }
|
if(!r) { return NULL; }
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user