From 6901cb57f2e90ec11e4d5eceb061c1fa5488698a Mon Sep 17 00:00:00 2001 From: Richard Brooksby Date: Fri, 9 Feb 1996 15:47:08 +0000 Subject: [PATCH] Implementing fmt roots Copied from Perforce Change: 15236 ServerID: perforce.ravenbrook.com --- mps/src/mpsi.c | 20 ++++++++++++++++---- mps/src/root.c | 49 +++++++++++++++++++++++++++++++++---------------- 2 files changed, 49 insertions(+), 20 deletions(-) diff --git a/mps/src/mpsi.c b/mps/src/mpsi.c index 0ac891fec05..ba524e462fe 100644 --- a/mps/src/mpsi.c +++ b/mps/src/mpsi.c @@ -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 #include -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, diff --git a/mps/src/root.c b/mps/src/root.c index d2dbf60d958..bbd594815f4 100644 --- a/mps/src/root.c +++ b/mps/src/root.c @@ -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);