mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-03-07 06:22:32 -08:00
Updated manual html
Copied from Perforce Change: 182650 ServerID: perforce.ravenbrook.com
This commit is contained in:
parent
bfe9eed0db
commit
f8ae12a566
184 changed files with 2087 additions and 1846 deletions
|
|
@ -1,5 +1,3 @@
|
|||
.. _design-abq:
|
||||
|
||||
|
||||
Queue design
|
||||
============
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-alloc-frame:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: allocation frames; design
|
||||
|
||||
.. _design-alloc-frame:
|
||||
|
||||
|
||||
Allocation frame protocol
|
||||
=========================
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-arena:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: arena; design
|
||||
|
||||
.. _design-arena:
|
||||
|
||||
|
||||
Arena
|
||||
=====
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
.. _design-arenavm:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: virtual memory arena; design
|
||||
pair: VM arena; design
|
||||
|
||||
.. _design-arenavm:
|
||||
|
||||
|
||||
Virtual Memory Arena
|
||||
====================
|
||||
|
|
|
|||
|
|
@ -1,37 +0,0 @@
|
|||
.. _design-boot:
|
||||
|
||||
|
||||
The MPS Bootstrap
|
||||
=================
|
||||
|
||||
.. mps:prefix:: design.mps.boot
|
||||
|
||||
|
||||
Introduction
|
||||
------------
|
||||
The `Memory Pool System`_ starts with no memory, but must somehow
|
||||
allocate its own control structures in order to provide memory to the
|
||||
client program. The MPS is freestanding [ref?] and so it can't get its
|
||||
memory from the C library's ``malloc``. So how does it get off the
|
||||
ground? It pulls itself up by its own bootstraps. This document
|
||||
describes how.
|
||||
|
||||
.. note::
|
||||
|
||||
This document was written as a prelude to reforming the bootstrap,
|
||||
so it shouldn't be taken as advocating it as an amazing piece of
|
||||
design.
|
||||
|
||||
|
||||
Pretty much the first call to the MPS is to ``ArenaCreate``, which calls the
|
||||
arena class specific ``init`` method. That must create an initialized arena,
|
||||
except for the "control pool", from which many MPS data structures will be
|
||||
allocated.
|
||||
|
||||
In the case of the VM arena, ``VMArenaInit`` creates a VM large enough to hold
|
||||
a :c:type:`VMArenaStruct` (which contains the generic :c:type:`ArenaStruct`) and maps
|
||||
pages into it. It then calls ``ArenaInit`` to initialise the generic part,
|
||||
before filling in the VM-specific part. Having done that, it adds the initial
|
||||
``VMChunk`` -- a large area of address space -- that will be used to supply
|
||||
memory via ``ArenaAlloc``.
|
||||
|
||||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-bt:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: bit tables; design
|
||||
|
||||
.. _design-bt:
|
||||
|
||||
|
||||
Bit tables
|
||||
==========
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-buffer:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: buffers; design
|
||||
|
||||
.. _design-buffer:
|
||||
|
||||
|
||||
Allocation buffers and allocation points
|
||||
========================================
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
.. _design-cbs:
|
||||
|
||||
|
||||
Coalescing block structure
|
||||
==========================
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-check:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: checking; design
|
||||
|
||||
.. _design-check:
|
||||
|
||||
|
||||
Checking
|
||||
========
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-class-interface:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: class interface; design
|
||||
|
||||
.. _design-class-interface:
|
||||
|
||||
|
||||
Pool class interface
|
||||
====================
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-collection:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: collection framework; design
|
||||
|
||||
.. _design-collection:
|
||||
|
||||
|
||||
Collection framework
|
||||
====================
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-config:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: configuration; design
|
||||
|
||||
.. _design-config:
|
||||
|
||||
|
||||
MPS Configuration
|
||||
=================
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
.. _design-critical-path:
|
||||
|
||||
|
||||
.. index::
|
||||
single: critical path
|
||||
single: path; critical
|
||||
single: Memory Pool System; critical path
|
||||
|
||||
.. _design-critical-path:
|
||||
|
||||
|
||||
The critical path through the MPS
|
||||
=================================
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-diag:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: diagnostic feedback; design
|
||||
|
||||
.. _design-diag:
|
||||
|
||||
|
||||
Diagnostic feedback
|
||||
===================
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-finalize:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: finalization; design
|
||||
|
||||
.. _design-finalize:
|
||||
|
||||
|
||||
Finalization
|
||||
============
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-fix:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: fix function; design
|
||||
|
||||
.. _design-fix:
|
||||
|
||||
|
||||
The generic fix function
|
||||
========================
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
.. _design-freelist:
|
||||
|
||||
|
||||
Free list allocator
|
||||
===================
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-guide.hex.trans:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: hexadecimal; transliterating
|
||||
|
||||
.. _design-guide.hex.trans:
|
||||
|
||||
|
||||
Transliterating the alphabet into hexadecimal
|
||||
=============================================
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
.. _design-guide.impl.c.format:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: C language; formatting guide
|
||||
pair: C language formatting; guide
|
||||
|
||||
.. _design-guide.impl.c.format:
|
||||
|
||||
|
||||
C Style -- formatting
|
||||
=====================
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-interface-c:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: C interface; design
|
||||
|
||||
.. _design-interface-c:
|
||||
|
||||
|
||||
C interface design
|
||||
==================
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-io:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: I/O subsystem; design
|
||||
|
||||
.. _design-io:
|
||||
|
||||
|
||||
I/O subsystem
|
||||
=============
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-keyword-arguments:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: keyword arguments; design
|
||||
|
||||
.. _design-keyword-arguments:
|
||||
|
||||
|
||||
Keyword arguments in the MPS
|
||||
============================
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-lib:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: library interface; design
|
||||
|
||||
.. _design-lib:
|
||||
|
||||
|
||||
Library interface
|
||||
=================
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-lock:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: locking; design
|
||||
|
||||
.. _design-lock:
|
||||
|
||||
|
||||
The lock module
|
||||
===============
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-locus:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: locus manager; design
|
||||
|
||||
.. _design-locus:
|
||||
|
||||
|
||||
MPS Configuration
|
||||
=================
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-message-gc:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: garbage collection messages; design
|
||||
|
||||
.. _design-message-gc:
|
||||
|
||||
|
||||
GC messages
|
||||
===========
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
.. _design-message:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: messages; design
|
||||
single: client message protocol
|
||||
|
||||
.. _design-message:
|
||||
|
||||
|
||||
Client message protocol
|
||||
=======================
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-object-debug:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: debugging; design
|
||||
|
||||
.. _design-object-debug:
|
||||
|
||||
|
||||
Debugging features for client objects
|
||||
=====================================
|
||||
|
|
|
|||
|
|
@ -40,6 +40,8 @@ Old design
|
|||
poollo
|
||||
poolmfs
|
||||
poolmrg
|
||||
poolmv
|
||||
poolmvt
|
||||
poolmvff
|
||||
prot
|
||||
protan
|
||||
|
|
@ -54,7 +56,9 @@ Old design
|
|||
shield
|
||||
splay
|
||||
sso1al
|
||||
strategy
|
||||
telemetry
|
||||
tests
|
||||
thread-manager
|
||||
thread-safety
|
||||
trace
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-pool:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: pool class mechanism; design
|
||||
|
||||
.. _design-pool:
|
||||
|
||||
|
||||
Pool and pool class mechanisms
|
||||
==============================
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
.. _design-poolamc:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: AMC pool class; design
|
||||
single: pool class; AMC design
|
||||
|
||||
.. _design-poolamc:
|
||||
|
||||
|
||||
AMC pool class
|
||||
==============
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
.. _design-poolams:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: AMS pool class; design
|
||||
single: pool class; AMS design
|
||||
|
||||
.. _design-poolams:
|
||||
|
||||
|
||||
AMS pool class
|
||||
==============
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
.. _design-poolawl:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: AWL pool class; design
|
||||
single: pool class; AWL design
|
||||
|
||||
.. _design-poolawl:
|
||||
|
||||
|
||||
AWL pool class
|
||||
==============
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
.. _design-poollo:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: LO pool class; design
|
||||
single: pool class; LO design
|
||||
|
||||
.. _design-poollo:
|
||||
|
||||
|
||||
LO pool class
|
||||
=============
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
.. _design-poolmfs:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: MFS pool class; design
|
||||
single: pool class; MFS design
|
||||
|
||||
.. _design-poolmfs:
|
||||
|
||||
|
||||
MFS pool class
|
||||
==============
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
.. _design-poolmrg:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: MRG pool class; design
|
||||
single: pool class; MRG design
|
||||
|
||||
.. _design-poolmrg:
|
||||
|
||||
|
||||
MRG pool class
|
||||
==============
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
.. _design-poolmv:
|
||||
|
||||
|
||||
MV pool class
|
||||
=============
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
.. _design-poolmvff:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: MVFF pool class; design
|
||||
single: pool class; MVFF design
|
||||
|
||||
.. _design-poolmvff:
|
||||
|
||||
|
||||
MVFF pool class
|
||||
===============
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
.. _design-poolmvt:
|
||||
|
||||
|
||||
|
||||
Manual Variable Temporal (MVT) pool design
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-prot:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: protection interface; design
|
||||
|
||||
.. _design-prot:
|
||||
|
||||
|
||||
The protection module
|
||||
=====================
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
.. _design-protan:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: ANSI; protection interface design
|
||||
pair: ANSI protection interface; design
|
||||
|
||||
.. _design-protan:
|
||||
|
||||
|
||||
ANSI implementation of protection module
|
||||
========================================
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
.. _design-protli:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: Linux; protection interface design
|
||||
pair: Linux protection interface; design
|
||||
|
||||
.. _design-protli:
|
||||
|
||||
|
||||
Linux implementation of protection module
|
||||
=========================================
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-protocol:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: protocol inheritance; design
|
||||
|
||||
.. _design-protocol:
|
||||
|
||||
|
||||
Protocol inheritance
|
||||
====================
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
.. _design-protsu:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: SunOS 4; protection interface design
|
||||
pair: SunOS 4 protection interface; design
|
||||
|
||||
.. _design-protsu:
|
||||
|
||||
|
||||
SunOS 4 protection module
|
||||
=========================
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-pthreadext:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: POSIX thread extensions; design
|
||||
|
||||
.. _design-pthreadext:
|
||||
|
||||
|
||||
POSIX thread extensions
|
||||
=======================
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
.. _design-range:
|
||||
|
||||
|
||||
Ranges
|
||||
======
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-reservoir:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: reservoir; design
|
||||
|
||||
.. _design-reservoir:
|
||||
|
||||
|
||||
The low-memory reservoir
|
||||
========================
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-ring:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: ring structure; design
|
||||
|
||||
.. _design-ring:
|
||||
|
||||
|
||||
Ring data structure
|
||||
===================
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-root:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: root manager; design
|
||||
|
||||
.. _design-root:
|
||||
|
||||
|
||||
Root manager
|
||||
============
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-scan:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: generic scanner; design
|
||||
|
||||
.. _design-scan:
|
||||
|
||||
|
||||
The generic scanner
|
||||
===================
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-seg:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: segments; design
|
||||
|
||||
.. _design-seg:
|
||||
|
||||
|
||||
Segment data structure
|
||||
======================
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-shield:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: shield; design
|
||||
|
||||
.. _design-shield:
|
||||
|
||||
|
||||
Shield
|
||||
======
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
.. _design-sig:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: structure signatures; design
|
||||
single: signatures
|
||||
|
||||
.. _design-sig:
|
||||
|
||||
|
||||
Signatures in the MPS
|
||||
=====================
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-splay:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: splay trees; design
|
||||
|
||||
.. _design-splay:
|
||||
|
||||
|
||||
Splay trees
|
||||
===========
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
.. _design-sso1al:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: Digital Unix on Alpha stack scanner; design
|
||||
pair: Digital Unix on Alpha; stack scanner design
|
||||
|
||||
.. _design-sso1al:
|
||||
|
||||
|
||||
Stack scanner for Digital Unix on Alpha
|
||||
=======================================
|
||||
|
|
@ -126,6 +126,8 @@ is lower in memory than the bottom of the stack.
|
|||
References
|
||||
----------
|
||||
|
||||
.. [DEC_Assembler] Digital Equipment Corporation. 1996; <http://h30097.www3.hp.com/docs/base_doc/DOCUMENTATION/V40F_HTML/APS31DTE/TITLE.HTM>. .. [DEC_Alpha_Calling_Standard] "Calling Standard for Alpha Systems"; Digital Equipment Corporation. 1996. "`Assembly Language Programmer's Guide <http://h30097.www3.hp.com/docs/base_doc/DOCUMENTATION/V40F_HTML/APY8ACTE/TITLE.HTM>`__".
|
||||
.. [DEC_Assembler] Digital Equipment Corporation. 1996. "`Assembly Language Programmer's Guide <http://h30097.www3.hp.com/docs/base_doc/DOCUMENTATION/V40F_HTML/APS31DTE/TITLE.HTM>`__".
|
||||
|
||||
.. [DEC_Alpha_Calling_Standard] Digital Equipment Corporation. 1996. "`Calling Standard for Alpha Systems <http://h30097.www3.hp.com/docs/base_doc/DOCUMENTATION/V40F_HTML/APY8ACTE/TITLE.HTM>`__".
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
.. _design-strategy:
|
||||
|
||||
|
||||
MPS Strategy
|
||||
============
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-telemetry:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: telemetry; design
|
||||
|
||||
.. _design-telemetry:
|
||||
|
||||
|
||||
Telemetry
|
||||
=========
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
.. _design-tests:
|
||||
|
||||
|
||||
Tests
|
||||
=====
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-thread-manager:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: thread manager; design
|
||||
|
||||
.. _design-thread-manager:
|
||||
|
||||
|
||||
Thread Manager
|
||||
==============
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-thread-safety:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: thread safety; design
|
||||
|
||||
.. _design-thread-safety:
|
||||
|
||||
|
||||
Thread safety in the MPS
|
||||
========================
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-trace:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: tracer; design
|
||||
|
||||
.. _design-trace:
|
||||
|
||||
|
||||
Tracer
|
||||
======
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-type:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: general types; design
|
||||
|
||||
.. _design-type:
|
||||
|
||||
|
||||
General MPS types
|
||||
=================
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-version-library:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: library version mechanism; design
|
||||
|
||||
.. _design-version-library:
|
||||
|
||||
|
||||
Library version mechanism
|
||||
=========================
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
.. _design-version:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: software versions; design
|
||||
single: versions; design
|
||||
|
||||
.. _design-version:
|
||||
|
||||
|
||||
Software versions
|
||||
=================
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-vm:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: virtual mapping; design
|
||||
|
||||
.. _design-vm:
|
||||
|
||||
|
||||
Virtual mapping
|
||||
===============
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-vman:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: ANSI fake VM; design
|
||||
|
||||
.. _design-vman:
|
||||
|
||||
|
||||
ANSI fake VM
|
||||
============
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-vmo1:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: VM for Digital Unix; design
|
||||
|
||||
.. _design-vmo1:
|
||||
|
||||
|
||||
VM for Digital Unix
|
||||
===================
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-vmso:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: VM for Solaris; design
|
||||
|
||||
.. _design-vmso:
|
||||
|
||||
|
||||
VM for Solaris
|
||||
==============
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.. _design-writef:
|
||||
|
||||
|
||||
.. index::
|
||||
pair: WriteF function; design
|
||||
|
||||
.. _design-writef:
|
||||
|
||||
|
||||
The WriteF function
|
||||
===================
|
||||
|
|
|
|||
|
|
@ -35,5 +35,6 @@ Appendices
|
|||
glossary/index
|
||||
copyright
|
||||
contact
|
||||
release
|
||||
|
||||
* :ref:`genindex`
|
||||
|
|
|
|||
|
|
@ -20,50 +20,63 @@ of pools, choosing the most appropriate pool class for each.
|
|||
class in the open source MPS exactly matches your needs, then it
|
||||
is possible to develop new pool classes. See :ref:`pool-writing`.
|
||||
|
||||
First, answer these questions about your data:
|
||||
First, do you need the MPS to :term:`automatically <automatic memory
|
||||
management>` :term:`reclaim` :term:`unreachable` blocks? If so, you
|
||||
need an automatically managed (garbage collected) pool class and you
|
||||
should consult :ref:`pool-choose-automatic` below.
|
||||
Otherwise, you need a manually managed pool class and you should
|
||||
consult :ref:`pool-choose-manual` below.
|
||||
|
||||
1. Do you need the MPS to :term:`automatically <automatic memory
|
||||
management>` :term:`reclaim` :term:`unreachable` blocks?
|
||||
|
||||
2. Is it acceptable for the MPS to :term:`move <moving memory
|
||||
.. _pool-choose-automatic:
|
||||
|
||||
Choosing an automatic pool class
|
||||
--------------------------------
|
||||
|
||||
Answer these questions about your data:
|
||||
|
||||
1. Is it acceptable for the MPS to :term:`move <moving memory
|
||||
manager>` blocks in memory and to place :term:`barriers (1)` on
|
||||
blocks? (For example, it might not be acceptable to move a block if
|
||||
it has been passed to :term:`foreign code` that remembered its
|
||||
location.)
|
||||
|
||||
3. Do your blocks contain :term:`references` to blocks stored in
|
||||
2. Do your blocks contain :term:`references` to blocks stored in
|
||||
automatically managed pools (including references to other blocks
|
||||
in the same pool, if it's automatically managed)? And if so, are
|
||||
these references :term:`exact <exact reference>`, :term:`ambiguous
|
||||
<ambiguous reference>` or :term:`weak <weak reference (1)>`?
|
||||
these references :term:`exact <exact reference>` or :term:`weak
|
||||
<weak reference (1)>`?
|
||||
|
||||
Second, look up your answers in this table to find the recommended
|
||||
pool class to use:
|
||||
|
||||
========== ====================== =========== ====================================
|
||||
Automatic? Movable & protectable? References? Use this pool class
|
||||
========== ====================== =========== ====================================
|
||||
yes yes none :ref:`pool-amcz`
|
||||
yes yes exact :ref:`pool-amc`
|
||||
yes yes ambiguous nothing suitable
|
||||
yes yes weak :ref:`pool-awl`
|
||||
yes no none :ref:`pool-lo`
|
||||
yes no exact :ref:`pool-ams`
|
||||
yes no ambiguous nothing suitable
|
||||
yes no weak nothing suitable
|
||||
no *any* none :ref:`pool-mvff`
|
||||
no *any* exact :ref:`pool-mvff` [1]_
|
||||
no *any* ambiguous :ref:`pool-mvff` [1]_
|
||||
no *any* weak :ref:`pool-mvff` [1]_
|
||||
========== ====================== =========== ====================================
|
||||
====================== =========== ===================
|
||||
Movable & protectable? References? Use this pool class
|
||||
====================== =========== ===================
|
||||
yes none :ref:`pool-amcz`
|
||||
yes exact :ref:`pool-amc`
|
||||
yes weak :ref:`pool-awl`
|
||||
no none :ref:`pool-lo`
|
||||
no exact :ref:`pool-ams`
|
||||
no weak nothing suitable
|
||||
====================== =========== ===================
|
||||
|
||||
.. note::
|
||||
|
||||
.. [1] :ref:`pool-mvff` doesn't scan for references, but you can
|
||||
work around this by registering your blocks as
|
||||
:term:`roots` (with the appropriate :term:`rank`) just
|
||||
after they are allocated, and deregistering them just
|
||||
before freeing them.
|
||||
.. _pool-choose-manual:
|
||||
|
||||
Choosing a manual pool class
|
||||
----------------------------
|
||||
|
||||
Answer these questions about your data:
|
||||
|
||||
1. Are the blocks fixed in size? If so, use :ref:`pool-mfs`.
|
||||
|
||||
2. Are the lifetimes of blocks predictable? If so, use
|
||||
:ref:`pool-mvt`, and arrange that objects that are predicted to die
|
||||
at about the same time are allocated from the same
|
||||
:term:`allocation point`.
|
||||
|
||||
3. Otherwise, use :ref:`pool-mvff`.
|
||||
|
||||
|
||||
.. Sources:
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ MV (Manual Variable)
|
|||
|
||||
.. deprecated:: starting with version 1.111.
|
||||
|
||||
:ref:`pool-mvff` should be used instead.
|
||||
:ref:`pool-mvff` or :ref:`pool-mvt` should be used instead.
|
||||
|
||||
**MV** is a general-purpose :term:`manually managed <manual memory
|
||||
management>` :term:`pool class` that manages :term:`blocks` of
|
||||
|
|
|
|||
|
|
@ -125,7 +125,7 @@ MVFF interface
|
|||
efficient if this is wrong, but nothing will break.
|
||||
|
||||
* :c:macro:`MPS_KEY_ALIGN` (type :c:type:`mps_align_t`, default is
|
||||
smallest general purpose alignment for the architecture) is the
|
||||
:c:macro:`MPS_PF_ALIGN`) is the
|
||||
:term:`alignment` of addresses for allocation (and freeing) in
|
||||
the pool. If an unaligned size is passed to :c:func:`mps_alloc` or
|
||||
:c:func:`mps_free`, it will be rounded up to the pool's alignment.
|
||||
|
|
|
|||
|
|
@ -78,10 +78,6 @@ MVT properties
|
|||
|
||||
* Allocations may be variable in size.
|
||||
|
||||
* The :term:`alignment` of blocks is not configurable: it is the
|
||||
:term:`natural alignment` of the platform (see
|
||||
:c:macro:`MPS_PF_ALIGN`).
|
||||
|
||||
* Blocks do not have :term:`dependent objects`.
|
||||
|
||||
* Blocks are not automatically :term:`reclaimed`.
|
||||
|
|
@ -116,7 +112,7 @@ MVT interface
|
|||
six :term:`keyword arguments`:
|
||||
|
||||
* :c:macro:`MPS_KEY_ALIGN` (type :c:type:`mps_align_t`, default is
|
||||
smallest general purpose alignment for the architecture) is the
|
||||
:c:macro:`MPS_PF_ALIGN`) is the
|
||||
:term:`alignment` of addresses for allocation (and freeing) in
|
||||
the pool. If an unaligned size is passed to :c:func:`mps_alloc` or
|
||||
:c:func:`mps_free`, it will be rounded up to the pool's alignment.
|
||||
|
|
@ -124,7 +120,7 @@ MVT interface
|
|||
``sizeof(void *)``.
|
||||
|
||||
* :c:macro:`MPS_KEY_MIN_SIZE` (type :c:type:`size_t`, default is
|
||||
smallest general purpose alignment for the architecture) is the
|
||||
:c:macro:`MPS_PF_ALIGN`) is the
|
||||
predicted minimum size of blocks that will be allocated from the
|
||||
pool.
|
||||
|
||||
|
|
@ -143,9 +139,9 @@ MVT interface
|
|||
that will break is the partial freeing of large blocks.
|
||||
|
||||
* :c:macro:`MPS_KEY_MVT_RESERVE_DEPTH` (type
|
||||
:c:type:`mps_count_t`) is the expected hysteresis of the
|
||||
population of the pool. When blocks are freed, the pool will
|
||||
retain sufficient storage to allocate this many blocks of the
|
||||
:c:type:`mps_count_t`, default 1024) is the expected hysteresis
|
||||
of the population of the pool. When blocks are freed, the pool
|
||||
will retain sufficient storage to allocate this many blocks of the
|
||||
mean size for near term allocations (rather than immediately
|
||||
making that storage available to other pools).
|
||||
|
||||
|
|
@ -167,14 +163,14 @@ MVT interface
|
|||
object population does vary, at a slight cost in efficiency. The
|
||||
reserve does not guarantee any particular amount of allocation.
|
||||
|
||||
* :c:macro:`MPS_KEY_MVT_FRAG_LIMIT` (type :c:type:`mps_count_t`)
|
||||
is a double from 0.0 to 1.0 (inclusive). It sets an upper
|
||||
limit on the space overhead of an MVT pool, in case block death
|
||||
times and allocations do not correlate well. If the free space
|
||||
managed by the pool as a ratio of all the space managed by the
|
||||
pool exceeds the fragmentation limit, the pool falls back to a
|
||||
first fit allocation policy, exploiting space more efficiently
|
||||
at a cost in time efficiency. A fragmentation limit of 0.0 would
|
||||
* :c:macro:`MPS_KEY_MVT_FRAG_LIMIT` (type :c:type:`double`,
|
||||
default 0.3) is a double from 0.0 to 1.0 (inclusive). It sets an
|
||||
upper limit on the space overhead of an MVT pool, in case block
|
||||
death times and allocations do not correlate well. If the free
|
||||
space managed by the pool as a ratio of all the space managed by
|
||||
the pool exceeds the fragmentation limit, the pool falls back to a
|
||||
first fit allocation policy, exploiting space more efficiently at
|
||||
a cost in time efficiency. A fragmentation limit of 0.0 would
|
||||
cause the pool to operate as a first-fit pool, at a significant
|
||||
cost in time efficiency: therefore this is not permitted.
|
||||
|
||||
|
|
|
|||
72
mps/manual/html/_sources/release.txt
Normal file
72
mps/manual/html/_sources/release.txt
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
.. _release-notes:
|
||||
|
||||
Release notes
|
||||
=============
|
||||
|
||||
.. _release-notes-1.112:
|
||||
|
||||
Release 1.112.0
|
||||
---------------
|
||||
|
||||
Interface changes
|
||||
.................
|
||||
|
||||
1. In the :term:`hot` (production) variety, the MPS now prints
|
||||
assertion messages to standard error but does *not* terminate the
|
||||
program. This is because most assertions do not indicate *fatal*
|
||||
error conditions, and continuing gives the application a chance to
|
||||
shut down safely and save work, or even to limp along indefinitely.
|
||||
See :ref:`topic-error-assertion-handling`.
|
||||
|
||||
2. The behaviour when an assertion is triggered is now configurable in
|
||||
the standard ANSI :term:`plinth` by installing an assertion
|
||||
handler. See :c:func:`mps_lib_assert_fail_install`.
|
||||
|
||||
3. Functions that take a variable number of arguments
|
||||
(:c:func:`mps_arena_create`, :c:func:`mps_pool_create`,
|
||||
:c:func:`mps_fmt_create` and :c:func:`mps_ap_create`) are now
|
||||
deprecated in favour of functions that use a :term:`keyword
|
||||
argument` interface (:c:func:`mps_arena_create_k`,
|
||||
:c:func:`mps_pool_create_k`, :c:func:`mps_fmt_create_k` and
|
||||
:c:func:`mps_ap_create_k`). The new interface provides better
|
||||
reporting of errors, provides default values for arguments, and
|
||||
provides forward compatibility. See :ref:`topic-keyword`.
|
||||
|
||||
(The old interface continues to be supported, but new features will
|
||||
only be available through the keyword interface.)
|
||||
|
||||
4. :ref:`pool-mfs` no longer refuses to manage blocks that are smaller
|
||||
than the platform alignment. It now rounds up smaller sizes
|
||||
internally if necessary.
|
||||
|
||||
5. :ref:`pool-mvt` now allows the client to specify the alignment of
|
||||
blocks allocated from the pool. Use the keyword argument
|
||||
:c:macro:`MPS_KEY_ALIGN` when creating a pool of class
|
||||
:c:func:`mps_class_mvt`.
|
||||
|
||||
6. On Windows, you can now request that the MPS allocate address space
|
||||
from the top down, allowing a 32-bit executable linked with
|
||||
``/LARGEADDRESSAWARE`` to use the top half of the address space.
|
||||
Use the keyword argument :c:macro:`MPS_KEY_VMW3_TOP_DOWN` when
|
||||
creating an arena of class :c:func:`mps_arena_class_vm`.
|
||||
|
||||
|
||||
Other changes
|
||||
.............
|
||||
|
||||
1. On Windows, an execute exception no longer triggers an assertion.
|
||||
See job003301_.
|
||||
|
||||
.. _job003301: https://www.ravenbrook.com/project/mps/issue/job003301/
|
||||
|
||||
2. Rehashing of large address-based hash tables no longer provokes a
|
||||
nursery collection that immediately renders the hash table stale
|
||||
again. See job003435_.
|
||||
|
||||
.. _job003435: https://www.ravenbrook.com/project/mps/issue/job003435/
|
||||
|
||||
3. :ref:`pool-mvt` no longer triggers an assertion failure when it
|
||||
runs out of space on its reserved block queue. See job003486_.
|
||||
|
||||
.. _job003486: https://www.ravenbrook.com/project/mps/issue/job003486/
|
||||
|
||||
|
|
@ -232,6 +232,13 @@ assertion that is listed here but for which you discovered a different
|
|||
cause), please :ref:`let us know <contact>` so that we can improve
|
||||
this documentation.
|
||||
|
||||
``arenavm.c: BTIsResRange(vmChunk->pageTableMapped, 0, chunk->pageTablePages)``
|
||||
|
||||
The client program called :c:func:`mps_arena_destroy` without
|
||||
having destroyed all pools in that arena first. (The assertion is
|
||||
from the virtual memory manager which is checking that all pages
|
||||
have been unmapped.)
|
||||
|
||||
|
||||
``dbgpool.c: fencepost check on free``
|
||||
|
||||
|
|
|
|||
|
|
@ -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: #333333 } /* Generic.Output */
|
||||
.highlight .go { color: #303030 } /* 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: #0044DD } /* Generic.Traceback */
|
||||
.highlight .gt { color: #0040D0 } /* 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 */
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@
|
|||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<link rel="copyright" title="Copyright" href="copyright.html" />
|
||||
<link rel="top" title="Memory Pool System 1.111.0 documentation" href="index.html" />
|
||||
<link rel="next" title="Release notes" href="release.html" />
|
||||
<link rel="prev" title="Memory Pool System Kit Open Source License" href="copyright.html" />
|
||||
</head>
|
||||
<body>
|
||||
|
|
@ -36,6 +37,9 @@
|
|||
<li class="right" style="margin-right: 10px">
|
||||
<a href="genindex.html" title="General Index"
|
||||
accesskey="I">index</a></li>
|
||||
<li class="right" >
|
||||
<a href="release.html" title="Release notes"
|
||||
accesskey="N">next</a> |</li>
|
||||
<li class="right" >
|
||||
<a href="copyright.html" title="Memory Pool System Kit Open Source License"
|
||||
accesskey="P">previous</a> |</li>
|
||||
|
|
@ -80,7 +84,10 @@ Ravenbrook’s web site</a>.</p>
|
|||
</a></p>
|
||||
<h4>Previous topic</h4>
|
||||
<p class="topless"><a href="copyright.html"
|
||||
title="previous chapter">Memory Pool System Kit Open Source License</a></p><h4>Downloads</h4>
|
||||
title="previous chapter">Memory Pool System Kit Open Source License</a></p>
|
||||
<h4>Next topic</h4>
|
||||
<p class="topless"><a href="release.html"
|
||||
title="next chapter">Release notes</a></p><h4>Downloads</h4>
|
||||
|
||||
<p class="topless">
|
||||
<a href="http://www.ravenbrook.com/project/mps/release/1.111.0/">MPS Kit release 1.111.0</a><br>
|
||||
|
|
@ -105,6 +112,9 @@ Ravenbrook’s web site</a>.</p>
|
|||
<li class="right" style="margin-right: 10px">
|
||||
<a href="genindex.html" title="General Index"
|
||||
>index</a></li>
|
||||
<li class="right" >
|
||||
<a href="release.html" title="Release notes"
|
||||
>next</a> |</li>
|
||||
<li class="right" >
|
||||
<a href="copyright.html" title="Memory Pool System Kit Open Source License"
|
||||
>previous</a> |</li>
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@
|
|||
<div class="body">
|
||||
|
||||
<div class="section" id="queue-design">
|
||||
<span id="design-abq"></span><h1>1. Queue design<a class="headerlink" href="#queue-design" title="Permalink to this headline">¶</a></h1>
|
||||
<h1>1. Queue design<a class="headerlink" href="#queue-design" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="introduction">
|
||||
<span id="design.mps.abq"></span><h2>1.1. Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h2>
|
||||
<p><span class="target" id="design.mps.abq.intro"></span><a class="mpstag reference internal" href="#design.mps.abq.intro">.intro:</a> This is the design of the ABQ module, which implements a
|
||||
|
|
|
|||
|
|
@ -54,8 +54,8 @@
|
|||
<div class="bodywrapper">
|
||||
<div class="body">
|
||||
|
||||
<span class="target" id="design-alloc-frame"></span><div class="section" id="allocation-frame-protocol">
|
||||
<span id="index-0"></span><h1>1. Allocation frame protocol<a class="headerlink" href="#allocation-frame-protocol" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="allocation-frame-protocol">
|
||||
<span id="design-alloc-frame"></span><span id="index-0"></span><h1>1. Allocation frame protocol<a class="headerlink" href="#allocation-frame-protocol" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="introduction">
|
||||
<span id="design.mps.alloc-frame"></span><h2>1.1. Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h2>
|
||||
<p><span class="target" id="design.mps.alloc-frame.intro"></span><a class="mpstag reference internal" href="#design.mps.alloc-frame.intro">.intro:</a> This document explains the design of the support for
|
||||
|
|
@ -407,9 +407,9 @@ responding to a <tt class="xref c c-func docutils literal"><span class="pre">Sel
|
|||
</tbody>
|
||||
</table>
|
||||
<p><span class="target" id="design.mps.alloc-frame.lw-frame.state-impl"></span><a class="mpstag reference internal" href="#design.mps.alloc-frame.lw-frame.state-impl">.lw-frame.state-impl:</a> Each AP contains 3 additional fields to hold this state:</p>
|
||||
<div class="highlight-c"><div class="highlight"><pre><span class="kt">mps_addr_t</span> <span class="n">frameptr</span><span class="p">;</span>
|
||||
<span class="kt">mps_bool_t</span> <span class="n">enabled</span><span class="p">;</span>
|
||||
<span class="kt">mps_bool_t</span> <span class="n">lwPopPending</span><span class="p">;</span>
|
||||
<div class="highlight-c"><div class="highlight"><pre><span class="n">mps_addr_t</span> <span class="n">frameptr</span><span class="p">;</span>
|
||||
<span class="n">mps_bool_t</span> <span class="n">enabled</span><span class="p">;</span>
|
||||
<span class="n">mps_bool_t</span> <span class="n">lwPopPending</span><span class="p">;</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p><span class="target" id="design.mps.alloc-frame.lw-frame.enabled"></span><a class="mpstag reference internal" href="#design.mps.alloc-frame.lw-frame.enabled">.lw-frame.enabled:</a> The <tt class="docutils literal"><span class="pre">enabled</span></tt> slot holds the following values for
|
||||
|
|
|
|||
|
|
@ -54,8 +54,8 @@
|
|||
<div class="bodywrapper">
|
||||
<div class="body">
|
||||
|
||||
<span class="target" id="design-arena"></span><div class="section" id="arena">
|
||||
<span id="index-0"></span><h1>2. Arena<a class="headerlink" href="#arena" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="arena">
|
||||
<span id="design-arena"></span><span id="index-0"></span><h1>2. Arena<a class="headerlink" href="#arena" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="introduction">
|
||||
<span id="design.mps.arena"></span><h2>2.1. Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h2>
|
||||
<p><span class="target" id="design.mps.arena.intro"></span><a class="mpstag reference internal" href="#design.mps.arena.intro">.intro:</a> This is the design of the arena structure.</p>
|
||||
|
|
|
|||
|
|
@ -54,8 +54,8 @@
|
|||
<div class="bodywrapper">
|
||||
<div class="body">
|
||||
|
||||
<span class="target" id="design-arenavm"></span><div class="section" id="virtual-memory-arena">
|
||||
<span id="index-0"></span><h1>3. Virtual Memory Arena<a class="headerlink" href="#virtual-memory-arena" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="virtual-memory-arena">
|
||||
<span id="design-arenavm"></span><span id="index-0"></span><h1>3. Virtual Memory Arena<a class="headerlink" href="#virtual-memory-arena" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="introduction">
|
||||
<span id="design.mps.arena.vm"></span><h2>3.1. Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h2>
|
||||
<p><span class="target" id="design.mps.arena.vm.intro"></span><a class="mpstag reference internal" href="#design.mps.arena.vm.intro">.intro:</a> This document describes the detailed design of the Virtual
|
||||
|
|
|
|||
|
|
@ -1,125 +0,0 @@
|
|||
|
||||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>The MPS Bootstrap — Memory Pool System 1.111.0 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="../_static/mps.css" type="text/css" />
|
||||
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
|
||||
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '../',
|
||||
VERSION: '1.111.0',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="../_static/jquery.js"></script>
|
||||
<script type="text/javascript" src="../_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="../_static/doctools.js"></script>
|
||||
<link rel="copyright" title="Copyright" href="../copyright.html" />
|
||||
<link rel="top" title="Memory Pool System 1.111.0 documentation" href="../index.html" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="related">
|
||||
<h3>Navigation</h3>
|
||||
<ul>
|
||||
<li class="right" style="margin-right: 10px">
|
||||
<a href="../genindex.html" title="General Index"
|
||||
accesskey="I">index</a></li>
|
||||
<li><a href="../index.html">Memory Pool System 1.111.0 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="document">
|
||||
<div class="documentwrapper">
|
||||
<div class="bodywrapper">
|
||||
<div class="body">
|
||||
|
||||
<div class="section" id="the-mps-bootstrap">
|
||||
<span id="design-boot"></span><h1>The MPS Bootstrap<a class="headerlink" href="#the-mps-bootstrap" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="introduction">
|
||||
<span id="design.mps.boot"></span><h2>Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h2>
|
||||
<p>The <a href="#id1"><span class="problematic" id="id2">`Memory Pool System`_</span></a> starts with no memory, but must somehow
|
||||
allocate its own control structures in order to provide memory to the
|
||||
client program. The MPS is freestanding [ref?] and so it can’t get its
|
||||
memory from the C library’s <tt class="docutils literal"><span class="pre">malloc</span></tt>. So how does it get off the
|
||||
ground? It pulls itself up by its own bootstraps. This document
|
||||
describes how.</p>
|
||||
<div class="admonition-note admonition">
|
||||
<p class="first admonition-title">Note</p>
|
||||
<p class="last">This document was written as a prelude to reforming the bootstrap,
|
||||
so it shouldn’t be taken as advocating it as an amazing piece of
|
||||
design.</p>
|
||||
</div>
|
||||
<p>Pretty much the first call to the MPS is to <tt class="docutils literal"><span class="pre">ArenaCreate</span></tt>, which calls the
|
||||
arena class specific <tt class="docutils literal"><span class="pre">init</span></tt> method. That must create an initialized arena,
|
||||
except for the “control pool”, from which many MPS data structures will be
|
||||
allocated.</p>
|
||||
<p>In the case of the VM arena, <tt class="docutils literal"><span class="pre">VMArenaInit</span></tt> creates a VM large enough to hold
|
||||
a <tt class="xref c c-type docutils literal"><span class="pre">VMArenaStruct</span></tt> (which contains the generic <tt class="xref c c-type docutils literal"><span class="pre">ArenaStruct</span></tt>) and maps
|
||||
pages into it. It then calls <tt class="docutils literal"><span class="pre">ArenaInit</span></tt> to initialise the generic part,
|
||||
before filling in the VM-specific part. Having done that, it adds the initial
|
||||
<tt class="docutils literal"><span class="pre">VMChunk</span></tt> – a large area of address space – that will be used to supply
|
||||
memory via <tt class="docutils literal"><span class="pre">ArenaAlloc</span></tt>.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sphinxsidebar">
|
||||
<div class="sphinxsidebarwrapper">
|
||||
<p class="logo"><a href="../index.html">
|
||||
<img class="logo" src="../_static/logo.png" alt="Logo"/>
|
||||
</a></p>
|
||||
<h3><a href="../index.html">Table Of Contents</a></h3>
|
||||
<ul>
|
||||
<li><a class="reference internal" href="#">The MPS Bootstrap</a><ul>
|
||||
<li><a class="reference internal" href="#introduction">Introduction</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<h4>Downloads</h4>
|
||||
|
||||
<p class="topless">
|
||||
<a href="http://www.ravenbrook.com/project/mps/release/1.111.0/">MPS Kit release 1.111.0</a><br>
|
||||
<a href="http://www.ravenbrook.com/project/mps/release/">All MPS Kit releases</a>
|
||||
</p>
|
||||
|
||||
<h4>Issues</h4>
|
||||
|
||||
<p class="topless">
|
||||
<a href="http://www.ravenbrook.com/project/mps/issue/?action=list&view=status%3dopen&display=Job:Priority:Title&sort=Priority">Known issues</a><br>
|
||||
<a href="http://www.ravenbrook.com/project/mps/issue/?action=fixed&release_fixed=1.111.0">Issues fixed in release 1.111.0</a>
|
||||
</p><h4>Contact us</h4>
|
||||
|
||||
<p class="topless"><a href="mailto:mps-questions@ravenbrook.com">mps-questions@ravenbrook.com</a></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="clearer"></div>
|
||||
</div>
|
||||
<div class="related">
|
||||
<h3>Navigation</h3>
|
||||
<ul>
|
||||
<li class="right" style="margin-right: 10px">
|
||||
<a href="../genindex.html" title="General Index"
|
||||
>index</a></li>
|
||||
<li><a href="../index.html">Memory Pool System 1.111.0 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer">
|
||||
© <a href="../copyright.html">Copyright</a> 2013, Ravenbrook Limited.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -54,8 +54,8 @@
|
|||
<div class="bodywrapper">
|
||||
<div class="body">
|
||||
|
||||
<span class="target" id="design-bt"></span><div class="section" id="bit-tables">
|
||||
<span id="index-0"></span><h1>4. Bit tables<a class="headerlink" href="#bit-tables" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="bit-tables">
|
||||
<span id="design-bt"></span><span id="index-0"></span><h1>4. Bit tables<a class="headerlink" href="#bit-tables" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="introduction">
|
||||
<span id="design.mps.bt"></span><h2>4.1. Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h2>
|
||||
<p><span class="target" id="design.mps.bt.intro"></span><a class="mpstag reference internal" href="#design.mps.bt.intro">.intro:</a> This is the design of the Bit Tables module. A Bit Table is a
|
||||
|
|
@ -400,7 +400,7 @@ now return 0 for <tt class="docutils literal"><span class="pre">base</span></tt>
|
|||
otherwise. Meets <a class="reference internal" href="#design.mps.bt.non-req.ops.test.range.same">.non-req.ops.test.range.same</a>.</p>
|
||||
<p><span class="target" id="design.mps.bt.if.find.general"></span><a class="mpstag reference internal" href="#design.mps.bt.if.find.general">.if.find.general:</a> There are four functions (below) to find reset
|
||||
ranges. All the functions have the same prototype (for symmetry):</p>
|
||||
<div class="highlight-c"><div class="highlight"><pre><span class="n">Bool</span> <span class="nf">find</span><span class="p">(</span><span class="n">Index</span> <span class="o">*</span><span class="n">baseReturn</span><span class="p">,</span> <span class="n">Index</span> <span class="o">*</span><span class="n">limitReturn</span><span class="p">,</span>
|
||||
<div class="highlight-c"><div class="highlight"><pre><span class="n">Bool</span> <span class="n">find</span><span class="p">(</span><span class="n">Index</span> <span class="o">*</span><span class="n">baseReturn</span><span class="p">,</span> <span class="n">Index</span> <span class="o">*</span><span class="n">limitReturn</span><span class="p">,</span>
|
||||
<span class="n">BT</span> <span class="n">bt</span><span class="p">,</span>
|
||||
<span class="n">Index</span> <span class="n">searchBase</span><span class="p">,</span> <span class="n">Index</span> <span class="n">searchLimit</span><span class="p">,</span>
|
||||
<span class="n">Count</span> <span class="n">length</span><span class="p">);</span>
|
||||
|
|
|
|||
|
|
@ -54,8 +54,8 @@
|
|||
<div class="bodywrapper">
|
||||
<div class="body">
|
||||
|
||||
<span class="target" id="design-buffer"></span><div class="section" id="allocation-buffers-and-allocation-points">
|
||||
<span id="index-0"></span><h1>5. Allocation buffers and allocation points<a class="headerlink" href="#allocation-buffers-and-allocation-points" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="allocation-buffers-and-allocation-points">
|
||||
<span id="design-buffer"></span><span id="index-0"></span><h1>5. Allocation buffers and allocation points<a class="headerlink" href="#allocation-buffers-and-allocation-points" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="introduction">
|
||||
<span id="design.mps.buffer"></span><h2>5.1. Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h2>
|
||||
<p><span class="target" id="design.mps.buffer.scope"></span><a class="mpstag reference internal" href="#design.mps.buffer.scope">.scope:</a> This document describes the design of allocation buffers
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@
|
|||
<div class="body">
|
||||
|
||||
<div class="section" id="coalescing-block-structure">
|
||||
<span id="design-cbs"></span><h1>2. Coalescing block structure<a class="headerlink" href="#coalescing-block-structure" title="Permalink to this headline">¶</a></h1>
|
||||
<h1>2. Coalescing block structure<a class="headerlink" href="#coalescing-block-structure" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="introduction">
|
||||
<span id="design.mps.cbs"></span><h2>2.1. Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h2>
|
||||
<p><span class="target" id="design.mps.cbs.intro"></span><a class="mpstag reference internal" href="#design.mps.cbs.intro">.intro:</a> This is the design for impl.c.cbs, which implements a data
|
||||
|
|
|
|||
|
|
@ -54,8 +54,8 @@
|
|||
<div class="bodywrapper">
|
||||
<div class="body">
|
||||
|
||||
<span class="target" id="design-check"></span><div class="section" id="checking">
|
||||
<span id="index-0"></span><h1>6. Checking<a class="headerlink" href="#checking" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="checking">
|
||||
<span id="design-check"></span><span id="index-0"></span><h1>6. Checking<a class="headerlink" href="#checking" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="introduction">
|
||||
<span id="design.mps.check"></span><h2>6.1. Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h2>
|
||||
<p><span class="target" id="design.mps.check.intro"></span><a class="mpstag reference internal" href="#design.mps.check.intro">.intro:</a> This documents the design of structure checking within the
|
||||
|
|
|
|||
|
|
@ -54,8 +54,8 @@
|
|||
<div class="bodywrapper">
|
||||
<div class="body">
|
||||
|
||||
<span class="target" id="design-class-interface"></span><div class="section" id="pool-class-interface">
|
||||
<span id="index-0"></span><h1>7. Pool class interface<a class="headerlink" href="#pool-class-interface" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="pool-class-interface">
|
||||
<span id="design-class-interface"></span><span id="index-0"></span><h1>7. Pool class interface<a class="headerlink" href="#pool-class-interface" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="introduction">
|
||||
<span id="design.mps.class-interface"></span><h2>7.1. Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h2>
|
||||
<p><span class="target" id="design.mps.class-interface.intro"></span><a class="mpstag reference internal" href="#design.mps.class-interface.intro">.intro:</a> This document describes the interface and protocols between
|
||||
|
|
|
|||
|
|
@ -54,8 +54,8 @@
|
|||
<div class="bodywrapper">
|
||||
<div class="body">
|
||||
|
||||
<span class="target" id="design-collection"></span><div class="section" id="collection-framework">
|
||||
<span id="index-0"></span><h1>8. Collection framework<a class="headerlink" href="#collection-framework" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="collection-framework">
|
||||
<span id="design-collection"></span><span id="index-0"></span><h1>8. Collection framework<a class="headerlink" href="#collection-framework" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="introduction">
|
||||
<span id="design.mps.collection"></span><h2>8.1. Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h2>
|
||||
<p><span class="target" id="design.mps.collection.intro"></span><a class="mpstag reference internal" href="#design.mps.collection.intro">.intro:</a> This document describes the Collection Framework. It’s a
|
||||
|
|
|
|||
|
|
@ -54,8 +54,8 @@
|
|||
<div class="bodywrapper">
|
||||
<div class="body">
|
||||
|
||||
<span class="target" id="design-config"></span><div class="section" id="mps-configuration">
|
||||
<span id="index-0"></span><h1>3. MPS Configuration<a class="headerlink" href="#mps-configuration" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="mps-configuration">
|
||||
<span id="design-config"></span><span id="index-0"></span><h1>3. MPS Configuration<a class="headerlink" href="#mps-configuration" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="introduction">
|
||||
<span id="design.mps.config"></span><h2>3.1. Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h2>
|
||||
<p><span class="target" id="design.mps.config.intro"></span><a class="mpstag reference internal" href="#design.mps.config.intro">.intro:</a> This document describes how the <a class="reference external" href="http://www.ravenbrook.com/project/mps/">Memory Pool System</a> source code is configured so
|
||||
|
|
@ -440,19 +440,19 @@ possibly their types, depending on the protocol defined</li>
|
|||
configuration parameter. However, the concrete interface may vary.</p>
|
||||
<p>For example, this isn’t allowed, because there is a change in the interface:</p>
|
||||
<div class="highlight-c"><div class="highlight"><pre><span class="cp">#if defined(PROT_FOO)</span>
|
||||
<span class="kt">void</span> <span class="nf">ProtSpong</span><span class="p">(</span><span class="n">Foo</span> <span class="n">foo</span><span class="p">,</span> <span class="n">Bar</span> <span class="n">bar</span><span class="p">);</span>
|
||||
<span class="kt">void</span> <span class="n">ProtSpong</span><span class="p">(</span><span class="n">Foo</span> <span class="n">foo</span><span class="p">,</span> <span class="n">Bar</span> <span class="n">bar</span><span class="p">);</span>
|
||||
<span class="cp">#else</span>
|
||||
<span class="kt">int</span> <span class="nf">ProtSpong</span><span class="p">(</span><span class="n">Bar</span> <span class="n">bar</span><span class="p">,</span> <span class="n">Foo</span> <span class="n">foo</span><span class="p">);</span>
|
||||
<span class="kt">int</span> <span class="n">ProtSpong</span><span class="p">(</span><span class="n">Bar</span> <span class="n">bar</span><span class="p">,</span> <span class="n">Foo</span> <span class="n">foo</span><span class="p">);</span>
|
||||
<span class="cp">#endif</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>This example shows how:</p>
|
||||
<div class="highlight-c"><div class="highlight"><pre><span class="cp">#ifdef PROTECTION</span>
|
||||
<span class="kt">void</span> <span class="nf">ProtSync</span><span class="p">(</span><span class="n">Space</span> <span class="n">space</span><span class="p">);</span>
|
||||
<span class="cm">/* more decls. */</span>
|
||||
<span class="kt">void</span> <span class="n">ProtSync</span><span class="p">(</span><span class="n">Space</span> <span class="n">space</span><span class="p">);</span>
|
||||
<span class="cp">/* more decls. */</span>
|
||||
<span class="cp">#else </span><span class="cm">/* PROTECTION not */</span><span class="cp"></span>
|
||||
<span class="cp">#define ProtSync(space) NOOP</span>
|
||||
<span class="cm">/* more decls. */</span>
|
||||
<span class="cp">/* more decls. */</span>
|
||||
<span class="cp">#endif </span><span class="cm">/* PROTECTION */</span><span class="cp"></span>
|
||||
</pre></div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -54,8 +54,8 @@
|
|||
<div class="bodywrapper">
|
||||
<div class="body">
|
||||
|
||||
<span class="target" id="design-critical-path"></span><div class="section" id="the-critical-path-through-the-mps">
|
||||
<span id="index-0"></span><h1>4. The critical path through the MPS<a class="headerlink" href="#the-critical-path-through-the-mps" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="the-critical-path-through-the-mps">
|
||||
<span id="design-critical-path"></span><span id="index-0"></span><h1>4. The critical path through the MPS<a class="headerlink" href="#the-critical-path-through-the-mps" title="Permalink to this headline">¶</a></h1>
|
||||
<blockquote>
|
||||
<div>single: critical path
|
||||
single: path; critical
|
||||
|
|
@ -181,18 +181,18 @@ registered with one of the <tt class="xref c c-func docutils literal"><span clas
|
|||
<p>Here is an example of part of a format scanner for scanning contiguous
|
||||
runs of pointers, from <a class="reference external" href="../code/fmtdy.c">fmtdy.c</a>, the scanner for the <a class="reference external" href="http://opendylan.org/">Open Dylan</a>
|
||||
runtime:</p>
|
||||
<div class="highlight-c"><div class="highlight"><pre><span class="k">static</span> <span class="kt">mps_res_t</span> <span class="nf">dylan_scan_contig</span><span class="p">(</span><span class="kt">mps_ss_t</span> <span class="n">mps_ss</span><span class="p">,</span>
|
||||
<span class="kt">mps_addr_t</span> <span class="o">*</span><span class="n">base</span><span class="p">,</span> <span class="kt">mps_addr_t</span> <span class="o">*</span><span class="n">limit</span><span class="p">)</span>
|
||||
<div class="highlight-c"><div class="highlight"><pre><span class="k">static</span> <span class="n">mps_res_t</span> <span class="nf">dylan_scan_contig</span><span class="p">(</span><span class="n">mps_ss_t</span> <span class="n">mps_ss</span><span class="p">,</span>
|
||||
<span class="n">mps_addr_t</span> <span class="o">*</span><span class="n">base</span><span class="p">,</span> <span class="n">mps_addr_t</span> <span class="o">*</span><span class="n">limit</span><span class="p">)</span>
|
||||
<span class="p">{</span>
|
||||
<span class="kt">mps_res_t</span> <span class="n">res</span><span class="p">;</span>
|
||||
<span class="kt">mps_addr_t</span> <span class="o">*</span><span class="n">p</span><span class="p">;</span> <span class="cm">/* reference cursor */</span>
|
||||
<span class="kt">mps_addr_t</span> <span class="n">r</span><span class="p">;</span> <span class="cm">/* reference to be fixed */</span>
|
||||
<span class="n">mps_res_t</span> <span class="n">res</span><span class="p">;</span>
|
||||
<span class="n">mps_addr_t</span> <span class="o">*</span><span class="n">p</span><span class="p">;</span> <span class="cm">/* reference cursor */</span>
|
||||
<span class="n">mps_addr_t</span> <span class="n">r</span><span class="p">;</span> <span class="cm">/* reference to be fixed */</span>
|
||||
|
||||
<span class="n">MPS_SCAN_BEGIN</span><span class="p">(</span><span class="n">mps_ss</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="n">p</span> <span class="o">=</span> <span class="n">base</span><span class="p">;</span>
|
||||
<span class="nl">loop:</span> <span class="k">if</span><span class="p">(</span><span class="n">p</span> <span class="o">>=</span> <span class="n">limit</span><span class="p">)</span> <span class="k">goto</span> <span class="n">out</span><span class="p">;</span>
|
||||
<span class="n">r</span> <span class="o">=</span> <span class="o">*</span><span class="n">p</span><span class="o">++</span><span class="p">;</span>
|
||||
<span class="k">if</span><span class="p">(((</span><span class="kt">mps_word_t</span><span class="p">)</span><span class="n">r</span><span class="o">&</span><span class="mi">3</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="cm">/* pointers tagged with 0 */</span>
|
||||
<span class="k">if</span><span class="p">(((</span><span class="n">mps_word_t</span><span class="p">)</span><span class="n">r</span><span class="o">&</span><span class="mi">3</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="cm">/* pointers tagged with 0 */</span>
|
||||
<span class="k">goto</span> <span class="n">loop</span><span class="p">;</span> <span class="cm">/* not a pointer */</span>
|
||||
<span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">MPS_FIX1</span><span class="p">(</span><span class="n">mps_ss</span><span class="p">,</span> <span class="n">r</span><span class="p">))</span> <span class="k">goto</span> <span class="n">loop</span><span class="p">;</span>
|
||||
<span class="n">res</span> <span class="o">=</span> <span class="n">MPS_FIX2</span><span class="p">(</span><span class="n">mps_ss</span><span class="p">,</span> <span class="n">p</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
|
||||
|
|
|
|||
|
|
@ -54,8 +54,8 @@
|
|||
<div class="bodywrapper">
|
||||
<div class="body">
|
||||
|
||||
<span class="target" id="design-diag"></span><div class="section" id="diagnostic-feedback">
|
||||
<span id="index-0"></span><h1>9. Diagnostic feedback<a class="headerlink" href="#diagnostic-feedback" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="diagnostic-feedback">
|
||||
<span id="design-diag"></span><span id="index-0"></span><h1>9. Diagnostic feedback<a class="headerlink" href="#diagnostic-feedback" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="introduction">
|
||||
<span id="design.mps.diag"></span><h2>9.1. Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h2>
|
||||
<p><span class="target" id="design.mps.diag.intro"></span><a class="mpstag reference internal" href="#design.mps.diag.intro">.intro:</a> This document describes how to use the diagnostic feedback
|
||||
|
|
@ -99,33 +99,34 @@ places where you want to inspect data structures (or wait for the
|
|||
debugger to be entered via an <tt class="xref c c-func docutils literal"><span class="pre">abort()</span></tt> call or unhandled
|
||||
segmentation fault). Then at the debugger command prompt, run
|
||||
<tt class="xref c c-func docutils literal"><span class="pre">Describe()</span></tt> commands of your choice. For example:</p>
|
||||
<div class="highlight-c"><pre>(gdb) run
|
||||
Starting program: mv2test
|
||||
Reading symbols for shared libraries +............................. done
|
||||
cbs.c:94: MPS ASSERTION FAILED: !cbs->inCBS
|
||||
<div class="highlight-c"><div class="highlight"><pre><span class="p">(</span><span class="n">gdb</span><span class="p">)</span> <span class="n">run</span>
|
||||
<span class="n">Starting</span> <span class="n">program</span><span class="o">:</span> <span class="n">mv2test</span>
|
||||
<span class="n">Reading</span> <span class="n">symbols</span> <span class="k">for</span> <span class="n">shared</span> <span class="n">libraries</span> <span class="o">+</span><span class="p">.............................</span> <span class="n">done</span>
|
||||
<span class="n">cbs</span><span class="p">.</span><span class="n">c</span><span class="o">:</span><span class="mi">94</span><span class="o">:</span> <span class="n">MPS</span> <span class="n">ASSERTION</span> <span class="n">FAILED</span><span class="o">:</span> <span class="o">!</span><span class="n">cbs</span><span class="o">-></span><span class="n">inCBS</span>
|
||||
|
||||
Program received signal SIGABRT, Aborted.
|
||||
0x00007fff83e42d46 in __kill ()
|
||||
(gdb) frame 12
|
||||
#12 0x000000010000b1fc in MVTFree (pool=0x103ffe160, base=0x101dfd000, size=5024) at poolmv2.c:711
|
||||
711 Res res = CBSInsert(MVTCBS(mvt), base, limit);
|
||||
(gdb) p MVTDescribe(mvt, mps_lib_get_stdout())
|
||||
MVT 0000000103FFE160
|
||||
{
|
||||
minSize: 8
|
||||
meanSize: 42
|
||||
maxSize: 8192
|
||||
fragLimit: 30
|
||||
reuseSize: 16384
|
||||
fillSize: 8192
|
||||
availLimit: 1110835
|
||||
abqOverflow: FALSE
|
||||
splinter: TRUE
|
||||
splinterSeg: 0000000103FEE780
|
||||
splinterBase: 0000000101D7ABB8
|
||||
splinterLimit: 0000000101D7B000
|
||||
# ... etc ...
|
||||
}</pre>
|
||||
<span class="n">Program</span> <span class="n">received</span> <span class="n">signal</span> <span class="n">SIGABRT</span><span class="p">,</span> <span class="n">Aborted</span><span class="p">.</span>
|
||||
<span class="mh">0x00007fff83e42d46</span> <span class="n">in</span> <span class="n">__kill</span> <span class="p">()</span>
|
||||
<span class="p">(</span><span class="n">gdb</span><span class="p">)</span> <span class="n">frame</span> <span class="mi">12</span>
|
||||
<span class="cp">#12 0x000000010000b1fc in MVTFree (pool=0x103ffe160, base=0x101dfd000, size=5024) at poolmv2.c:711</span>
|
||||
<span class="mi">711</span> <span class="n">Res</span> <span class="n">res</span> <span class="o">=</span> <span class="n">CBSInsert</span><span class="p">(</span><span class="n">MVTCBS</span><span class="p">(</span><span class="n">mvt</span><span class="p">),</span> <span class="n">base</span><span class="p">,</span> <span class="n">limit</span><span class="p">);</span>
|
||||
<span class="p">(</span><span class="n">gdb</span><span class="p">)</span> <span class="n">p</span> <span class="n">MVTDescribe</span><span class="p">(</span><span class="n">mvt</span><span class="p">,</span> <span class="n">mps_lib_get_stdout</span><span class="p">())</span>
|
||||
<span class="n">MVT</span> <span class="mf">0000000103FF</span><span class="n">E160</span>
|
||||
<span class="p">{</span>
|
||||
<span class="nl">minSize:</span> <span class="mi">8</span>
|
||||
<span class="nl">meanSize:</span> <span class="mi">42</span>
|
||||
<span class="nl">maxSize:</span> <span class="mi">8192</span>
|
||||
<span class="nl">fragLimit:</span> <span class="mi">30</span>
|
||||
<span class="nl">reuseSize:</span> <span class="mi">16384</span>
|
||||
<span class="nl">fillSize:</span> <span class="mi">8192</span>
|
||||
<span class="nl">availLimit:</span> <span class="mi">1110835</span>
|
||||
<span class="nl">abqOverflow:</span> <span class="n">FALSE</span>
|
||||
<span class="nl">splinter:</span> <span class="n">TRUE</span>
|
||||
<span class="nl">splinterSeg:</span> <span class="mf">0000000103F</span><span class="n">EE780</span>
|
||||
<span class="nl">splinterBase:</span> <span class="mo">0000000101</span><span class="n">D7ABB8</span>
|
||||
<span class="nl">splinterLimit:</span> <span class="mo">0000000101</span><span class="n">D7B000</span>
|
||||
<span class="cp"> # ... etc ...</span>
|
||||
<span class="p">}</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</li>
|
||||
</ol>
|
||||
|
|
|
|||
|
|
@ -54,8 +54,8 @@
|
|||
<div class="bodywrapper">
|
||||
<div class="body">
|
||||
|
||||
<span class="target" id="design-finalize"></span><div class="section" id="finalization">
|
||||
<span id="index-0"></span><h1>10. Finalization<a class="headerlink" href="#finalization" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="finalization">
|
||||
<span id="design-finalize"></span><span id="index-0"></span><h1>10. Finalization<a class="headerlink" href="#finalization" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="overview">
|
||||
<span id="design.mps.finalize"></span><h2>10.1. Overview<a class="headerlink" href="#overview" title="Permalink to this headline">¶</a></h2>
|
||||
<p><span class="target" id="design.mps.finalize.overview"></span><a class="mpstag reference internal" href="#design.mps.finalize.overview">.overview:</a> Finalization is implemented internally using the
|
||||
|
|
|
|||
|
|
@ -54,8 +54,8 @@
|
|||
<div class="bodywrapper">
|
||||
<div class="body">
|
||||
|
||||
<span class="target" id="design-fix"></span><div class="section" id="the-generic-fix-function">
|
||||
<span id="index-0"></span><h1>11. The generic fix function<a class="headerlink" href="#the-generic-fix-function" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="the-generic-fix-function">
|
||||
<span id="design-fix"></span><span id="index-0"></span><h1>11. The generic fix function<a class="headerlink" href="#the-generic-fix-function" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="introduction">
|
||||
<span id="design.mps.fix"></span><h2>11.1. Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h2>
|
||||
<p><span class="target" id="design.mps.fix.intro"></span><a class="mpstag reference internal" href="#design.mps.fix.intro">.intro:</a> Fix is the interface through which the existence of
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@
|
|||
<div class="body">
|
||||
|
||||
<div class="section" id="free-list-allocator">
|
||||
<span id="design-freelist"></span><h1>5. Free list allocator<a class="headerlink" href="#free-list-allocator" title="Permalink to this headline">¶</a></h1>
|
||||
<h1>5. Free list allocator<a class="headerlink" href="#free-list-allocator" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="introduction">
|
||||
<span id="design.mps.freelist"></span><h2>5.1. Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h2>
|
||||
<p><span class="target" id="design.mps.freelist.intro"></span><a class="mpstag reference internal" href="#design.mps.freelist.intro">.intro:</a> This document describes the free list allocator for the
|
||||
|
|
|
|||
|
|
@ -54,8 +54,8 @@
|
|||
<div class="bodywrapper">
|
||||
<div class="body">
|
||||
|
||||
<span class="target" id="design-guide-hex-trans"></span><div class="section" id="transliterating-the-alphabet-into-hexadecimal">
|
||||
<span id="index-0"></span><h1>6. Transliterating the alphabet into hexadecimal<a class="headerlink" href="#transliterating-the-alphabet-into-hexadecimal" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="transliterating-the-alphabet-into-hexadecimal">
|
||||
<span id="design-guide-hex-trans"></span><span id="index-0"></span><h1>6. Transliterating the alphabet into hexadecimal<a class="headerlink" href="#transliterating-the-alphabet-into-hexadecimal" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="introduction">
|
||||
<span id="guide.hex.trans"></span><h2>6.1. Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h2>
|
||||
<p><span class="target" id="guide.hex.trans.scope"></span><a class="mpstag reference internal" href="#guide.hex.trans.scope">.scope:</a> This document explains how to represent the alphabet as
|
||||
|
|
|
|||
|
|
@ -54,8 +54,8 @@
|
|||
<div class="bodywrapper">
|
||||
<div class="body">
|
||||
|
||||
<span class="target" id="design-guide-impl-c-format"></span><div class="section" id="c-style-formatting">
|
||||
<span id="index-0"></span><h1>7. C Style – formatting<a class="headerlink" href="#c-style-formatting" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="c-style-formatting">
|
||||
<span id="design-guide-impl-c-format"></span><span id="index-0"></span><h1>7. C Style – formatting<a class="headerlink" href="#c-style-formatting" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="introduction">
|
||||
<span id="guide.impl.c.format"></span><h2>7.1. Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h2>
|
||||
<p><span class="target" id="guide.impl.c.format.scope"></span><a class="mpstag reference internal" href="#guide.impl.c.format.scope">.scope:</a> This document describes the Ravenbrook conventions for the
|
||||
|
|
|
|||
|
|
@ -54,8 +54,8 @@
|
|||
<div class="bodywrapper">
|
||||
<div class="body">
|
||||
|
||||
<span class="target" id="design-interface-c"></span><div class="section" id="c-interface-design">
|
||||
<span id="index-0"></span><h1>12. C interface design<a class="headerlink" href="#c-interface-design" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="c-interface-design">
|
||||
<span id="design-interface-c"></span><span id="index-0"></span><h1>12. C interface design<a class="headerlink" href="#c-interface-design" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="introduction">
|
||||
<span id="design.mps.interface.c"></span><h2>12.1. Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h2>
|
||||
<p><span class="target" id="design.mps.interface.c.scope"></span><a class="mpstag reference internal" href="#design.mps.interface.c.scope">.scope:</a> This document is the design for the Memory Pool System
|
||||
|
|
@ -175,19 +175,19 @@ as pointer to function) are declared a prototype should be used and
|
|||
the parameters to the function should not be named. This includes the
|
||||
case where you are declaring the prototype for an interface function.</p>
|
||||
<p><span class="target" id="design.mps.interface.c.type.fun.example"></span><a class="mpstag reference internal" href="#design.mps.interface.c.type.fun.example">.type.fun.example:</a> So use:</p>
|
||||
<div class="highlight-c"><div class="highlight"><pre><span class="k">extern</span> <span class="kt">mps_res_t</span> <span class="nf">mps_alloc</span><span class="p">(</span><span class="kt">mps_addr_t</span> <span class="o">*</span><span class="p">,</span> <span class="kt">mps_pool_t</span><span class="p">,</span> <span class="kt">size_t</span><span class="p">,</span> <span class="p">...);</span>
|
||||
<div class="highlight-c"><div class="highlight"><pre><span class="k">extern</span> <span class="n">mps_res_t</span> <span class="n">mps_alloc</span><span class="p">(</span><span class="n">mps_addr_t</span> <span class="o">*</span><span class="p">,</span> <span class="n">mps_pool_t</span><span class="p">,</span> <span class="kt">size_t</span><span class="p">,</span> <span class="p">...);</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>rather than:</p>
|
||||
<div class="highlight-c"><div class="highlight"><pre><span class="k">extern</span> <span class="kt">mps_res_t</span> <span class="nf">mps_alloc</span><span class="p">(</span><span class="kt">mps_addr_t</span> <span class="o">*</span><span class="n">addr_return</span><span class="p">,</span> <span class="kt">mps_pool_t</span> <span class="n">pool</span> <span class="p">,</span> <span class="kt">size_t</span> <span class="n">size</span><span class="p">,</span> <span class="p">...);</span>
|
||||
<div class="highlight-c"><div class="highlight"><pre><span class="k">extern</span> <span class="n">mps_res_t</span> <span class="n">mps_alloc</span><span class="p">(</span><span class="n">mps_addr_t</span> <span class="o">*</span><span class="n">addr_return</span><span class="p">,</span> <span class="n">mps_pool_t</span> <span class="n">pool</span> <span class="p">,</span> <span class="kt">size_t</span> <span class="n">size</span><span class="p">,</span> <span class="p">...);</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>and:</p>
|
||||
<div class="highlight-c"><div class="highlight"><pre><span class="k">typedef</span> <span class="nf">mps_addr_t</span> <span class="p">(</span><span class="o">*</span><span class="kt">mps_fmt_class_t</span><span class="p">)(</span><span class="kt">mps_addr_t</span><span class="p">);</span>
|
||||
<div class="highlight-c"><div class="highlight"><pre><span class="k">typedef</span> <span class="n">mps_addr_t</span> <span class="p">(</span><span class="o">*</span><span class="n">mps_fmt_class_t</span><span class="p">)(</span><span class="n">mps_addr_t</span><span class="p">);</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>rather than:</p>
|
||||
<div class="highlight-c"><div class="highlight"><pre><span class="k">typedef</span> <span class="nf">mps_addr_t</span> <span class="p">(</span><span class="o">*</span><span class="kt">mps_fmt_class_t</span><span class="p">)(</span><span class="kt">mps_addr_t</span> <span class="n">object</span><span class="p">);</span>
|
||||
<div class="highlight-c"><div class="highlight"><pre><span class="k">typedef</span> <span class="n">mps_addr_t</span> <span class="p">(</span><span class="o">*</span><span class="n">mps_fmt_class_t</span><span class="p">)(</span><span class="n">mps_addr_t</span> <span class="n">object</span><span class="p">);</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>See guide.impl.c.misc.prototype.parameters.</p>
|
||||
|
|
|
|||
|
|
@ -54,8 +54,8 @@
|
|||
<div class="bodywrapper">
|
||||
<div class="body">
|
||||
|
||||
<span class="target" id="design-io"></span><div class="section" id="i-o-subsystem">
|
||||
<span id="index-0"></span><h1>13. I/O subsystem<a class="headerlink" href="#i-o-subsystem" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="i-o-subsystem">
|
||||
<span id="design-io"></span><span id="index-0"></span><h1>13. I/O subsystem<a class="headerlink" href="#i-o-subsystem" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="introduction">
|
||||
<span id="design.mps.io"></span><h2>13.1. Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h2>
|
||||
<p><span class="target" id="design.mps.io.intro"></span><a class="mpstag reference internal" href="#design.mps.io.intro">.intro:</a> This document is the design of the MPS I/O Subsystem, a
|
||||
|
|
@ -190,7 +190,7 @@ liberty to define this structure.</p>
|
|||
several different types. It will probably choose to send them to
|
||||
different destinations based on their type: telemetry to the
|
||||
measurement tool, debugging output to the debugger, etc.</p>
|
||||
<div class="highlight-c"><div class="highlight"><pre><span class="k">typedef</span> <span class="kt">int</span> <span class="kt">mps_io_type_t</span><span class="p">;</span>
|
||||
<div class="highlight-c"><div class="highlight"><pre><span class="k">typedef</span> <span class="kt">int</span> <span class="n">mps_io_type_t</span><span class="p">;</span>
|
||||
<span class="k">enum</span> <span class="p">{</span>
|
||||
<span class="n">MPS_IO_TYPE_TELEMETRY</span><span class="p">,</span>
|
||||
<span class="n">MPS_IO_TYPE_DEBUG</span>
|
||||
|
|
@ -293,11 +293,11 @@ just a few old messages. What can you do with it?</p>
|
|||
<span class="k">struct</span> <span class="n">sockaddr_in</span> <span class="n">debugging</span><span class="p">;</span>
|
||||
<span class="p">}</span> <span class="n">mps_io_s</span><span class="p">;</span>
|
||||
|
||||
<span class="k">static</span> <span class="kt">mps_bool_t</span> <span class="n">inited</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
|
||||
<span class="k">static</span> <span class="n">mps_bool_t</span> <span class="n">inited</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
|
||||
<span class="k">static</span> <span class="n">mps_io_s</span> <span class="n">state</span><span class="p">;</span>
|
||||
|
||||
|
||||
<span class="kt">mps_res_t</span> <span class="nf">mps_io_create</span><span class="p">(</span><span class="kt">mps_io_t</span> <span class="o">*</span><span class="n">mps_io_o</span><span class="p">)</span>
|
||||
<span class="n">mps_res_t</span> <span class="nf">mps_io_create</span><span class="p">(</span><span class="n">mps_io_t</span> <span class="o">*</span><span class="n">mps_io_o</span><span class="p">)</span>
|
||||
<span class="p">{</span>
|
||||
<span class="kt">int</span> <span class="n">sock</span><span class="p">,</span> <span class="n">r</span><span class="p">;</span>
|
||||
|
||||
|
|
@ -329,7 +329,7 @@ just a few old messages. What can you do with it?</p>
|
|||
<span class="p">}</span>
|
||||
|
||||
|
||||
<span class="kt">void</span> <span class="nf">mps_io_destroy</span><span class="p">(</span><span class="kt">mps_io_t</span> <span class="n">mps_io</span><span class="p">)</span>
|
||||
<span class="kt">void</span> <span class="nf">mps_io_destroy</span><span class="p">(</span><span class="n">mps_io_t</span> <span class="n">mps_io</span><span class="p">)</span>
|
||||
<span class="p">{</span>
|
||||
<span class="n">assert</span><span class="p">(</span><span class="n">mps_io</span> <span class="o">==</span> <span class="o">&</span><span class="n">state</span><span class="p">);</span>
|
||||
<span class="n">assert</span><span class="p">(</span><span class="n">inited</span><span class="p">);</span>
|
||||
|
|
@ -340,7 +340,7 @@ just a few old messages. What can you do with it?</p>
|
|||
<span class="p">}</span>
|
||||
|
||||
|
||||
<span class="kt">mps_res_t</span> <span class="nf">mps_io_send</span><span class="p">(</span><span class="kt">mps_io_t</span> <span class="n">mps_io</span><span class="p">,</span> <span class="kt">mps_type_t</span> <span class="n">type</span><span class="p">,</span>
|
||||
<span class="n">mps_res_t</span> <span class="nf">mps_io_send</span><span class="p">(</span><span class="n">mps_io_t</span> <span class="n">mps_io</span><span class="p">,</span> <span class="n">mps_type_t</span> <span class="n">type</span><span class="p">,</span>
|
||||
<span class="kt">void</span> <span class="o">*</span><span class="n">message</span><span class="p">,</span> <span class="kt">size_t</span> <span class="n">size</span><span class="p">)</span>
|
||||
<span class="p">{</span>
|
||||
<span class="k">struct</span> <span class="n">sockaddr</span> <span class="o">*</span><span class="n">toaddr</span><span class="p">;</span>
|
||||
|
|
@ -368,7 +368,7 @@ just a few old messages. What can you do with it?</p>
|
|||
<span class="p">}</span>
|
||||
|
||||
|
||||
<span class="kt">mps_res_t</span> <span class="nf">mps_io_receive</span><span class="p">(</span><span class="kt">mps_io_t</span> <span class="n">mps_io</span><span class="p">,</span>
|
||||
<span class="n">mps_res_t</span> <span class="nf">mps_io_receive</span><span class="p">(</span><span class="n">mps_io_t</span> <span class="n">mps_io</span><span class="p">,</span>
|
||||
<span class="kt">void</span> <span class="o">**</span><span class="n">message_o</span><span class="p">,</span> <span class="kt">size_t</span> <span class="o">**</span><span class="n">size_o</span><span class="p">)</span>
|
||||
<span class="p">{</span>
|
||||
<span class="kt">int</span> <span class="n">r</span><span class="p">;</span>
|
||||
|
|
|
|||
|
|
@ -54,8 +54,8 @@
|
|||
<div class="bodywrapper">
|
||||
<div class="body">
|
||||
|
||||
<span class="target" id="design-keyword-arguments"></span><div class="section" id="keyword-arguments-in-the-mps">
|
||||
<span id="index-0"></span><h1>8. Keyword arguments in the MPS<a class="headerlink" href="#keyword-arguments-in-the-mps" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="keyword-arguments-in-the-mps">
|
||||
<span id="design-keyword-arguments"></span><span id="index-0"></span><h1>8. Keyword arguments in the MPS<a class="headerlink" href="#keyword-arguments-in-the-mps" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="introduction">
|
||||
<h2>8.1. Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h2>
|
||||
<p>Up to version 1.111, the <a class="reference external" href="http://www.ravenbrook.com/project/mps/">Memory Pool System</a> used varags to pass arguments
|
||||
|
|
@ -70,9 +70,9 @@ parameters.</p>
|
|||
<h2>8.2. Overview<a class="headerlink" href="#overview" title="Permalink to this headline">¶</a></h2>
|
||||
<p>The basic design is not specific to the MPS. The keyword argument list is
|
||||
passed as an array of argument structures which look like this:</p>
|
||||
<div class="highlight-c"><div class="highlight"><pre><span class="k">typedef</span> <span class="k">struct</span> <span class="n">mps_key_s</span> <span class="o">*</span><span class="kt">mps_key_t</span><span class="p">;</span>
|
||||
<div class="highlight-c"><div class="highlight"><pre><span class="k">typedef</span> <span class="k">struct</span> <span class="n">mps_key_s</span> <span class="o">*</span><span class="n">mps_key_t</span><span class="p">;</span>
|
||||
<span class="k">typedef</span> <span class="k">struct</span> <span class="n">mps_arg_s</span> <span class="p">{</span>
|
||||
<span class="kt">mps_key_t</span> <span class="n">key</span><span class="p">;</span>
|
||||
<span class="n">mps_key_t</span> <span class="n">key</span><span class="p">;</span>
|
||||
<span class="k">union</span> <span class="p">{</span>
|
||||
<span class="kt">int</span> <span class="n">i</span><span class="p">;</span>
|
||||
<span class="kt">char</span> <span class="n">c</span><span class="p">;</span>
|
||||
|
|
@ -127,7 +127,7 @@ a checking method for the argument, like this:</p>
|
|||
<span class="k">typedef</span> <span class="k">struct</span> <span class="n">mps_key_s</span> <span class="p">{</span>
|
||||
<span class="n">Sig</span> <span class="n">sig</span><span class="p">;</span> <span class="cm">/* Always KeySig */</span>
|
||||
<span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">name</span><span class="p">;</span>
|
||||
<span class="n">Bool</span> <span class="nf">check</span><span class="p">(</span><span class="n">Arg</span> <span class="n">arg</span><span class="p">);</span>
|
||||
<span class="n">Bool</span> <span class="n">check</span><span class="p">(</span><span class="n">Arg</span> <span class="n">arg</span><span class="p">);</span>
|
||||
<span class="p">}</span> <span class="n">KeyStruct</span><span class="p">;</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue