1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-04-13 01:32:21 -07:00

Implementing fmt roots

Copied from Perforce
 Change: 15236
 ServerID: perforce.ravenbrook.com
This commit is contained in:
Richard Brooksby 1996-02-09 15:47:08 +00:00
parent c6a4b514ea
commit 6901cb57f2
2 changed files with 49 additions and 20 deletions

View file

@ -1,6 +1,6 @@
/* impl.c.mpsi: MEMORY POOL SYSTEM INTERFACE LAYER
*
* $HopeName$
* $HopeName: MMsrc!mpsi.c(trunk.5) $
* Copyright (C) 1996 Harlequin Group, all rights reserved.
*
* .thread-safety: Most calls through this interface lock the space
@ -25,7 +25,7 @@
#include <stdarg.h>
#include <stddef.h>
SRCID("$HopeName$");
SRCID("$HopeName: MMsrc!mpsi.c(trunk.5) $");
/* Check consistency of interface mappings. */
@ -354,6 +354,7 @@ mps_res_t mps_root_create_table(mps_root_t *mps_root_o,
/* Note, size is the length of the array at base, not */
/* the size in bytes. However, RootCreateTable expects */
/* base and limit pointers. Be careful. */
/* The root mode is ignored. */
return RootCreateTable(rootReturn, space, rank,
(Addr *)base, (Addr *)base + size);
}
@ -366,8 +367,19 @@ mps_res_t mps_root_create_fmt(mps_root_t *mps_root_o,
mps_addr_t base,
mps_addr_t limit)
{
NOTREACHED;
return MPS_RES_UNIMPL;
Root *rootReturn = (Root *)mps_root_o;
Space space = (Space)mps_space;
RefRank rank = (RefRank)mps_rank;
FormatScanMethod scan = (FormatScanMethod)mps_fmt_scan;
AVER(mps_root_o != NULL);
AVER(ISVALID(Space, space));
AVER(scan != NULL);
AVER(base != NULL);
AVER(base < limit);
/* The root mode is ignored. */
return RootCreateFmt(rootReturn, space, rank, scan,
(Addr)base, (Addr)limit);
}
mps_res_t mps_root_create_reg(mps_root_t *mps_root_o,

View file

@ -2,7 +2,7 @@
*
* ROOT IMPLEMENTATION
*
* $HopeName: !root.c(trunk.8) $
* $HopeName: MMsrc!root.c(trunk.9) $
*
* Copyright (C) 1995 Harlequin Group, all rights reserved
*
@ -20,13 +20,10 @@
#include "trace.h"
#include "space.h"
SRCID("$HopeName");
SRCID("$HopeName$");
static SigStruct RootSigStruct;
Bool RootIsValid(Root root, ValidationType validParam)
{
AVER(root != NULL);
@ -34,8 +31,6 @@ Bool RootIsValid(Root root, ValidationType validParam)
AVER(root->sig == &RootSigStruct);
AVER(ISVALIDNESTED(DequeNode, &root->spaceDeque));
AVER(ISVALIDNESTED(RefRank, root->rank));
AVER(root->type == RootTABLE || root->type == RootFUN ||
root->type == RootREG);
switch(root->type)
{
case RootTABLE:
@ -52,13 +47,18 @@ Bool RootIsValid(Root root, ValidationType validParam)
AVER(ISVALIDNESTED(Thread, root->the.reg.thread));
break;
case RootFMT:
AVER(root->the.fmt.scan != NULL);
AVER(root->the.fmt.base != 0);
AVER(root->the.fmt.base < root->the.fmt.limit);
break;
default:
NOTREACHED;
}
return TRUE;
}
static Error create(Root *rootReturn, Space space,
RefRank rank, RootType type, RootUnion theUnion)
{
@ -92,7 +92,6 @@ static Error create(Root *rootReturn, Space space,
return ErrSUCCESS;
}
Error RootCreateTable(Root *rootReturn, Space space,
RefRank rank, Addr *base, Addr *limit)
{
@ -107,7 +106,6 @@ Error RootCreateTable(Root *rootReturn, Space space,
return create(rootReturn, space, rank, RootTABLE, theUnion);
}
Error RootCreateReg(Root *rootReturn, Space space,
RefRank rank, Thread thread,
RootScanRegMethod scan, void *p)
@ -124,6 +122,22 @@ Error RootCreateReg(Root *rootReturn, Space space,
return create(rootReturn, space, rank, RootREG, theUnion);
}
Error RootCreateFmt(Root *rootReturn, Space space,
RefRank rank, FormatScanMethod scan,
Addr base, Addr limit)
{
RootUnion theUnion;
AVER(scan != NULL);
AVER(base != 0);
AVER(base < limit);
theUnion.fmt.scan = scan;
theUnion.fmt.base = base;
theUnion.fmt.limit = limit;
return create(rootReturn, space, rank, RootFMT, theUnion);
}
Error RootCreate(Root *rootReturn, Space space,
RefRank rank,
@ -141,7 +155,6 @@ Error RootCreate(Root *rootReturn, Space space,
return create(rootReturn, space, rank, RootFUN, theUnion);
}
void RootDestroy(Root root)
{
Space space;
@ -160,15 +173,12 @@ void RootDestroy(Root root)
PoolFree(SpaceControlPool(space), (Addr)root, sizeof(RootStruct));
}
RefRank RootRank(Root root)
{
AVER(ISVALID(Root, root));
return root->rank;
}
void RootMark(Root root, Trace trace)
{
AVER(ISVALID(Root, root));
@ -178,7 +188,6 @@ void RootMark(Root root, Trace trace)
TraceNoteMarked(trace, root->rank, (Addr)1);
}
Error RootScan(Root root, Trace trace)
{
Error e;
@ -223,6 +232,14 @@ Error RootScan(Root root, Trace trace)
return e;
break;
case RootFMT:
e = (*root->the.fmt.scan)(TraceScanState(trace),
root->the.fmt.base,
root->the.fmt.limit);
if(e != ErrSUCCESS)
return e;
break;
default:
NOTREACHED;
}
@ -233,7 +250,7 @@ Error RootScan(Root root, Trace trace)
return ErrSUCCESS;
}
/* Thread safe */
/* Must be thread-safe. See impl.c.mpsi.thread-safety. */
Space RootSpace(Root root)
{
return PARENT(SpaceStruct, rootDeque, root->spaceDeque.deque);