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:
parent
c6a4b514ea
commit
6901cb57f2
2 changed files with 49 additions and 20 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue