diff --git a/mps/code/comm.gmk b/mps/code/comm.gmk index 65c88abc9cf..ca2d40cce08 100644 --- a/mps/code/comm.gmk +++ b/mps/code/comm.gmk @@ -187,6 +187,7 @@ MPMCOMMON = \ mpm.c \ mpsi.c \ nailboard.c \ + node.c \ policy.c \ pool.c \ poolabs.c \ diff --git a/mps/code/commpre.nmk b/mps/code/commpre.nmk index c428e909fa9..5f25356494a 100644 --- a/mps/code/commpre.nmk +++ b/mps/code/commpre.nmk @@ -147,6 +147,7 @@ MPMCOMMON=\ [mpm] \ [mpsi] \ [nailboard] \ + [node] \ [policy] \ [pool] \ [poolabs] \ diff --git a/mps/code/mpmst.h b/mps/code/mpmst.h index 5d583a3e213..c1c1fc98ff1 100644 --- a/mps/code/mpmst.h +++ b/mps/code/mpmst.h @@ -240,6 +240,28 @@ typedef struct SegClassStruct { } SegClassStruct; +/* RangeStruct -- address range + * + * See design.mps.range, range.h, range.c. + */ + +typedef struct RangeStruct { + Addr base; + Addr limit; +} RangeStruct; + + +/* NodeStruct -- address range in a tree + * + * See node.h, node.c. + */ + +typedef struct NodeStruct { + TreeStruct treeStruct; + RangeStruct rangeStruct; +} NodeStruct; + + /* SegStruct -- segment structure * * .seg: Segments are the basic units of protection and tracer activity diff --git a/mps/code/mpmtypes.h b/mps/code/mpmtypes.h index f001038bc9f..49d22a44a52 100644 --- a/mps/code/mpmtypes.h +++ b/mps/code/mpmtypes.h @@ -109,6 +109,7 @@ typedef struct AllocPatternStruct *AllocPattern; typedef struct AllocFrameStruct *AllocFrame; /* */ typedef struct StackContextStruct *StackContext; typedef struct RangeStruct *Range; /* */ +typedef struct NodeStruct *Node; typedef struct LandStruct *Land; /* */ typedef struct LandClassStruct *LandClass; /* */ typedef unsigned FindDelete; /* */ diff --git a/mps/code/node.c b/mps/code/node.c new file mode 100644 index 00000000000..339ace62a54 --- /dev/null +++ b/mps/code/node.c @@ -0,0 +1,78 @@ +/* node.c -- binary trees of address ranges + * + * $Id$ + * Copyright (C) 2016 Ravenbrook Limited. See end of file for license. + */ + +#include "node.h" +#include "tree.h" +#include "range.h" +#include "mpm.h" + + +void NodeInit(Node node, Addr base, Addr limit) +{ + AVER(node != NULL); + TreeInit(NodeTree(node)); + RangeInit(NodeRange(node), base, limit); + AVERT(Node, node); +} + + +Bool NodeCheck(Node node) +{ + CHECKL(node != NULL); + CHECKD_NOSIG(Tree, NodeTree(node)); + CHECKD_NOSIG(Range, NodeRange(node)); + return TRUE; +} + + +void NodeFinish(Node node) +{ + AVERT(Node, node); + TreeFinish(NodeTree(node)); + RangeFinish(NodeRange(node)); +} + + +/* C. COPYRIGHT AND LICENSE + * + * Copyright (C) 2013 Ravenbrook Limited . + * All rights reserved. This is an open source license. Contact + * Ravenbrook for commercial licensing options. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Redistributions in any form must be accompanied by information on how + * to obtain complete source code for this software and any accompanying + * software that uses this software. The source code must either be + * included in the distribution or be available for no more than the cost + * of distribution plus a nominal fee, and must be freely redistributable + * under reasonable conditions. For an executable file, complete source + * code means the source code for all modules it contains. It does not + * include source code for modules or files that typically accompany the + * major components of the operating system on which the executable file + * runs. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + * PURPOSE, OR NON-INFRINGEMENT, ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ diff --git a/mps/code/node.h b/mps/code/node.h new file mode 100644 index 00000000000..8409d811498 --- /dev/null +++ b/mps/code/node.h @@ -0,0 +1,62 @@ +/* node.c -- binary trees of address ranges + * + * $Id$ + * Copyright (C) 2016 Ravenbrook Limited. See end of file for license. + */ + +#ifndef node_h +#define node_h + +#include "mpmtypes.h" + +#define NodeTree(node) (&(node)->treeStruct) +#define NodeRange(node) (&(node)->rangeStruct) +#define NodeOfTree(tree) PARENT(NodeStruct, treeStruct, tree) +#define NodeOfRange(range) PARENT(NodeStruct, rangeStruct, range) + +extern void NodeInit(Node node, Addr base, Addr limit); +extern Bool NodeCheck(Node node); +extern void NodeFinish(Node node); + +#endif /* node_h */ + +/* C. COPYRIGHT AND LICENSE + * + * Copyright (C) 2013 Ravenbrook Limited . + * All rights reserved. This is an open source license. Contact + * Ravenbrook for commercial licensing options. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Redistributions in any form must be accompanied by information on how + * to obtain complete source code for this software and any accompanying + * software that uses this software. The source code must either be + * included in the distribution or be available for no more than the cost + * of distribution plus a nominal fee, and must be freely redistributable + * under reasonable conditions. For an executable file, complete source + * code means the source code for all modules it contains. It does not + * include source code for modules or files that typically accompany the + * major components of the operating system on which the executable file + * runs. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + * PURPOSE, OR NON-INFRINGEMENT, ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */