From ead194349a228a993807bd40c7f1dc0cf3ae7ba7 Mon Sep 17 00:00:00 2001 From: Richard Brooksby Date: Mon, 3 Jun 2013 12:57:55 +0100 Subject: [PATCH 01/14] Miscellaneous design document improvements. Documenting why WriteF on points comes out with the wrong endianness on Intel platforms. Copied from Perforce Change: 182421 ServerID: perforce.ravenbrook.com --- mps/code/mpm.c | 4 +++- mps/design/config.txt | 1 + mps/design/shield.txt | 20 ++++++++++---------- mps/design/sig.txt | 17 +++++++++++------ mps/design/writef.txt | 10 +++++----- 5 files changed, 30 insertions(+), 22 deletions(-) diff --git a/mps/code/mpm.c b/mps/code/mpm.c index 4623ca7fad6..04195a859dd 100644 --- a/mps/code/mpm.c +++ b/mps/code/mpm.c @@ -493,7 +493,9 @@ Res WriteF_firstformat_v(mps_lib_FILE *stream, case 'F': { /* function */ WriteFF f = va_arg(args, WriteFF); Byte *b = (Byte *)&f; - /* TODO: Why do we always write these little-endian? */ + /* ISO C forbits casting function pointers to integer, so + decode bytes (see design.writef.f). + TODO: Be smarter about endianness. */ for(i=0; i < sizeof(WriteFF); i++) { res = WriteULongest(stream, (ULongest)(b[i]), 16, (CHAR_BIT + 3) / 4); diff --git a/mps/design/config.txt b/mps/design/config.txt index 693ffa93249..20cdf072941 100644 --- a/mps/design/config.txt +++ b/mps/design/config.txt @@ -57,6 +57,7 @@ variety-reform_ branch. Client-specific customisation of the MPS will be handled in source control, while the MPS source remains generic, to reduce costs and increase reliability. See [RB_2012-09-13]_. +.. _variety-reform: /project/mps/branch/2012-08-15/variety-reform Definitions diff --git a/mps/design/shield.txt b/mps/design/shield.txt index 6ac60ecfa58..b0cd71d25c8 100644 --- a/mps/design/shield.txt +++ b/mps/design/shield.txt @@ -46,13 +46,13 @@ by MPS). ``void ShieldRaise(Arena arena, Seg seg, AccessSet mode)`` -Prevent the mutator accessing the memory in the specified mode -(``AccessREAD``, ``AccessWRITE``, or both). + Prevent the mutator accessing the memory in the specified mode + (``AccessREAD``, ``AccessWRITE``, or both). ``void ShieldLower(Arena arena, Seg seg, AccessSet mode)`` -Allow the mutator to access the memory in the specified mode -(``AccessREAD``, ``AccessWRITE``, or both). + Allow the mutator to access the memory in the specified mode + (``AccessREAD``, ``AccessWRITE``, or both). If the mutator attempts an access that hits a shield, the MPS gets a barrier hit (in the form of a fault, interrupt, exception), quickly @@ -65,11 +65,11 @@ this. ``void ShieldSuspend(Arena arena)`` -Stop all registered mutator threads. + Stop all registered mutator threads. ``void ShieldResume(Arena arena)`` -Resume all registered mutator threads. + Resume all registered mutator threads. Control of collector access @@ -108,7 +108,7 @@ calls to ``ShieldExpose()`` on the same segment, as long as each is balanced by a corresponding ``ShieldCover()`` before ``ShieldLeave()`` is called). A usage count is maintained on each segment in ``seg->depth``: a positive "depth" means a positive number of -outstanding reasons why the segment must be exposed to the collector. +outstanding *reasons* why the segment must be exposed to the collector. When the usage count reaches zero, there is no longer any reason the segment should be unprotected, and the Shield could re-instate hardware protection. @@ -116,14 +116,14 @@ hardware protection. However, as a performance-improving hysteresis, the Shield defers re-protection, maintaining a cache of the last ``ShieldCacheSIZE`` times a segment no longer had a reason to be collector-accessible. -Presence in the cache counts as a 'reason': segments in the cache have +Presence in the cache counts as a reason: segments in the cache have ``seg->depth`` increased by one. As segments get pushed out of the -cache, or at ``ShieldLeave()``, this artificial 'reason' is +cache, or at ``ShieldLeave()``, this artificial reason is decremented from ``seg->depth``, and (if ``seg->depth`` is now zero) the deferred reinstatement of hardware protection happens. So whenever hardware protection is temporarily removed to allow -collector access, there is a 'nurse' that will ensure this protection +collector access, there is a *nurse* that will ensure this protection is re-established: the nurse is either the balancing ``ShieldCover()`` call in collector code, or an entry in the shield cache. diff --git a/mps/design/sig.txt b/mps/design/sig.txt index 4013c1bd44c..a33f8893f7f 100644 --- a/mps/design/sig.txt +++ b/mps/design/sig.txt @@ -24,13 +24,15 @@ defects early. Overview -------- -Signatures are magic numbers which are written into structures when +Signatures are `magic numbers`_ which are written into structures when they are created and invalidated (by overwriting with ``SigInvalid``) when they are destroyed. They provide a limited form of run-time type checking and dynamic scope checking. They are a simplified form of "Structure Marking", a technique used in the Multics filesystem [THVV_1995]_. +.. _`magic numbers`: http://en.wikipedia.org/wiki/Magic_number_(programming) + Definitions ----------- @@ -54,7 +56,7 @@ This is a 32-bit hex constant, spelled according to guide.hex.trans_:: ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEF9811C7340BC6520F3812 -.. _guide.hex.trans: ./guide.hex.trans.txt +.. _guide.hex.trans: guide.hex.trans This allows the structure to be recognised when looking at memory in a hex dump or memory window, or found using memory searches. @@ -97,10 +99,13 @@ Do not do anything else with signatures. See `.rule.purpose`_. Checking -------- The signature is checked in various ways. Every function that takes a -(pointer to) a signed structure should check its argument using the ``AVERT`` -macro. This macro has different definitions depending on how the MPS is -compiled. It may simply check the signature directly, or call the full -checking function for the structure. +(pointer to) a signed structure should check its argument using the +``AVERT`` macro. This macro has different definitions depending on how +the MPS is compiled (see design.mps.config.def.var_). It may simply check +the signature directly, or call the full checking function for the +structure. + +.. _design.mps.config.def.var: config#def-var The checking function for the structure should also validate the signature as its first step using the ``CHECKS()`` macro (see diff --git a/mps/design/writef.txt b/mps/design/writef.txt index 9a346b01e3f..7d7f268b358 100644 --- a/mps/design/writef.txt +++ b/mps/design/writef.txt @@ -82,7 +82,7 @@ Code Bame Type Example rendering ======= =========== ================== ====================================== ``$A`` address ``Addr`` ``000000019EF60010`` ``$P`` pointer ``void *`` ``000000019EF60100`` -``$F`` function ``void *(*)()`` ``000000019EF60100`` +``$F`` function ``void *(*)()`` ``0001D69E01000000`` (see `.f`_) ``$S`` string ``char *`` ``hello`` ``$C`` character ``char`` ``x`` ``$W`` word ``ULongest`` ``0000000000109AE0`` @@ -99,10 +99,10 @@ incredible snazzy output engine. We only need it for ``Describe()`` methods and assertion messages. At the moment it's a very simple bit of code -- let's keep it that way. -_`.f`: The ``F`` code is used for function pointers. They are -currently printed as a hexadecimal string of the appropriate length -for the platform, and may one day be extended to include function name -lookup. +_`.f`: The ``F`` code is used for function pointers. ISO C forbids casting +function pointers to other types, so the bytes of their representation are +written sequentially, and may have a different endianness to other pointers. +Could be smarter, or even look up function names, but see `.snazzy`_. Document History From c80a235081f27f57b80b671c0e0f7602775a8535 Mon Sep 17 00:00:00 2001 From: Richard Brooksby Date: Mon, 3 Jun 2013 17:21:20 +0100 Subject: [PATCH 02/14] Fixing duplicate reference error. Copied from Perforce Change: 182436 ServerID: perforce.ravenbrook.com --- mps/readme.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mps/readme.txt b/mps/readme.txt index 78eefa68b31..223862cc346 100644 --- a/mps/readme.txt +++ b/mps/readme.txt @@ -52,7 +52,7 @@ using it. The basic case is straightforward on supported platforms This will produce an object file you can link with your project. For details of how to configure the MPS, build libraries and tests, use -IDEs, autoconf, etc. see `Building the MPS `_. +IDEs, autoconf, etc. see `Building the MPS `__. For an example of using the MPS, see the `Scheme interpreter example `_. @@ -81,7 +81,7 @@ that we are powerless to correct. It is due to be fixed in Windows 8. The MPS is highly portable and has run on many other processors and operating systems in the past (see `Building the MPS -`_). Most of the MPS is written in very pure +`__). Most of the MPS is written in very pure ANSI C and compiles without warnings on anything. From 9f11889074f8a99dd7786a5af92905f127c31f0a Mon Sep 17 00:00:00 2001 From: Richard Brooksby Date: Tue, 4 Jun 2013 01:11:00 +0100 Subject: [PATCH 03/14] Updating logo in the mps manual to the new escheresque logo, using the clair de lune palette. Copied from Perforce Change: 182460 ServerID: perforce.ravenbrook.com --- mps/manual/source/diagrams/logo.png | Bin 10385 -> 42298 bytes mps/manual/source/diagrams/logo.svg | 104 ---------------------------- 2 files changed, 104 deletions(-) delete mode 100644 mps/manual/source/diagrams/logo.svg diff --git a/mps/manual/source/diagrams/logo.png b/mps/manual/source/diagrams/logo.png index 42756c08d7afbee9adeeaed46729006461d78e21..f60476aa6ca5146bbdc22bb579bdf7d101c26066 100644 GIT binary patch literal 42298 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 _4P0^$`M0D|G>0T?fhJ;5Xj&bNs(>X?a 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 Bvhn}` literal 10385 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 ID$v;f0nw@T8~^|S diff --git a/mps/manual/source/diagrams/logo.svg b/mps/manual/source/diagrams/logo.svg deleted file mode 100644 index 46b2ba9de02..00000000000 --- a/mps/manual/source/diagrams/logo.svg +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - - MEMORY - POOL - SYSTEM - - From fa0fd4df750f85dc506607c9b5052d9291c6b459 Mon Sep 17 00:00:00 2001 From: Richard Brooksby Date: Tue, 4 Jun 2013 01:12:09 +0100 Subject: [PATCH 04/14] Updated manual html Copied from Perforce Change: 182461 ServerID: perforce.ravenbrook.com --- .../html/_sources/design/alloc-frame.txt | 6 + mps/manual/html/_sources/design/arenavm.txt | 7 + mps/manual/html/_sources/design/buffer.txt | 6 + mps/manual/html/_sources/design/diag.txt | 6 + .../_sources/design/guide.impl.c.format.txt | 7 + mps/manual/html/_sources/design/index.txt | 1 + .../html/_sources/design/interface-c.txt | 6 + mps/manual/html/_sources/design/io.txt | 6 + mps/manual/html/_sources/design/lib.txt | 6 + mps/manual/html/_sources/design/locus.txt | 6 + .../html/_sources/design/message-gc.txt | 6 + mps/manual/html/_sources/design/old.txt | 24 + mps/manual/html/_sources/design/poolamc.txt | 4 +- mps/manual/html/_sources/design/poolams.txt | 7 + mps/manual/html/_sources/design/poolawl.txt | 7 + mps/manual/html/_sources/design/poollo.txt | 7 + mps/manual/html/_sources/design/poolmfs.txt | 7 + mps/manual/html/_sources/design/poolmrg.txt | 7 + mps/manual/html/_sources/design/poolmvff.txt | 4 +- mps/manual/html/_sources/design/protan.txt | 7 + mps/manual/html/_sources/design/protli.txt | 7 + mps/manual/html/_sources/design/protsu.txt | 7 + .../html/_sources/design/pthreadext.txt | 6 + mps/manual/html/_sources/design/shield.txt | 6 + mps/manual/html/_sources/design/sso1al.txt | 7 + .../html/_sources/design/thread-manager.txt | 6 + mps/manual/html/_sources/design/vman.txt | 6 + mps/manual/html/_sources/design/vmo1.txt | 6 + mps/manual/html/_sources/design/vmso.txt | 6 + .../html/_sources/glossary/_Sidebar.txt | 2 + mps/manual/html/_sources/glossary/home.txt | 33 + mps/manual/html/_sources/guide/advanced.txt | 6 +- mps/manual/html/_sources/guide/debug.txt | 6 +- mps/manual/html/_sources/guide/overview.txt | 23 +- mps/manual/html/_sources/pool/intro.txt | 2 +- mps/manual/html/_sources/pool/mfs.txt | 15 +- mps/manual/html/_sources/pool/mvff.txt | 2 +- mps/manual/html/_sources/topic/collection.txt | 7 + mps/manual/html/_sources/topic/error.txt | 56 +- mps/manual/html/_sources/topic/plinth.txt | 49 +- mps/manual/html/_sources/topic/root.txt | 12 +- mps/manual/html/_static/logo.png | Bin 10385 -> 42298 bytes mps/manual/html/_static/pygments.css | 4 +- mps/manual/html/design/alloc-frame.html | 613 ++++++++++ mps/manual/html/design/arena.html | 178 +-- mps/manual/html/design/arenavm.html | 282 +++++ mps/manual/html/design/bt.html | 76 +- mps/manual/html/design/buffer.html | 795 +++++++++++++ mps/manual/html/design/cbs.html | 94 +- mps/manual/html/design/check.html | 30 +- mps/manual/html/design/class-interface.html | 195 ++-- mps/manual/html/design/collection.html | 240 ++-- mps/manual/html/design/config.html | 154 +-- mps/manual/html/design/critical-path.html | 52 +- mps/manual/html/design/diag.html | 378 ++++++ mps/manual/html/design/finalize.html | 62 +- mps/manual/html/design/fix.html | 36 +- mps/manual/html/design/guide.hex.trans.html | 16 +- .../html/design/guide.impl.c.format.html | 505 ++++++++ mps/manual/html/design/index.html | 84 +- mps/manual/html/design/interface-c.html | 406 +++++++ mps/manual/html/design/io.html | 494 ++++++++ mps/manual/html/design/keyword-arguments.html | 61 +- mps/manual/html/design/lib.html | 197 ++++ mps/manual/html/design/lock.html | 42 +- mps/manual/html/design/locus.html | 716 ++++++++++++ mps/manual/html/design/message-gc.html | 387 +++++++ mps/manual/html/design/message.html | 89 +- mps/manual/html/design/object-debug.html | 148 ++- mps/manual/html/design/old.html | 970 +++++++++++----- mps/manual/html/design/pool.html | 43 +- mps/manual/html/design/poolamc.html | 179 +-- mps/manual/html/design/poolams.html | 509 ++++++++ mps/manual/html/design/poolawl.html | 608 ++++++++++ mps/manual/html/design/poollo.html | 328 ++++++ mps/manual/html/design/poolmfs.html | 134 +++ mps/manual/html/design/poolmrg.html | 672 +++++++++++ mps/manual/html/design/poolmvff.html | 169 ++- mps/manual/html/design/prot.html | 32 +- mps/manual/html/design/protan.html | 177 +++ mps/manual/html/design/protli.html | 280 +++++ mps/manual/html/design/protocol.html | 82 +- mps/manual/html/design/protsu.html | 208 ++++ mps/manual/html/design/pthreadext.html | 429 +++++++ mps/manual/html/design/reservoir.html | 36 +- mps/manual/html/design/ring.html | 58 +- mps/manual/html/design/root.html | 66 +- mps/manual/html/design/scan.html | 56 +- mps/manual/html/design/seg.html | 52 +- mps/manual/html/design/shield.html | 275 +++++ mps/manual/html/design/sig.html | 80 +- mps/manual/html/design/splay.html | 82 +- mps/manual/html/design/sso1al.html | 224 ++++ mps/manual/html/design/telemetry.html | 78 +- mps/manual/html/design/thread-manager.html | 318 +++++ mps/manual/html/design/thread-safety.html | 94 +- mps/manual/html/design/trace.html | 95 +- mps/manual/html/design/type.html | 50 +- mps/manual/html/design/version-library.html | 46 +- mps/manual/html/design/version.html | 30 +- mps/manual/html/design/vm.html | 45 +- mps/manual/html/design/vman.html | 125 ++ mps/manual/html/design/vmo1.html | 157 +++ mps/manual/html/design/vmso.html | 229 ++++ mps/manual/html/design/writef.html | 34 +- mps/manual/html/genindex.html | 1023 +++++++++++++++-- mps/manual/html/glossary/_Sidebar.html | 93 ++ mps/manual/html/glossary/home.html | 145 +++ mps/manual/html/guide/advanced.html | 112 +- mps/manual/html/guide/debug.html | 14 +- mps/manual/html/guide/lang.html | 110 +- mps/manual/html/guide/overview.html | 22 +- mps/manual/html/index.html | 89 +- mps/manual/html/mmref/index.html | 8 +- mps/manual/html/objects.inv | Bin 24140 -> 24715 bytes mps/manual/html/pool/amc.html | 8 +- mps/manual/html/pool/amcz.html | 8 +- mps/manual/html/pool/ams.html | 16 +- mps/manual/html/pool/awl.html | 38 +- mps/manual/html/pool/intro.html | 2 +- mps/manual/html/pool/lo.html | 6 +- mps/manual/html/pool/mfs.html | 25 +- mps/manual/html/pool/mv.html | 26 +- mps/manual/html/pool/mvff.html | 64 +- mps/manual/html/pool/mvt.html | 10 +- mps/manual/html/pool/snc.html | 10 +- mps/manual/html/searchindex.js | 2 +- mps/manual/html/topic/allocation.html | 46 +- mps/manual/html/topic/arena.html | 10 +- mps/manual/html/topic/cache.html | 6 +- mps/manual/html/topic/collection.html | 10 +- mps/manual/html/topic/debugging.html | 4 +- mps/manual/html/topic/error.html | 56 +- mps/manual/html/topic/finalization.html | 2 +- mps/manual/html/topic/format.html | 48 +- mps/manual/html/topic/index.html | 9 +- mps/manual/html/topic/interface.html | 4 +- mps/manual/html/topic/keyword.html | 34 +- mps/manual/html/topic/location.html | 18 +- mps/manual/html/topic/message.html | 6 +- mps/manual/html/topic/plinth.html | 75 +- mps/manual/html/topic/root.html | 19 +- mps/manual/html/topic/scanning.html | 18 +- mps/manual/html/topic/weak.html | 8 +- 144 files changed, 13689 insertions(+), 2306 deletions(-) create mode 100644 mps/manual/html/_sources/design/alloc-frame.txt create mode 100644 mps/manual/html/_sources/design/arenavm.txt create mode 100644 mps/manual/html/_sources/design/buffer.txt create mode 100644 mps/manual/html/_sources/design/diag.txt create mode 100644 mps/manual/html/_sources/design/guide.impl.c.format.txt create mode 100644 mps/manual/html/_sources/design/interface-c.txt create mode 100644 mps/manual/html/_sources/design/io.txt create mode 100644 mps/manual/html/_sources/design/lib.txt create mode 100644 mps/manual/html/_sources/design/locus.txt create mode 100644 mps/manual/html/_sources/design/message-gc.txt create mode 100644 mps/manual/html/_sources/design/poolams.txt create mode 100644 mps/manual/html/_sources/design/poolawl.txt create mode 100644 mps/manual/html/_sources/design/poollo.txt create mode 100644 mps/manual/html/_sources/design/poolmfs.txt create mode 100644 mps/manual/html/_sources/design/poolmrg.txt create mode 100644 mps/manual/html/_sources/design/protan.txt create mode 100644 mps/manual/html/_sources/design/protli.txt create mode 100644 mps/manual/html/_sources/design/protsu.txt create mode 100644 mps/manual/html/_sources/design/pthreadext.txt create mode 100644 mps/manual/html/_sources/design/shield.txt create mode 100644 mps/manual/html/_sources/design/sso1al.txt create mode 100644 mps/manual/html/_sources/design/thread-manager.txt create mode 100644 mps/manual/html/_sources/design/vman.txt create mode 100644 mps/manual/html/_sources/design/vmo1.txt create mode 100644 mps/manual/html/_sources/design/vmso.txt create mode 100644 mps/manual/html/_sources/glossary/_Sidebar.txt create mode 100644 mps/manual/html/_sources/glossary/home.txt create mode 100644 mps/manual/html/design/alloc-frame.html create mode 100644 mps/manual/html/design/arenavm.html create mode 100644 mps/manual/html/design/buffer.html create mode 100644 mps/manual/html/design/diag.html create mode 100644 mps/manual/html/design/guide.impl.c.format.html create mode 100644 mps/manual/html/design/interface-c.html create mode 100644 mps/manual/html/design/io.html create mode 100644 mps/manual/html/design/lib.html create mode 100644 mps/manual/html/design/locus.html create mode 100644 mps/manual/html/design/message-gc.html create mode 100644 mps/manual/html/design/poolams.html create mode 100644 mps/manual/html/design/poolawl.html create mode 100644 mps/manual/html/design/poollo.html create mode 100644 mps/manual/html/design/poolmfs.html create mode 100644 mps/manual/html/design/poolmrg.html create mode 100644 mps/manual/html/design/protan.html create mode 100644 mps/manual/html/design/protli.html create mode 100644 mps/manual/html/design/protsu.html create mode 100644 mps/manual/html/design/pthreadext.html create mode 100644 mps/manual/html/design/shield.html create mode 100644 mps/manual/html/design/sso1al.html create mode 100644 mps/manual/html/design/thread-manager.html create mode 100644 mps/manual/html/design/vman.html create mode 100644 mps/manual/html/design/vmo1.html create mode 100644 mps/manual/html/design/vmso.html create mode 100644 mps/manual/html/glossary/_Sidebar.html create mode 100644 mps/manual/html/glossary/home.html diff --git a/mps/manual/html/_sources/design/alloc-frame.txt b/mps/manual/html/_sources/design/alloc-frame.txt new file mode 100644 index 00000000000..021e0e1f137 --- /dev/null +++ b/mps/manual/html/_sources/design/alloc-frame.txt @@ -0,0 +1,6 @@ +.. index:: + pair: allocation frames; design + +.. _design-alloc-frame: + +.. include:: ../../converted/alloc-frame.rst diff --git a/mps/manual/html/_sources/design/arenavm.txt b/mps/manual/html/_sources/design/arenavm.txt new file mode 100644 index 00000000000..08734427eb9 --- /dev/null +++ b/mps/manual/html/_sources/design/arenavm.txt @@ -0,0 +1,7 @@ +.. index:: + pair: virtual memory arena; design + pair: VM arena; design + +.. _design-arenavm: + +.. include:: ../../converted/arenavm.rst diff --git a/mps/manual/html/_sources/design/buffer.txt b/mps/manual/html/_sources/design/buffer.txt new file mode 100644 index 00000000000..3166612e78f --- /dev/null +++ b/mps/manual/html/_sources/design/buffer.txt @@ -0,0 +1,6 @@ +.. index:: + pair: buffers; design + +.. _design-buffer: + +.. include:: ../../converted/buffer.rst diff --git a/mps/manual/html/_sources/design/diag.txt b/mps/manual/html/_sources/design/diag.txt new file mode 100644 index 00000000000..324c983e480 --- /dev/null +++ b/mps/manual/html/_sources/design/diag.txt @@ -0,0 +1,6 @@ +.. index:: + pair: diagnostic feedback; design + +.. _design-diag: + +.. include:: ../../converted/diag.rst diff --git a/mps/manual/html/_sources/design/guide.impl.c.format.txt b/mps/manual/html/_sources/design/guide.impl.c.format.txt new file mode 100644 index 00000000000..a98deb9d3e7 --- /dev/null +++ b/mps/manual/html/_sources/design/guide.impl.c.format.txt @@ -0,0 +1,7 @@ +.. index:: + pair: C language; formatting guide + pair: C language formatting; guide + +.. _design-guide.impl.c.format: + +.. include:: ../../converted/guide.impl.c.format.rst diff --git a/mps/manual/html/_sources/design/index.txt b/mps/manual/html/_sources/design/index.txt index ce234220b78..a0c98237228 100644 --- a/mps/manual/html/_sources/design/index.txt +++ b/mps/manual/html/_sources/design/index.txt @@ -9,6 +9,7 @@ Design config critical-path guide.hex.trans + guide.impl.c.format keyword-arguments ring sig diff --git a/mps/manual/html/_sources/design/interface-c.txt b/mps/manual/html/_sources/design/interface-c.txt new file mode 100644 index 00000000000..ec60c8dea25 --- /dev/null +++ b/mps/manual/html/_sources/design/interface-c.txt @@ -0,0 +1,6 @@ +.. index:: + pair: C interface; design + +.. _design-interface-c: + +.. include:: ../../converted/interface-c.rst diff --git a/mps/manual/html/_sources/design/io.txt b/mps/manual/html/_sources/design/io.txt new file mode 100644 index 00000000000..8307f55bbad --- /dev/null +++ b/mps/manual/html/_sources/design/io.txt @@ -0,0 +1,6 @@ +.. index:: + pair: I/O subsystem; design + +.. _design-io: + +.. include:: ../../converted/io.rst diff --git a/mps/manual/html/_sources/design/lib.txt b/mps/manual/html/_sources/design/lib.txt new file mode 100644 index 00000000000..3235f61e15c --- /dev/null +++ b/mps/manual/html/_sources/design/lib.txt @@ -0,0 +1,6 @@ +.. index:: + pair: library interface; design + +.. _design-lib: + +.. include:: ../../converted/lib.rst diff --git a/mps/manual/html/_sources/design/locus.txt b/mps/manual/html/_sources/design/locus.txt new file mode 100644 index 00000000000..12cc91255fb --- /dev/null +++ b/mps/manual/html/_sources/design/locus.txt @@ -0,0 +1,6 @@ +.. index:: + pair: locus manager; design + +.. _design-locus: + +.. include:: ../../converted/locus.rst diff --git a/mps/manual/html/_sources/design/message-gc.txt b/mps/manual/html/_sources/design/message-gc.txt new file mode 100644 index 00000000000..881aee07424 --- /dev/null +++ b/mps/manual/html/_sources/design/message-gc.txt @@ -0,0 +1,6 @@ +.. index:: + pair: garbage collection messages; design + +.. _design-message-gc: + +.. include:: ../../converted/message-gc.rst diff --git a/mps/manual/html/_sources/design/old.txt b/mps/manual/html/_sources/design/old.txt index f6999e47531..b576b06f01a 100644 --- a/mps/manual/html/_sources/design/old.txt +++ b/mps/manual/html/_sources/design/old.txt @@ -14,32 +14,56 @@ Old design .. toctree:: :numbered: + alloc-frame arena + arenavm bt + buffer cbs check class-interface collection + diag finalize fix + interface-c + io + lib lock + locus message + message-gc object-debug pool poolamc + poolams + poolawl + poollo + poolmfs + poolmrg poolmvff prot + protan + protli + protsu protocol + pthreadext reservoir root scan seg + shield splay + sso1al telemetry + thread-manager thread-safety trace type version-library version vm + vman + vmo1 + vmso writef diff --git a/mps/manual/html/_sources/design/poolamc.txt b/mps/manual/html/_sources/design/poolamc.txt index 6bd304ff52e..e5ce5abc6fd 100644 --- a/mps/manual/html/_sources/design/poolamc.txt +++ b/mps/manual/html/_sources/design/poolamc.txt @@ -1,6 +1,6 @@ .. index:: - pair: AMC pool; design - single: pool; AMC design + pair: AMC pool class; design + single: pool class; AMC design .. _design-poolamc: diff --git a/mps/manual/html/_sources/design/poolams.txt b/mps/manual/html/_sources/design/poolams.txt new file mode 100644 index 00000000000..2b092b2f709 --- /dev/null +++ b/mps/manual/html/_sources/design/poolams.txt @@ -0,0 +1,7 @@ +.. index:: + pair: AMS pool class; design + single: pool class; AMS design + +.. _design-poolams: + +.. include:: ../../converted/poolams.rst diff --git a/mps/manual/html/_sources/design/poolawl.txt b/mps/manual/html/_sources/design/poolawl.txt new file mode 100644 index 00000000000..afd53b5b7db --- /dev/null +++ b/mps/manual/html/_sources/design/poolawl.txt @@ -0,0 +1,7 @@ +.. index:: + pair: AWL pool class; design + single: pool class; AWL design + +.. _design-poolawl: + +.. include:: ../../converted/poolawl.rst diff --git a/mps/manual/html/_sources/design/poollo.txt b/mps/manual/html/_sources/design/poollo.txt new file mode 100644 index 00000000000..eb26ff1d60a --- /dev/null +++ b/mps/manual/html/_sources/design/poollo.txt @@ -0,0 +1,7 @@ +.. index:: + pair: LO pool class; design + single: pool class; LO design + +.. _design-poollo: + +.. include:: ../../converted/poollo.rst diff --git a/mps/manual/html/_sources/design/poolmfs.txt b/mps/manual/html/_sources/design/poolmfs.txt new file mode 100644 index 00000000000..e8e23c4d6be --- /dev/null +++ b/mps/manual/html/_sources/design/poolmfs.txt @@ -0,0 +1,7 @@ +.. index:: + pair: MFS pool class; design + single: pool class; MFS design + +.. _design-poolmfs: + +.. include:: ../../converted/poolmfs.rst diff --git a/mps/manual/html/_sources/design/poolmrg.txt b/mps/manual/html/_sources/design/poolmrg.txt new file mode 100644 index 00000000000..3afcf8f48e1 --- /dev/null +++ b/mps/manual/html/_sources/design/poolmrg.txt @@ -0,0 +1,7 @@ +.. index:: + pair: MRG pool class; design + single: pool class; MRG design + +.. _design-poolmrg: + +.. include:: ../../converted/poolmrg.rst diff --git a/mps/manual/html/_sources/design/poolmvff.txt b/mps/manual/html/_sources/design/poolmvff.txt index 7c7e50fe354..b247a72c17e 100644 --- a/mps/manual/html/_sources/design/poolmvff.txt +++ b/mps/manual/html/_sources/design/poolmvff.txt @@ -1,6 +1,6 @@ .. index:: - pair: MVFF; design - single: pool; MVFF design + pair: MVFF pool class; design + single: pool class; MVFF design .. _design-poolmvff: diff --git a/mps/manual/html/_sources/design/protan.txt b/mps/manual/html/_sources/design/protan.txt new file mode 100644 index 00000000000..7463e528871 --- /dev/null +++ b/mps/manual/html/_sources/design/protan.txt @@ -0,0 +1,7 @@ +.. index:: + pair: ANSI; protection interface design + pair: ANSI protection interface; design + +.. _design-protan: + +.. include:: ../../converted/protan.rst diff --git a/mps/manual/html/_sources/design/protli.txt b/mps/manual/html/_sources/design/protli.txt new file mode 100644 index 00000000000..7088c71988c --- /dev/null +++ b/mps/manual/html/_sources/design/protli.txt @@ -0,0 +1,7 @@ +.. index:: + pair: Linux; protection interface design + pair: Linux protection interface; design + +.. _design-protli: + +.. include:: ../../converted/protli.rst diff --git a/mps/manual/html/_sources/design/protsu.txt b/mps/manual/html/_sources/design/protsu.txt new file mode 100644 index 00000000000..150f715cce3 --- /dev/null +++ b/mps/manual/html/_sources/design/protsu.txt @@ -0,0 +1,7 @@ +.. index:: + pair: SunOS 4; protection interface design + pair: SunOS 4 protection interface; design + +.. _design-protsu: + +.. include:: ../../converted/protsu.rst diff --git a/mps/manual/html/_sources/design/pthreadext.txt b/mps/manual/html/_sources/design/pthreadext.txt new file mode 100644 index 00000000000..78f20721ec8 --- /dev/null +++ b/mps/manual/html/_sources/design/pthreadext.txt @@ -0,0 +1,6 @@ +.. index:: + pair: POSIX thread extensions; design + +.. _design-pthreadext: + +.. include:: ../../converted/pthreadext.rst diff --git a/mps/manual/html/_sources/design/shield.txt b/mps/manual/html/_sources/design/shield.txt new file mode 100644 index 00000000000..c5f85fdcdff --- /dev/null +++ b/mps/manual/html/_sources/design/shield.txt @@ -0,0 +1,6 @@ +.. index:: + pair: shield; design + +.. _design-shield: + +.. include:: ../../converted/shield.rst diff --git a/mps/manual/html/_sources/design/sso1al.txt b/mps/manual/html/_sources/design/sso1al.txt new file mode 100644 index 00000000000..a95baff3217 --- /dev/null +++ b/mps/manual/html/_sources/design/sso1al.txt @@ -0,0 +1,7 @@ +.. index:: + pair: Digital Unix on Alpha stack scanner; design + pair: Digital Unix on Alpha; stack scanner design + +.. _design-sso1al: + +.. include:: ../../converted/sso1al.rst diff --git a/mps/manual/html/_sources/design/thread-manager.txt b/mps/manual/html/_sources/design/thread-manager.txt new file mode 100644 index 00000000000..8719f6f3272 --- /dev/null +++ b/mps/manual/html/_sources/design/thread-manager.txt @@ -0,0 +1,6 @@ +.. index:: + pair: thread manager; design + +.. _design-thread-manager: + +.. include:: ../../../design/thread-manager.txt diff --git a/mps/manual/html/_sources/design/vman.txt b/mps/manual/html/_sources/design/vman.txt new file mode 100644 index 00000000000..215ef64a71e --- /dev/null +++ b/mps/manual/html/_sources/design/vman.txt @@ -0,0 +1,6 @@ +.. index:: + pair: ANSI fake VM; design + +.. _design-vman: + +.. include:: ../../converted/vman.rst diff --git a/mps/manual/html/_sources/design/vmo1.txt b/mps/manual/html/_sources/design/vmo1.txt new file mode 100644 index 00000000000..c43336d1b39 --- /dev/null +++ b/mps/manual/html/_sources/design/vmo1.txt @@ -0,0 +1,6 @@ +.. index:: + pair: VM for Digital Unix; design + +.. _design-vmo1: + +.. include:: ../../converted/vmo1.rst diff --git a/mps/manual/html/_sources/design/vmso.txt b/mps/manual/html/_sources/design/vmso.txt new file mode 100644 index 00000000000..127df7df9d1 --- /dev/null +++ b/mps/manual/html/_sources/design/vmso.txt @@ -0,0 +1,6 @@ +.. index:: + pair: VM for Solaris; design + +.. _design-vmso: + +.. include:: ../../converted/vmso.rst diff --git a/mps/manual/html/_sources/glossary/_Sidebar.txt b/mps/manual/html/_sources/glossary/_Sidebar.txt new file mode 100644 index 00000000000..e0e50826e07 --- /dev/null +++ b/mps/manual/html/_sources/glossary/_Sidebar.txt @@ -0,0 +1,2 @@ +* `Ravenbrook `_ +* `Google `_ diff --git a/mps/manual/html/_sources/glossary/home.txt b/mps/manual/html/_sources/glossary/home.txt new file mode 100644 index 00000000000..bb55975bf97 --- /dev/null +++ b/mps/manual/html/_sources/glossary/home.txt @@ -0,0 +1,33 @@ +.. _glossary: + +Memory Management Glossary +************************** + +.. include:: alphabet.txt + +.. toctree:: + :maxdepth: 1 + + a + b + c + d + e + f + g + h + i + k + l + m + n + o + p + q + r + s + t + u + v + w + z diff --git a/mps/manual/html/_sources/guide/advanced.txt b/mps/manual/html/_sources/guide/advanced.txt index a6604daf573..6835359e717 100644 --- a/mps/manual/html/_sources/guide/advanced.txt +++ b/mps/manual/html/_sources/guide/advanced.txt @@ -876,7 +876,11 @@ Segregation of objects When objects of different types have different properties (different sizes, lifetimes, references, layouts) it makes sense to segregate -them into pools of appropriate classes. +them into pools of appropriate classes. The garbage collector in the +MPS is designed to work efficiently with many pools: it traces +references between objects in different pools, and it coordinates the +scanning of the :term:`registers` and :term:`control stacks` (see +:ref:`topic-root-thread`). For example, the toy Scheme interpreter has a mixture of object types, some of which contain references to other objects (for example, pairs) diff --git a/mps/manual/html/_sources/guide/debug.txt b/mps/manual/html/_sources/guide/debug.txt index c38e09dbbec..e9fc93f951e 100644 --- a/mps/manual/html/_sources/guide/debug.txt +++ b/mps/manual/html/_sources/guide/debug.txt @@ -87,11 +87,11 @@ General debugging advice set dont-handle-bad-access 1 handle SIGBUS pass nostop noprint - If you are using GDB on Linux, run this command:: + If you are using GDB on Linux or FreeBSD, run this command:: - handle SIGXFSZ pass nostop noprint + handle SIGSEGV pass nostop noprint - (On either operating system, you can add these commands to your + (On these operating systems, you can add these commands to your ``.gdbinit`` if you always want them to be run.) diff --git a/mps/manual/html/_sources/guide/overview.txt b/mps/manual/html/_sources/guide/overview.txt index 322d9ea6258..02925361069 100644 --- a/mps/manual/html/_sources/guide/overview.txt +++ b/mps/manual/html/_sources/guide/overview.txt @@ -111,21 +111,24 @@ for example by calling :c:func:`mps_free`) and others are **scan** for :term:`references` to allocated blocks. See :ref:`topic-scanning`. -The arena needs you to tell it how to find your **roots**: references to -allocated blocks that are stored in static data, in memory not managed -by the MPS, or on your program's :term:`registers` or +The arena needs you to tell it how to find your **roots**: references +to allocated blocks that are stored in static data, in memory not +managed by the MPS, in your program's :term:`registers`, or on its :term:`control stack`. See :ref:`topic-root`. The MPS is designed to work with multi-threaded programs. Functions in -the C interface are thread safe, except in a few documented -cases. See :ref:`topic-thread`. The :term:`allocation point -protocol` provides fast lock-free allocation on multiple threads -simultaneously. See :ref:`topic-allocation`. +the C interface are thread safe, except in a few documented cases. See +:ref:`topic-thread`. The :term:`allocation point protocol` provides +fast lock-free allocation on multiple threads simultaneously. See +:ref:`topic-allocation`. The garbage collector is :term:`incremental `: it proceeds in small steps interleaved with the execution -of your program, so there are no long waits. See -:ref:`topic-collection`. +collection>`: it proceeds in small steps interleaved with the +execution of your program, so there are no long waits. The garbage +collector is designed to work efficiently with multiple pools, and +in cases where there are many references between objects in different +pools. See :ref:`topic-collection`. + What next? diff --git a/mps/manual/html/_sources/pool/intro.txt b/mps/manual/html/_sources/pool/intro.txt index 2346e1637bd..ca7d1265edc 100644 --- a/mps/manual/html/_sources/pool/intro.txt +++ b/mps/manual/html/_sources/pool/intro.txt @@ -92,7 +92,7 @@ Property AMC AMCZ AMS AWL LO ============================================= ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== Supports :c:func:`mps_alloc`? no no no no no yes yes yes no no Supports :c:func:`mps_free`? no no no no no yes yes yes yes no -Supports allocation points? yes yes yes yes yes no no yes yes yes +Supports allocation points? yes yes yes yes yes no yes yes yes yes Supports allocation frames? yes yes yes yes yes no no yes yes yes Supports segregated allocation caches? no no no no no yes yes yes no no Timing of collections? [2]_ auto auto auto auto auto --- --- --- --- --- diff --git a/mps/manual/html/_sources/pool/mfs.txt b/mps/manual/html/_sources/pool/mfs.txt index b13870006df..66071937bcf 100644 --- a/mps/manual/html/_sources/pool/mfs.txt +++ b/mps/manual/html/_sources/pool/mfs.txt @@ -11,13 +11,16 @@ MFS (Manual Fixed Small) :term:`pool class` for small objects of fixed size. Unlike other manual pool classes, it is not subject to :term:`internal -fragmentation`. +fragmentation`: if the population remains bounded, the memory usage +remains bounded too. On the other hand, unlike :ref:`pool-mvt` and +:ref:`pool-mvff` it does not return unused memory to the arena for +reuse by other pools. -The implementation is very simple: unlike other :term:`pool classes` -which store their control structures separately from the allocated -blocks, MFS maintains a stack of free blocks using a pointer in the -free block. :c:func:`mps_alloc` pops this stack and :c:func:`mps_free` -pushes it. +The implementation is very simple: unlike most other :term:`pool +classes` which store their control structures separately from the +allocated blocks, MFS maintains a stack of free blocks using a pointer +in the free block. :c:func:`mps_alloc` pops this stack and +:c:func:`mps_free` pushes it. .. index:: diff --git a/mps/manual/html/_sources/pool/mvff.txt b/mps/manual/html/_sources/pool/mvff.txt index 2fc57c59c66..c7f358abcdb 100644 --- a/mps/manual/html/_sources/pool/mvff.txt +++ b/mps/manual/html/_sources/pool/mvff.txt @@ -202,7 +202,7 @@ MVFF interface :c:macro:`MPS_KEY_MVFF_SLOT_HIGH`, and :c:macro:`MPS_KEY_MVFF_FIRST_FIT` are as described above, and :c:macro:`MPS_KEY_POOL_DEBUG_OPTIONS` specifies the debugging - :c:options. See :c:type:`mps_debug_option_s`. + options. See :c:type:`mps_debug_option_s`. .. deprecated:: starting with version 1.112. diff --git a/mps/manual/html/_sources/topic/collection.txt b/mps/manual/html/_sources/topic/collection.txt index bad646ea8e5..af1c18dfce9 100644 --- a/mps/manual/html/_sources/topic/collection.txt +++ b/mps/manual/html/_sources/topic/collection.txt @@ -13,6 +13,13 @@ Garbage collection ================== +The :term:`arena` contains a :term:`garbage collector` that +coordinates the collection of garbage in all of its +:term:`automatically managed ` +:term:`pools`. The collector efficiently traces references between +:term:`roots` and pools, and between objects in different pools. It is +capable of collecting many automatically managed pools simultaneously. + .. index:: single: chain; generation diff --git a/mps/manual/html/_sources/topic/error.txt b/mps/manual/html/_sources/topic/error.txt index 805f50af3bf..abf1a1c2600 100644 --- a/mps/manual/html/_sources/topic/error.txt +++ b/mps/manual/html/_sources/topic/error.txt @@ -188,13 +188,43 @@ than the client program, but it is not unknown, so if you have made every effort to track down the cause (see :ref:`guide-debug`) without luck, :ref:`get in touch `. + +.. index:: + single: assertion + single: error handling; assertion; assertion handling + +.. _topic-error-assertion-handling: + +Assertion handling +.................. + +When the MPS detects an assertion failure, it calls the :term:`plinth` +function :c:func:`mps_lib_assert_fail`. Unless you have replaced the plinth, this behaves as follows: + +- In the :term:`cool` :term:`variety`, print the assertion message to + standard error and terminate the program by calling :c:func:`abort`. + +- In the :term:`hot` and :term:`rash` varieties, print the assertion + message to standard error and do *not* terminate the program. + +You can change this behaviour by providing your own plinth, or using +:c:func:`mps_lib_assert_fail_install`. + +In many applications, users don't want their program terminated when +the MPS detects an error, no matter how severe. A lot of MPS +assertions indicate that the program is going to crash very soon, but +there still may be a chance for a user to get some useful results or +save their work. This is why the default assertion handler only +terminates in the :term:`cool` :term:`variety`. + + .. index:: single: assertion; common causes .. _topic-error-cause: Common assertions and their causes ----------------------------------- +.................................. This section lists some commonly encountered assertions and suggests likely causes. If you encounter an assertion not listed here (or an @@ -264,30 +294,6 @@ this documentation. condition? -.. index:: - single: assertion - single: error handling; assertion; assertion handling - -.. _topic-error-assertion-handling: - -Assertion Handling ------------------- - -When the MPS detects an assertion failure, it calls the :term:`plinth` -function :c:func:`mps_lib_assert_fail`. If you have not replaced the -plinth, this will print the assertion message and terminate the program -in the :term:`cool` :term:`variety`, but *not* in the :term:`hot` or -:term:`rash` varieties. You can change this behaviour by providing your -own plinth, or using :c:func:`mps_lib_assert_fail_install`. - -In many applications, users don't want their program terminated when the -MPS detects an error, no matter how severe. A lot of MPS assertions -indicate that the program is going to crash very soon, but there still -may be a chance for a user to get some useful results or save their -work. This is why the default assertion handler only terminates in the -:term:`cool` :term:`variety`. - - .. index:: single: error handling; varieties single: variety diff --git a/mps/manual/html/_sources/topic/plinth.txt b/mps/manual/html/_sources/topic/plinth.txt index fc50e847a0e..41866ed76e0 100644 --- a/mps/manual/html/_sources/topic/plinth.txt +++ b/mps/manual/html/_sources/topic/plinth.txt @@ -116,8 +116,8 @@ I/O module .. note:: - In the ANSI I/O module, ``mpsioan.c``, this calls ``fopen`` on - the file named by the environment variable + In the ANSI I/O module, ``mpsioan.c``, this calls + :c:func:`fopen` on the file named by the environment variable :envvar:`MPS_TELEMETRY_FILENAME`. @@ -134,7 +134,8 @@ I/O module .. note:: - In the ANSI I/O module, ``mpsioan.c``, this calls ``fclose``. + In the ANSI I/O module, ``mpsioan.c``, this calls + :c:func:`fclose`. .. c:function:: mps_res_t mps_io_write(mps_io_t io, void *buf, size_t size) @@ -153,7 +154,8 @@ I/O module .. note:: - In the ANSI I/O module, ``mpsioan.c``, this calls ``fwrite``. + In the ANSI I/O module, ``mpsioan.c``, this calls + :c:func:`fwrite`. .. c:function:: mps_res_t mps_io_flush(mps_io_t io) @@ -177,7 +179,8 @@ I/O module .. note:: - In the ANSI I/O module, ``mpsioan.c``, this calls ``fflush``. + In the ANSI I/O module, ``mpsioan.c``, this calls + :c:func:`fflush`. .. index:: @@ -246,9 +249,9 @@ Library module In the ANSI Library module, ``mpsliban.c``, this reports the failure using ``fprintf(stderr, "...%s...", message)`` and, in the :term:`cool` :term:`variety`, terminates the program by - calling ``abort``. You can change this behaviour with - :c:func:`mps_lib_assert_fail_install`. For a discussion of - the default behaviour, see :ref:`topic-error-assertion-handling`. + calling :c:func:`abort`. You can change this behaviour with + :c:func:`mps_lib_assert_fail_install`. For a discussion of the + default behaviour, see :ref:`topic-error-assertion-handling`. .. c:function:: extern mps_lib_assert_fail_t mps_lib_assert_fail_install(mps_lib_assert_fail_t handler) @@ -292,13 +295,13 @@ Library module :c:func:`mps_lib_get_EOF` if not. This function is intended to have the same semantics as the - ``fputc`` function of the ANSI C Standard (:ref:`ISO/IEC 9899:1990 - ` §7.11.7.3). + :c:func:`fputc` function of the ANSI C Standard (:ref:`ISO/IEC + 9899:1990 ` §7.11.7.3). .. note:: In the ANSI Library module, ``mpsliban.c``, this is a simple - wrapper around ``fputc``. + wrapper around :c:func:`fputc`. .. c:function:: int mps_lib_fputs(const char *s, mps_lib_FILE *stream) @@ -310,8 +313,8 @@ Library module ``stream`` is the stream. This function is intended to have the same semantics as the - ``fputs`` function of the ANSI C Standard (:ref:`ISO/IEC 9899:1990 - ` §7.11.7.4). + :c:func:`fputs` function of the ANSI C Standard (:ref:`ISO/IEC + 9899:1990 ` §7.11.7.4). Return a non-negative integer if successful, or :c:func:`mps_lib_get_EOF` if not. @@ -319,7 +322,7 @@ Library module .. note:: In the ANSI Library module, ``mpsliban.c``, this is a simple - wrapper around ``fputs``. + wrapper around :c:func:`fputs`. .. c:function:: int mps_lib_get_EOF(void) @@ -367,7 +370,7 @@ Library module .. c:function:: int mps_lib_memcmp(const void *s1, const void *s2, size_t n) A :term:`plinth` function similar to the standard :term:`C` - function ``memcmp``. + function :c:func:`memcmp`. ``s1`` and ``s2`` point to :term:`blocks` of memory to be compared. @@ -379,19 +382,19 @@ Library module equal to, or less than the block pointed to by ``s2``. This function is intended to have the same semantics as the - ``memcmp`` function of the ANSI C Standard (:ref:`ISO/IEC + :c:func:`memcmp` function of the ANSI C Standard (:ref:`ISO/IEC 9899:1990 ` §7.11.4.1). .. note:: In the ANSI Library module, ``mpsliban.c``, this is a simple - wrapper around ``memcmp``. + wrapper around :c:func:`memcmp`. .. c:function:: void *mps_lib_memcpy(void *dest, const void *source, size_t n) A :term:`plinth` function similar to the standard :term:`C` - function ``memcpy``. + function :c:func:`memcpy`. ``dest`` points to the destination. @@ -402,7 +405,7 @@ Library module Returns ``dest``. This function is intended to have the same semantics as the - ``memcpy`` function of the ANSI C Standard (:ref:`ISO/IEC + :c:func:`memcpy` function of the ANSI C Standard (:ref:`ISO/IEC 9899:1990 ` §7.11.2.1). The MPS never passes overlapping blocks to @@ -411,13 +414,13 @@ Library module .. note:: In the ANSI Library module, ``mpsliban.c``, this is a simple - wrapper around ``memcpy``. + wrapper around :c:func:`memcpy`. .. c:function:: void *mps_lib_memset(void *s, int c, size_t n) A :term:`plinth` function similar to the standard :term:`C` - function ``memset``. + function :c:func:`memset`. ``s`` points to the :term:`block` to fill with the byte ``c``. @@ -428,13 +431,13 @@ Library module Returns ``s``. This function is intended to have the same semantics as the - ``memset`` function of the ANSI C Standard (:ref:`ISO/IEC + :c:func:`memset` function of the ANSI C Standard (:ref:`ISO/IEC 9899:1990 ` §7.11.6.1). .. note:: In the ANSI Library module, ``mpsliban.c``, this is a simple - wrapper around ``memset``. + wrapper around :c:func:`memset`. .. note:: diff --git a/mps/manual/html/_sources/topic/root.txt b/mps/manual/html/_sources/topic/root.txt index 823996f0d0e..28e2d08ada3 100644 --- a/mps/manual/html/_sources/topic/root.txt +++ b/mps/manual/html/_sources/topic/root.txt @@ -37,15 +37,17 @@ You can register a root at any time by calling one of the no two roots may overlap (that is, each reference is :term:`fixed` by at most one root). Roots may be: -1. on the program's :term:`control stack`; +1. in :term:`registers`; -2. in the program's static data; +2. on the program's :term:`control stack`; -3. in :term:`heap` not managed by the MPS (provided that you destroy +3. in the program's static data; + +4. in :term:`heap` not managed by the MPS (provided that you destroy the root before freeing it; see :ref:`the Scheme interpreter's global symbol table ` for an example); -4. in :term:`manually managed ` pools +5. in :term:`manually managed ` pools (provided that you remove the root before freeing it). Roots must not be in memory that is subject to :term:`garbage @@ -99,7 +101,7 @@ scan it for references: table of :term:`tagged references`; 5. :c:func:`mps_root_create_reg` if the root consists of the - registers and control stack of a thread. See + :term:`registers` and :term:`control stack` of a thread. See :ref:`topic-root-thread` below. diff --git a/mps/manual/html/_static/logo.png b/mps/manual/html/_static/logo.png index 42756c08d7afbee9adeeaed46729006461d78e21..f60476aa6ca5146bbdc22bb579bdf7d101c26066 100644 GIT binary patch literal 42298 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 _4P0^$`M0D|G>0T?fhJ;5Xj&bNs(>X?a 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 Bvhn}` literal 10385 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 ID$v;f0nw@T8~^|S diff --git a/mps/manual/html/_static/pygments.css b/mps/manual/html/_static/pygments.css index 1a14f2ae1ab..d79caa151c2 100644 --- a/mps/manual/html/_static/pygments.css +++ b/mps/manual/html/_static/pygments.css @@ -13,11 +13,11 @@ .highlight .gr { color: #FF0000 } /* Generic.Error */ .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ .highlight .gi { color: #00A000 } /* Generic.Inserted */ -.highlight .go { color: #303030 } /* Generic.Output */ +.highlight .go { color: #333333 } /* Generic.Output */ .highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ -.highlight .gt { color: #0040D0 } /* Generic.Traceback */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ .highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ diff --git a/mps/manual/html/design/alloc-frame.html b/mps/manual/html/design/alloc-frame.html new file mode 100644 index 00000000000..12b66d14071 --- /dev/null +++ b/mps/manual/html/design/alloc-frame.html @@ -0,0 +1,613 @@ + + + + + + + + + + 1. Allocation frame protocol — Memory Pool System 1.111.0 documentation + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

1. Allocation frame protocol¶

+
+

1.1. Introduction¶

+

.intro: This document explains the design of the support for +allocation frames in MPS.

+

.readership: This document is intended for any MM developer.

+

.overview: Allocation frames are used for implementing stack pools; +each stack frame corresponds to an allocation frame. Allocation frames +may also be suitable for implementing other sub-pool groupings, such +as generations and ramp allocation patterns.

+

.overview.ambition: We now believe this to be a design that loses +too many advantages of stack allocation for questionable gains. The +requirements are almost entirely based on unanalysed anecdote, instead +of actual clients.

+
+

Note

+

We plan to supersede this with a stack pool design at some point +in the future. Pekka P. Pirinen, 2000-03-09.

+
+
+
+

1.2. Definitions¶

+

.def.alloc-frame: An allocation frame is a generic name for a +device which groups objects together with other objects at allocation +time, and which may have a parent/child relationship with other +allocation frames.

+
+
+

1.3. Purpose¶

+

.purpose.stack-allocation: The allocation frame protocol is +intended to support efficient memory management for stack allocation, +that is, the allocation of objects which have dynamic extent.

+

.purpose.general: The allocation frame protocol is intended to be +sufficiently general that it will be useful in supporting other types +of nested allocation patterns too. For example, it could be used to +for EPVM-style save and restore, ramp allocation patterns or +generations.

+
+
+

1.4. Requirements¶

+
+

1.4.1. Known requirements¶

+

.req.stack-alloc: Provide a interface for clients to describe a +stack allocation pattern, as an alternative to using the control +stack.

+

.req.efficient: Permit an implementation which is comparable in +efficiency to allocating on the control stack.

+

.req.ap: Support allocation via allocation points (APs).

+

.req.format: Support the allocation of formatted objects.

+

.req.scan: Ensure that objects in allocation frames can participate +in garbage collection by being scanned.

+

.req.fix: Ensure that objects in allocation frames can participate +in garbage collection by accepting Fix requests.

+

.req.condemn: Ensure that objects in allocation frames can +participate in garbage collection by being condemned.

+

.attr.locking: Minimize the synchronization cost for the creation +and destruction of frames.

+
+
+

1.4.2. Proto-requirements¶

+

.proto-req: The following are possible requirements that might be +important in the future. The design does not necessarily meet all +these requirements, but it does consider them all. Each requirement +either has direct support in the framework, or could be supported with +future additions to the framework.

+

.req.parallels: The allocation frame protocol should provide a +framework for exploiting the parallels between stack extents, +generations and “ramps”.

+

.req.pool-destroy: It should be possible to use allocation frames +to free all objects in a pool without destroying the pool.

+

.req.epvm: It should be possible to implement EPVM-style save and +restore operations by creating and destroying allocation frames.

+

.req.subst: It should be possible to substitute a stack pool with a +GC-ed pool so that erroneous use of a stack pool can be detected.

+

.req.format-extensions: It should be possible for stack pools to +utilize the same format as any other pool, including debugging formats +that include fenceposting, etc.

+

.req.mis-nest: Should ensure “mis-nested” stacks are safe.

+

.req.non-top-level: Should support allocation in the non-top stack +extent.

+

.req.copy-if-necessary: Should ensure that stack pools can support +“copy-if-necessary” (so that low-level system code can heapify stack +objects.)

+

.req.preserve: When an object is in an allocation frame which is +being destroyed, it should be possible to preserve that object in the +parent frame.

+

.req.contained: Should allow clients to ask if an object is +“contained” in a frame. The object is contained in a frame if it is +affected when the frame is ended.

+

.req.alloc-with-other: Should allow clients to allocate an object +in the same frame as another object.

+
+
+
+

1.5. Overview¶

+

.frame-classes: The protocol supports different types of allocation +frames, which are represented as “frame classes”. It’s up to pools to +determine which classes of allocation frames they support. Pools which +support more than one frame class rely on the client to indicate which +class is currently of interest. The client indicates this by means of +an operation which stores the class in the buffer to which the +allocation point is attached.

+

.frame-handles: Allocation frames are described via abstract “frame +handles”. Pools may choose what the representation of a frame handle +should be. Frame handles are static, and the client need not store +them in a GC root.

+

.lightweight-frames: The design includes an extension to the +allocation point protocol, which permits the creation and destruction +of allocation frames without the necessity for claiming the arena +lock. Such frames are called “lightweight frames”.

+
+
+

1.6. Operations¶

+

.op.intro: Each operation has both an external (client) interface +and an internal (MPS) interface. The external function takes an +allocation point as a parameter, determines which buffer and pool it +belongs to, and calls the internal function with the buffer and pool +as parameters.

+

.op.obligatory: The following operations are supported on any +allocation point which supports allocation frames:-

+

.operation.push: The PushFrame() operation creates a new +allocation frame of the currently chosen frame class, makes this new +frame the current frame, and returns a handle for the frame.

+

.operation.pop: The PopFrame() operation takes a frame handle +as a parameter. Some pool classes might insist or assume that this is +the handle for the current frame. It finds the parent of that frame +and makes it the current frame. The operation indicates that all +children of the new current frame contain objects which are likely to +be dead. The reclaim policy is up to the pool; some classes might +insist or assume that the objects must be dead, and eagerly free them. +Note that this might introduce the possibility of leaving dangling +pointers elsewhere in the arena. If so, it’s up to the pool to decide +what to do about this.

+

.op.optional: The following operations are supported for some +allocation frames, but not all. Pools may choose to support some or +all of these operations for certain frame classes. An unsupported +operation will return a failure value:-

+

.operation.select: The SelectFrame() operation takes a frame +handle as a parameter and makes that frame the current frame. It does +not indicate that any children of the current frame contain objects +which are likely to be dead.

+

.operation.select-addr: The SelectFrameOfAddr() operation takes +an address as a parameter and makes the frame of that address the +current frame. It does not indicate that any children of the current +frame contain objects which are likely to be dead.

+

.operation.in-frame: The AddrInFrame() operation determines +whether the supplied address is the address of an object allocated in +the supplied frame, or any child of that frame.

+

.operation.set: The SetFrameClass() operation takes a frame +class and an allocation point as parameters, and makes that the +current frame class for the allocation point. The next PushFrame() +operation will create a new frame of that class.

+
+
+

1.7. Interface¶

+
+

1.7.1. External types¶

+

.type.client.frame-handle: Frame handles are defined as the abstract +type mps_frame_t.

+
+
+struct mps_frame_class_s *mps_frame_class_t¶
+
+ +

.type.client.frame-class: Frame classes are defined as an abstract +type.

+

.type.client.frame-class.access: Clients access frame classes by +means of dedicated functions for each frame class.

+
+
+

1.7.2. External functions¶

+

.fn.client.push: mps_ap_frame_push() is used by clients to +invoke the PushFrame() operation. For lightweight frames, this +might not invoke the corresponding internal function.

+

.fn.client.pop: mps_ap_frame_pop() is used by clients to invoke +the PopFrame() operation. For lightweight frames, this might not +invoke the corresponding internal function.

+
+
+mps_res_t mps_ap_frame_select(mps_ap_t buf, mps_frame_t frame)¶
+
+ +

.fn.client.select: This following function is used by clients to +invoke the SelectFrame() operation.

+
+
+mps_res_t mps_ap_frame_select_from_addr(mps_ap_t buf, mps_addr_t addr)¶
+
+ +

.fn.client.select-addr: This function is used by clients to invoke +the SelectFrameOfAddr() operation.

+
+
+mps_res_t mps_ap_addr_in_frame(mps_bool_t *inframe_o, mps_ap_t buf, mps_addr_t *addrref, mps_frame_t frame)¶
+
+ +

.fn.client.in-frame: This function is used by clients to invoke the +AddrInFrame() operation.

+
+
+mps_res_t mps_ap_set_frame_class(mps_ap_t buf, mps_frame_class_t
+
+ +

class)

+

.fn.client.set: This function is used by clients to invoke the +SetFrameClass() operation.

+
+
+mps_frame_class_t mps_alloc_frame_class_stack(void)¶
+
+ +

.fn.client.stack-frame-class: This function is used by clients to +access the frame class used for simple stack allocation.

+
+
+

1.7.3. Internal types¶

+
+
+struct AllocFrameStruct *AllocFrame¶
+
+ +

.type.frame-handle: Frame handles are defined as an abstract type.

+
+
+struct AllocFrameClassStruct *AllocFrameClass¶
+
+ +

.type.frame-class: Frame classes are defined as an abstract type.

+
+
+Res (*PoolFramePushMethod)(AllocFrame *frameReturn, Pool pool, Buffer buf)¶
+
+ +

.fn.push: A pool method of this type is called (if needed) to +invoke the PushFrame() operation.

+
+
+Res (*PoolFramePopMethod)(Pool pool, Buffer buf, AllocFrame frame)¶
+
+ +

.fn.pop: A pool method of this type is called (if needed) +to invoke the PopFrame operation:

+
+
+Res (*PoolFrameSelectMethod)(Pool pool, Buffer buf, AllocFrame frame)¶
+
+ +

.fn.select: A pool method of this type is called to invoke the +SelectFrame() operation.

+
+
+Res (*PoolFrameSelectFromAddrMethod)(Pool pool, Buffer buf, Addr addr)¶
+
+ +

.fn.select-addr: A pool method of this type is called to invoke the +SelectFrameOfAddr() operation.

+
+
+Res (*PoolAddrInFrameMethod)(Bool *inframeReturn, Pool pool, Seg seg, Addr *addrref, AllocFrame frame)¶
+
+ +

.fn.in-frame: A pool method of this type is called to invoke the +AddrInFrame() operation.

+
+
+Res (*PoolSetFrameClassMethod)(Pool pool, Buffer buf, AllocFrameClass class)¶
+
+ +

.fn.set: A pool method of this type is called to invoke the +SetFrameClass() operation.

+
+
+
+

1.8. Lightweight frames¶

+
+

1.8.1. Overview¶

+

.lw-frame.overview: Allocation points provide direct support for +lightweight frames, and are designed to permit PushFrame and PopFrame +operations without the need for locking and delegation to the pool +method. Pools can disable this mechanism for any allocation point, so +that the pool method is always called. The pool method will be called +whenever synchronization is required for other reasons (e.g. the +buffer is tripped).

+

.lw-frame.model: Lightweight frames offer direct support for a +particular model of allocation frame use, whereby the PushFrame +operation returns the current allocation pointer as a frame handle, +and the PopFrame operation causes the allocation pointer to be reset +to the address of the frame handle. This model should be suitable for +simple stack frames, where more advanced operations like SelectFrame +are not supported. It may also be suitable for more advanced +allocation frame models when they are being used simply. The use of a +complex operation always involves synchronization via locking, and the +pool may disable lightweight synchronization temporarily at this time.

+
+
+

1.8.2. State¶

+

.lw-frame.states: Allocation points supporting lightweight frames +will be in one of the following states:

+ ++++ + + + + + + + + + + + +
ValidIndicates that PushFrame() can be a lightweight +operation and need not be synchronized.
PopPendingIndicates that there has been a PopFrame() operation +that the pool must respond to.
DisabledIndicates that the pool has disabled support for lightweight +operations for this AP.
+

These states are in addition to the state normally held by an AP for +allocation purposes. An AP will be in the Disabled state at creation.

+

.lw-frame.transitions: State transitions happen under the following +circumstances:

+ ++++ + + + + + + + + + + + + + + + + + + + + +
Valid → PopPendingAs a result of a client PopFrame() +operation.
Valid → DisabledAt the choice of the pool (for example, when +responding to a SelectFrame() operation).
PopPending → ValidAt the choice of the pool, when processing a +PopFrame().
PopPending → DisabledAt the choice of the pool, when processing a +PopFrame().
Disabled → ValidAt the choice of the pool.
Disabled → PopframeIllegal.
+

.lw-frame.state-impl: Each AP contains 3 additional fields to hold this state:

+
mps_addr_t frameptr;
+mps_bool_t enabled;
+mps_bool_t lwPopPending;
+
+
+

.lw-frame.enabled: The enabled slot holds the following values for +each state:

+ ++++ + + + + + + + + + + + +
ValidTRUE
PopPendingTRUE
DisabledFALSE
+

.lw-frame.frameptr: The frameptr slot holds the following values +for each state:

+ ++++ + + + + + + + + + + + +
ValidNULL
PopPendingFrame handle for most recently popped frame.
DisabledNULL
+

.lw-frame.lwPopPending: The lwPopPending slot holds the +following values for each state:

+ ++++ + + + + + + + + + + + +
ValidFALSE
PopPendingTRUE
DisabledFALSE
+

.lw-frame.state-for-gc: It is not necessary for the tracer, format +code, pool, or any other part of the GC support in MPS to read either +of the two additional AP fields in order to scan a segment which +supports a lightweight allocation frame.

+
+
+

1.8.3. Synchronization¶

+

.lw-frame.sync: The purpose of the design is that mutator may +access the state of an AP without locking with MPS (via the external +functions). The design assumes the normal MPS restriction that an +operation on an AP may only be performed by a single mutator thread at +a time. Each of the operations on allocation frames counts as an +operation on an AP.

+

.lw-frame.sync.pool: Pools are permitted to read or modify the +lightweight frame state of an AP only in response to an operation on +that AP.

+

.lw-frame.sync.external: The external functions +mps_ap_frame_push() and mps_ap_frame_pop() are permitted to +read the values of the enabled and frameptr fields for the +supplied AP without claiming the arena lock. They are permitted to +modify the frameptr field if and only if enabled == FALSE.

+

.lw-frame.sync.trip: When a buffer trip happens, and the trap +wasn’t set by MPS itself (that is, it wasn’t because of a flip or for +logging), then the buffer code must check whether the AP has state +PopPending. If it does, the buffer code must call the Pool.

+
+
+

1.8.4. Implementation¶

+

.lw-frame.push: The external PushFrame() operation +(mps_ap_frame_push()) performs the following operations:

+
IF (!APIsTrapped(ap) && StateOfFrame(ap) == Valid && ap->init == ap->alloc)
+   *frame_o = ap->init;
+ELSE
+  WITH_ARENA_LOCK
+    PerformInternalPushFrameOperation(...)
+  END
+END
+
+
+

.lw-frame.pop: The external PopFrame() operation +(mps_ap_frame_pop()) performs the following operations:

+
IF (StateOfFrame(ap) != Disabled)
+  TrapAP(ap);  /* ensure next allocation or push involves the pool */
+  ap->frameptr = frame;
+  ap->lwpopPending = TRUE;
+ELSE
+  WITH_ARENA_LOCK
+    PerformInternalPopFrameOperation(...)
+  END
+END
+
+
+
+
+
+ + +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/mps/manual/html/design/arena.html b/mps/manual/html/design/arena.html index 7a9f51f18cb..ea17e453da4 100644 --- a/mps/manual/html/design/arena.html +++ b/mps/manual/html/design/arena.html @@ -8,7 +8,7 @@ - 1. Arena — Memory Pool System 1.111.0 documentation + 2. Arena — Memory Pool System 1.111.0 documentation @@ -28,8 +28,8 @@ - - + +