From 5efe7001d656388a86c498b6a5aa45d0f6de106c Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sun, 17 Jul 2011 20:07:46 -0600 Subject: [PATCH] fix "block cache" layer to handle allocation failure --- src/racket/gc2/block_cache.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/racket/gc2/block_cache.c b/src/racket/gc2/block_cache.c index b36494ce29..de973d7b59 100644 --- a/src/racket/gc2/block_cache.c +++ b/src/racket/gc2/block_cache.c @@ -85,13 +85,22 @@ static ssize_t block_cache_free(BlockCache* bc) { static block_desc *bc_alloc_std_block(block_group *bg) { int this_block_size = bg->block_size; void *r = os_alloc_pages(this_block_size); - void *ps = align_up_ptr(r, APAGE_SIZE); + block_desc *bd; + void *ps; + + if (!r) return NULL; + + ps = align_up_ptr(r, APAGE_SIZE); if (this_block_size < BC_MAX_BLOCK_SIZE) { bg->block_size <<= 1; } - block_desc *bd = (block_desc*) ofm_malloc(sizeof(block_desc)); + bd = (block_desc*) ofm_malloc(sizeof(block_desc)); + if (!bd) { + os_free_pages(r, this_block_size); + return NULL; + } bd->block = r; bd->free = ps; bd->size = this_block_size; @@ -151,8 +160,10 @@ static void *bc_alloc_std_page(BlockCache *bc, int dirty_ok, int expect_mprotect } } else { + block_desc *bd; newbl = 1; - block_desc *bd = bc_alloc_std_block(bg); + bd = bc_alloc_std_block(bg); + if (!bd) return NULL; gclist_add(free_head, &(bd->gclist)); (*size_diff) += bd->size; /* printf("ALLOC BLOCK %i %p %p-%p size %li %p\n", expect_mprotect, bg, bd->block, bd->block + bd->size, bd->size, bd->free); */