mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-25 23:10:47 -08:00
1. On w3i6mv, int and long are 32 bits, so these types can't be used to hold a size_t or an mps_word_t. See 26.c, 38.c, 47.c, 66.c, 123.c, 136.c, 164.c, 165.c, 200.c, 203.c, 204.c, 205.c, 206.c, 207.c, 215.c, 223.c. 2. The Windows command line doesn't cope with parentheses. See 170.c. 3. The natural platform alignment is 16 bytes on w3i6mv, so allocations into pools using the default alignment need to be rounded up. See 21.c, 22.c, 203.c, 204.c, 205.c. 4. Microsoft Visual C/C++ is fussy about signed/unsigned comparison. See 226.c. 5. windows.h defines a SIZE macro so you can't use it as a parameter. See 232.c. Copied from Perforce Change: 191569 ServerID: perforce.ravenbrook.com
107 lines
2.7 KiB
C
107 lines
2.7 KiB
C
/*
|
|
TEST_HEADER
|
|
id = $Id$
|
|
summary = simple spare commit limit test
|
|
language = c
|
|
link = testlib.o rankfmt.o
|
|
harness = 2.0
|
|
parameters = EXTEND=65536 AVGSIZE=32 BIGSIZE=5000000;
|
|
OUTPUT_SPEC
|
|
reduce1 > 4000000
|
|
reduce2 <= 0
|
|
reduce3 > 3000000
|
|
completed = yes
|
|
END_HEADER
|
|
*/
|
|
|
|
#include "testlib.h"
|
|
#include "mpscmvff.h"
|
|
#include "mpsavm.h"
|
|
|
|
mps_arena_t arena;
|
|
|
|
#define MAXOBJS (10000)
|
|
|
|
mps_addr_t objs[MAXOBJS];
|
|
mps_addr_t sizes[MAXOBJS];
|
|
|
|
static void test(void)
|
|
{
|
|
mps_pool_t pool;
|
|
mps_thr_t thread;
|
|
|
|
size_t com0, com1, com2;
|
|
|
|
/* create a VM arena of 40MB with commit limit of 100MB, i.e. let the
|
|
arena do the limiting. */
|
|
|
|
MPS_ARGS_BEGIN(args) {
|
|
MPS_ARGS_ADD(args, MPS_KEY_ARENA_SIZE, 1024*1024*40);
|
|
MPS_ARGS_ADD(args, MPS_KEY_COMMIT_LIMIT, 1024ul*1024ul*100ul);
|
|
cdie(mps_arena_create_k(&arena, mps_arena_class_vm(), args),
|
|
"create arena");
|
|
} MPS_ARGS_END(args);
|
|
|
|
cdie(mps_thread_reg(&thread, arena), "register thread");
|
|
|
|
MPS_ARGS_BEGIN(args) {
|
|
MPS_ARGS_ADD(args, MPS_KEY_EXTEND_BY, EXTEND);
|
|
MPS_ARGS_ADD(args, MPS_KEY_MEAN_SIZE, AVGSIZE);
|
|
MPS_ARGS_ADD(args, MPS_KEY_MVFF_ARENA_HIGH, 0);
|
|
MPS_ARGS_ADD(args, MPS_KEY_MVFF_SLOT_HIGH, 0);
|
|
MPS_ARGS_ADD(args, MPS_KEY_MVFF_FIRST_FIT, 1);
|
|
/* Set SPARE to 0 as we are testing arena hysteresis here and we
|
|
don't want MVFF hysteresis to get in the way. */
|
|
MPS_ARGS_ADD(args, MPS_KEY_SPARE, 0.0);
|
|
cdie(mps_pool_create_k(&pool, arena, mps_class_mvff(), args),
|
|
"create low pool");
|
|
} MPS_ARGS_END(args);
|
|
|
|
/* Set the spare commit limit to 0MB */
|
|
|
|
mps_arena_spare_commit_limit_set(arena, (size_t) 0);
|
|
die(mps_alloc(&objs[0], pool, BIGSIZE), "alloc");
|
|
com0 = mps_arena_committed(arena);
|
|
mps_free(pool, objs[0], BIGSIZE);
|
|
com1 = mps_arena_committed(arena);
|
|
|
|
/* the free should have reduced the total amount committed */
|
|
report("reduce1", "%ld", com0-com1);
|
|
|
|
/* Try again but with arena hysteresis */
|
|
|
|
/* nb. size_t unsigned, therefore (size_t)-1 is the maximum limit */
|
|
mps_arena_spare_commit_limit_set(arena, (size_t)-1);
|
|
die(mps_alloc(&objs[0], pool, BIGSIZE), "alloc");
|
|
com0 = mps_arena_committed(arena);
|
|
mps_free(pool, objs[0], BIGSIZE);
|
|
com1 = mps_arena_committed(arena);
|
|
|
|
/* This time the free shouldn't make any difference */
|
|
report("reduce2", "%ld", com0-com1);
|
|
|
|
/* Reducing the spare committed limit should return most of the spare */
|
|
mps_arena_spare_commit_limit_set(arena, (size_t)(1024*1024));
|
|
com2 = mps_arena_committed(arena);
|
|
report("reduce3", "%ld", com0-com2);
|
|
|
|
comment("Finishing off.");
|
|
|
|
mps_pool_destroy(pool);
|
|
comment("Destroyed pool.");
|
|
|
|
mps_thread_dereg(thread);
|
|
comment("Deregistered thread.");
|
|
|
|
mps_arena_destroy(arena);
|
|
comment("Destroyed arena.");
|
|
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
easy_tramp(test);
|
|
pass();
|
|
return 0;
|
|
}
|
|
|