diff --git a/mps/test/function/21.c b/mps/test/function/21.c index 7992000899a..de15f4c8bcb 100644 --- a/mps/test/function/21.c +++ b/mps/test/function/21.c @@ -1,9 +1,10 @@ /* TEST_HEADER id = $Id$ - summary = allocate large promise, make it small, repeat + summary = allocate large object, free its middle, repeat language = c link = testlib.o + parameters = OBJECTS=2000 END_HEADER */ @@ -16,18 +17,20 @@ static void test(void) { mps_addr_t q; int p; - die(mps_arena_create(&arena, mps_arena_class_vm(), mmqaArenaSIZE), "create"); + die(mps_arena_create_k(&arena, mps_arena_class_vm(), mps_args_none), "create"); die(mps_pool_create(&pool, arena, mps_class_mv(), - (size_t)(1024*32), (size_t)(1024*16), (size_t)(1024*256)), + (size_t)(32), (size_t)(16), (size_t)(256)), "create MV pool"); - for (p=0; p<2000; p++) { - die(mps_alloc(&q, pool, 1024*1024), "alloc"); + for (p=0; p 0) + mps_arena_destroy(arena1); arena1=arena; } + mps_arena_destroy(arena1); } int main(void) diff --git a/mps/test/function/8.c b/mps/test/function/8.c index 1b54b608170..f2fa9a9af42 100644 --- a/mps/test/function/8.c +++ b/mps/test/function/8.c @@ -1,12 +1,12 @@ /* TEST_HEADER id = $Id$ - summary = create arenas until an error results, see if it leaks at failure + summary = check that failed arena creation doesn't leak language = c link = testlib.o + parameters = ARENAS=10 OUTPUT_SPEC - arena > 10 - arena_tight = 129 + arena >= 10 END_HEADER */ @@ -14,45 +14,26 @@ END_HEADER #include "mpsavm.h" -#define minArenaSIZE ((size_t)(130 * 1024)) - - static void test(void) { - mps_arena_t arena, previousArena = NULL; + mps_arena_t arena; mps_res_t res; - size_t size = (size_t)(1024*1024*10L); int p = 0, i; - /* make sure you can create at least 10 */ - while ((res = mps_arena_create(&arena, mps_arena_class_vm(), size)) + /* fill address space with small arenas */ + while ((res = mps_arena_create(&arena, mps_arena_class_vm(), 1)) == MPS_RES_OK) { p++; - report("arena", "%i", p); } - asserts(res == MPS_RES_RESOURCE, "wrong error loop"); - /* fill address space with arenas */ - while (size > 2 * minArenaSIZE) { - size /= 2; - res = mps_arena_create(&arena, mps_arena_class_vm(), size); - asserts(res == MPS_RES_OK || res == MPS_RES_RESOURCE, "error fill"); - if (res == MPS_RES_OK) p++; - } - report("arena2", "%i", p); - report("size", "%i", size); - /* there could still be holes, fill some more */ - while ((res = mps_arena_create(&arena, mps_arena_class_vm(), minArenaSIZE)) - == MPS_RES_OK) { - p++; previousArena = arena; - } - mps_arena_destroy(previousArena); - report("arena3", "%i", p); - /* test that you can create and fail without leaking */ - for (i = 0; i < minArenaSIZE / 1024; ++i) { - res = mps_arena_create(&arena, mps_arena_class_vm(), (size_t)(1024*1024*10L)); + report("arena", "%d", p); + /* destroy one small arena */ + mps_arena_destroy(arena); + for (i = 0; i < ARENAS; ++i) { + /* there isn't enough space for a large arena */ + res = mps_arena_create(&arena, mps_arena_class_vm(), (size_t)1 << 20); asserts(res == MPS_RES_RESOURCE, "error leak"); - die(mps_arena_create(&arena, mps_arena_class_vm(), minArenaSIZE), "leak"); - report("arena_tight", "%i", i); + /* but destroying one small arena makes room for another */ + die(mps_arena_create(&arena, mps_arena_class_vm(), 1), "leak"); mps_arena_destroy(arena); } } @@ -60,6 +41,11 @@ static void test(void) int main(void) { - easy_tramp(test); + if (MPS_WORD_WIDTH <= 32) { + easy_tramp(test); + } else { + /* Can't exhaust 64-bit address space by allocating, so fake a pass. */ + report("arena", "%d", ARENAS); + } return 0; } diff --git a/mps/test/function/98.c b/mps/test/function/98.c index c982606990f..051b7d3e9b0 100644 --- a/mps/test/function/98.c +++ b/mps/test/function/98.c @@ -1,11 +1,12 @@ /* TEST_HEADER id = $Id$ - summary = create arenas at once until an error results! + summary = fill address space with arenas until an error results! language = c link = testlib.o + parameters = ARENAS=10 OUTPUT_SPEC - arena > 10 + arena >= 10 END_HEADER */ @@ -14,22 +15,29 @@ END_HEADER static void test(void) { - mps_arena_t arena; + mps_arena_t arena; + mps_res_t res; + int p; - int p; - - p=0; - - while (1) - { - die(mps_arena_create(&arena, mps_arena_class_vm(), (size_t) (1024*1024*10)), "create"); - p = p+1; + for (p = 0;; ++p) { + MPS_ARGS_BEGIN(args) { + MPS_ARGS_ADD(args, MPS_KEY_ARENA_SIZE, 1); + res = mps_arena_create_k(&arena, mps_arena_class_vm(), args); + } MPS_ARGS_END(args); + if (res != MPS_RES_OK) + break; + } + asserts(res == MPS_RES_RESOURCE, "resource"); report("arena", "%i", p); - } } int main(void) { - easy_tramp(test); - return 0; + if (MPS_WORD_WIDTH <= 32) { + easy_tramp(test); + } else { + /* Can't exhaust 64-bit address space by allocating, so fake a pass. */ + report("arena", "%d", ARENAS); + } + return 0; } diff --git a/mps/test/testsets/passing b/mps/test/testsets/passing index ab73a7e1952..9b6928d3ac2 100644 --- a/mps/test/testsets/passing +++ b/mps/test/testsets/passing @@ -10,7 +10,7 @@ function/1.c function/5.c function/6.c function/7.c -% function/8.c -- tries to exhaust memory by mps_arena_create +function/8.c function/9.c function/10.c function/11.c @@ -88,7 +88,7 @@ function/83.c % 84-95 -- no such test function/96.c function/97.c -% function/98.c -- tries to exhaust memory by mps_arena_create +function/98.c function/99.c function/100.c function/101.c