diff --git a/mps/code/amcss.c b/mps/code/amcss.c index b284379394e..ba4a3bfc7c2 100644 --- a/mps/code/amcss.c +++ b/mps/code/amcss.c @@ -301,7 +301,7 @@ int main(int argc, char *argv[]) MPS_ARGS_BEGIN(args) { MPS_ARGS_ADD(args, MPS_KEY_ARENA_SIZE, 2*testArenaSIZE); - MPS_ARGS_ADD(args, MPS_KEY_ARENA_GRAIN_SIZE, (size_t)1 << (rnd() % 15)); + MPS_ARGS_ADD(args, MPS_KEY_ARENA_GRAIN_SIZE, rnd_grain(2*testArenaSIZE)); die(mps_arena_create_k(&arena, mps_arena_class_vm(), args), "arena_create"); } MPS_ARGS_END(args); mps_message_type_enable(arena, mps_message_type_gc()); diff --git a/mps/code/amcsshe.c b/mps/code/amcsshe.c index 1fc9345140e..ced80bcc0cf 100644 --- a/mps/code/amcsshe.c +++ b/mps/code/amcsshe.c @@ -249,7 +249,7 @@ int main(int argc, char *argv[]) MPS_ARGS_BEGIN(args) { MPS_ARGS_ADD(args, MPS_KEY_ARENA_SIZE, 2*testArenaSIZE); - MPS_ARGS_ADD(args, MPS_KEY_ARENA_GRAIN_SIZE, (size_t)1 << (rnd() % 15)); + MPS_ARGS_ADD(args, MPS_KEY_ARENA_GRAIN_SIZE, rnd_grain(2*testArenaSIZE)); die(mps_arena_create_k(&arena, mps_arena_class_vm(), args), "arena_create"); } MPS_ARGS_END(args); mps_message_type_enable(arena, mps_message_type_gc()); diff --git a/mps/code/amcssth.c b/mps/code/amcssth.c index 38a349c3778..f4dedd55f7f 100644 --- a/mps/code/amcssth.c +++ b/mps/code/amcssth.c @@ -319,7 +319,7 @@ static void test_arena(int mode) MPS_ARGS_BEGIN(args) { MPS_ARGS_ADD(args, MPS_KEY_ARENA_SIZE, testArenaSIZE); - MPS_ARGS_ADD(args, MPS_KEY_ARENA_GRAIN_SIZE, (size_t)1 << (rnd() % 14)); + MPS_ARGS_ADD(args, MPS_KEY_ARENA_GRAIN_SIZE, rnd_grain(testArenaSIZE)); die(mps_arena_create_k(&arena, mps_arena_class_vm(), args), "arena_create"); } MPS_ARGS_END(args); if (mode == ModeCOMMIT) diff --git a/mps/code/amsss.c b/mps/code/amsss.c index 3fdf1ef55aa..915c8ed1522 100644 --- a/mps/code/amsss.c +++ b/mps/code/amsss.c @@ -208,7 +208,7 @@ int main(int argc, char *argv[]) MPS_ARGS_BEGIN(args) { MPS_ARGS_ADD(args, MPS_KEY_ARENA_SIZE, testArenaSIZE); - MPS_ARGS_ADD(args, MPS_KEY_ARENA_GRAIN_SIZE, (size_t)1 << (rnd() % 14)); + MPS_ARGS_ADD(args, MPS_KEY_ARENA_GRAIN_SIZE, rnd_grain(testArenaSIZE)); die(mps_arena_create_k(&arena, mps_arena_class_vm(), args), "arena_create"); } MPS_ARGS_END(args); die(mps_arena_commit_limit_set(arena, 2 * testArenaSIZE), "commit_limit_set"); diff --git a/mps/code/amssshe.c b/mps/code/amssshe.c index edac9733149..26dc25822e5 100644 --- a/mps/code/amssshe.c +++ b/mps/code/amssshe.c @@ -163,7 +163,7 @@ int main(int argc, char *argv[]) MPS_ARGS_BEGIN(args) { MPS_ARGS_ADD(args, MPS_KEY_ARENA_SIZE, testArenaSIZE); - MPS_ARGS_ADD(args, MPS_KEY_ARENA_GRAIN_SIZE, (size_t)1 << (rnd() % 14)); + MPS_ARGS_ADD(args, MPS_KEY_ARENA_GRAIN_SIZE, rnd_grain(testArenaSIZE)); die(mps_arena_create_k(&arena, mps_arena_class_vm(), args), "arena_create"); } MPS_ARGS_END(args); die(mps_thread_reg(&thread, arena), "thread_reg"); diff --git a/mps/code/apss.c b/mps/code/apss.c index 4bd4f203aa4..7de122af10d 100644 --- a/mps/code/apss.c +++ b/mps/code/apss.c @@ -204,7 +204,7 @@ int main(int argc, char *argv[]) MPS_ARGS_BEGIN(args) { MPS_ARGS_ADD(args, MPS_KEY_ARENA_SIZE, 2 * testArenaSIZE); - MPS_ARGS_ADD(args, MPS_KEY_ARENA_GRAIN_SIZE, (size_t)1 << (rnd() % 20)); + MPS_ARGS_ADD(args, MPS_KEY_ARENA_GRAIN_SIZE, rnd_grain(2*testArenaSIZE)); die(mps_arena_create_k(&arena, mps_arena_class_vm(), args), "mps_arena_create"); } MPS_ARGS_END(args); @@ -215,7 +215,7 @@ int main(int argc, char *argv[]) MPS_ARGS_BEGIN(args) { MPS_ARGS_ADD(args, MPS_KEY_ARENA_SIZE, 2 * testArenaSIZE); MPS_ARGS_ADD(args, MPS_KEY_ARENA_ZONED, FALSE); - MPS_ARGS_ADD(args, MPS_KEY_ARENA_GRAIN_SIZE, (size_t)1 << (rnd() % 20)); + MPS_ARGS_ADD(args, MPS_KEY_ARENA_GRAIN_SIZE, rnd_grain(2*testArenaSIZE)); die(mps_arena_create_k(&arena, mps_arena_class_vm(), args), "mps_arena_create"); } MPS_ARGS_END(args); @@ -226,7 +226,7 @@ int main(int argc, char *argv[]) MPS_ARGS_ADD(args, MPS_KEY_ARENA_SIZE, testArenaSIZE); MPS_ARGS_ADD(args, MPS_KEY_ARENA_ZONED, FALSE); MPS_ARGS_ADD(args, MPS_KEY_ARENA_CL_BASE, malloc(testArenaSIZE)); - MPS_ARGS_ADD(args, MPS_KEY_ARENA_GRAIN_SIZE, (size_t)1 << (rnd() % 20)); + MPS_ARGS_ADD(args, MPS_KEY_ARENA_GRAIN_SIZE, rnd_grain(testArenaSIZE)); die(mps_arena_create_k(&arena, mps_arena_class_cl(), args), "mps_arena_create"); } MPS_ARGS_END(args); diff --git a/mps/code/mpmss.c b/mps/code/mpmss.c index a069c2f8a48..e3914be9d93 100644 --- a/mps/code/mpmss.c +++ b/mps/code/mpmss.c @@ -219,13 +219,13 @@ int main(int argc, char *argv[]) MPS_ARGS_BEGIN(args) { MPS_ARGS_ADD(args, MPS_KEY_ARENA_SIZE, testArenaSIZE); - MPS_ARGS_ADD(args, MPS_KEY_ARENA_GRAIN_SIZE, (size_t)1 << (rnd() % 20)); + MPS_ARGS_ADD(args, MPS_KEY_ARENA_GRAIN_SIZE, rnd_grain(testArenaSIZE)); testInArena(mps_arena_class_vm(), args, &bothOptions); } MPS_ARGS_END(args); MPS_ARGS_BEGIN(args) { MPS_ARGS_ADD(args, MPS_KEY_ARENA_SIZE, smallArenaSIZE); - MPS_ARGS_ADD(args, MPS_KEY_ARENA_GRAIN_SIZE, (size_t)1 << (rnd() % 15)); + MPS_ARGS_ADD(args, MPS_KEY_ARENA_GRAIN_SIZE, rnd_grain(smallArenaSIZE)); testInArena(mps_arena_class_vm(), args, &fenceOptions); } MPS_ARGS_END(args); diff --git a/mps/code/testlib.c b/mps/code/testlib.c index 6ecedad0bd6..5aa4a2f4e4e 100644 --- a/mps/code/testlib.c +++ b/mps/code/testlib.c @@ -12,7 +12,7 @@ #include "mps.h" #include "misc.h" /* for NOOP */ -#include /* fmod */ +#include /* fmod, log2 */ #include /* fflush, printf, stderr, sscanf, vfprintf */ #include /* abort, exit, getenv */ #include /* time */ @@ -220,6 +220,14 @@ double rnd_double(void) return rnd() / R_m_float; } +size_t rnd_grain(size_t arena_size) +{ + /* The grain size must be small enough to allow for a complete set + * of zones in the initial chunk. */ + size_t s = (size_t)log2((double)arena_size); + Insist(s > MPS_WORD_SHIFT); + return (size_t)1 << (rnd() % (s - MPS_WORD_SHIFT)); +} rnd_state_t rnd_seed(void) { diff --git a/mps/code/testlib.h b/mps/code/testlib.h index 38a4c94bdab..edeaf5eb50b 100644 --- a/mps/code/testlib.h +++ b/mps/code/testlib.h @@ -248,6 +248,12 @@ extern mps_addr_t rnd_addr(void); extern double rnd_double(void); +/* rnd_grain -- return a random grain size that's not too big for the + * given arena size */ + +extern size_t rnd_grain(size_t arena_size); + + /* randomize -- randomize the generator, or initialize to replay * * randomize(argc, argv) randomizes the rnd generator (using time(3)) diff --git a/mps/manual/source/mmref-index.rst b/mps/manual/source/mmref-index.rst index c645899bb49..a91b7b702c4 100644 --- a/mps/manual/source/mmref-index.rst +++ b/mps/manual/source/mmref-index.rst @@ -6,7 +6,7 @@ Welcome to the **Memory Management Reference**! This is a resource for programm .. admonition:: :ref:`glossary` - A glossary of more than 500 memory management terms, from + A glossary of more than 500 :term:`memory management` terms, from :term:`absolute address` to :term:`zero count table`. .. image:: diagrams/treadmill.svg @@ -17,7 +17,8 @@ Welcome to the **Memory Management Reference**! This is a resource for programm .. admonition:: :ref:`mmref-intro` - Articles giving a beginner's overview of memory management. + Articles giving a beginner's overview of :term:`memory + management`. .. image:: diagrams/address.svg :target: intro_ @@ -27,7 +28,7 @@ Welcome to the **Memory Management Reference**! This is a resource for programm .. admonition:: :ref:`bibliography` - Books and research papers related to memory management. + Books and research papers related to :term:`memory management`. .. image:: diagrams/copying.svg :target: bib_ @@ -37,7 +38,7 @@ Welcome to the **Memory Management Reference**! This is a resource for programm .. admonition:: :ref:`mmref-faq` - Frequently asked questions about memory management. + Frequently asked questions about :term:`memory management`. .. image:: diagrams/snap-out.svg :target: faq_ @@ -46,9 +47,9 @@ Welcome to the **Memory Management Reference**! This is a resource for programm The Memory Management Reference is maintained by `Ravenbrook Limited`_. We also maintain the `Memory Pool System`_ (an open-source, -thread-safe, :term:`incremental ` -garbage collector), and we are happy to provide advanced memory -management solutions to language and application developers through +thread-safe, :term:`incremental garbage collector `), and we are happy to provide advanced :term:`memory +management` solutions to language and application developers through our `consulting service`_. .. _Ravenbrook Limited: http://www.ravenbrook.com/ diff --git a/mps/manual/source/release.rst b/mps/manual/source/release.rst index c739f46ad9c..c025ad75a40 100644 --- a/mps/manual/source/release.rst +++ b/mps/manual/source/release.rst @@ -47,9 +47,9 @@ Interface changes ................. #. The granularity with which the arena manages memory can now be - specified using the :c:macro:`MPS_KEY_ARENA_SIZE` keyword argument - to :c:func:`mps_arena_create_k`. See :c:func:`mps_arena_class_cl` - and :c:func:`mps_arena_class_vm`. + specified using the :c:macro:`MPS_KEY_ARENA_GRAIN_SIZE` keyword + argument to :c:func:`mps_arena_create_k`. See + :c:func:`mps_arena_class_cl` and :c:func:`mps_arena_class_vm`. #. There is now a default value (currently 256 \ :term:`megabytes`) for the :c:macro:`MPS_KEY_ARENA_SIZE` keyword argument to