1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-04-25 07:40:40 -07:00

Merging mmdevel_pekka_rate (ams/epvm merge, ams color rep, trace rate)

Copied from Perforce
 Change: 19623
 ServerID: perforce.ravenbrook.com
This commit is contained in:
Pekka Pirinen 1998-06-05 18:14:52 +01:00
parent 23e3db9dd7
commit 98623cd77a
28 changed files with 836 additions and 992 deletions

View file

@ -1,10 +1,11 @@
/* impl.c.amsss: POOL CLASS AMS STRESS TEST
*
* $HopeName: MMsrc!amsss.c(trunk.5) $
* Copyright (C) 1996, 1997, 1998 Harlequin Group, all rights reserved
* $HopeName$
* Copyright (C) 1998. Harlequin Group plc. All rights reserved.
*
* .design: Adapted from amcss.c, but not counting collections, just
* total size of objects allocated.
* total size of objects allocated (because epoch doesn't increment
* when AMS is collected).
*/
#include <stdio.h>
@ -30,10 +31,11 @@
#define exactRootsCOUNT 50
#define ambigRootsCOUNT 50
/* Even this much takes 20 min to run in variety CI on gaia. */
#define totalSizeMAX 4 * 1024 * (size_t)1024
#define totalSizeSTEP 1 * 1024 * (size_t)1024
#define totalSizeMAX 800 * (size_t)1024
#define totalSizeSTEP 200 * (size_t)1024
#define objNULL ((mps_addr_t)0xDECEA5ED)
#define testArenaSIZE ((size_t)16<<20)
#define initTestFREQ 6000
static mps_pool_t pool;
@ -70,7 +72,8 @@ static void *test(void *arg, size_t s)
mps_root_t exactRoot, ambigRoot;
size_t lastStep = 0;
unsigned long i;
mps_word_t collections;
mps_ap_t busy_ap;
mps_addr_t busy_init;
arena = (mps_arena_t)arg;
(void)s; /* unused */
@ -81,24 +84,24 @@ static void *test(void *arg, size_t s)
"pool_create(ams)");
die(mps_ap_create(&ap, pool, MPS_RANK_EXACT), "BufferCreate");
die(mps_ap_create(&busy_ap, pool, MPS_RANK_EXACT), "BufferCreate 2");
for(i = 0; i < exactRootsCOUNT; ++i)
exactRoots[i] = objNULL;
for(i = 0; i < ambigRootsCOUNT; ++i)
ambigRoots[i] = (mps_addr_t)rnd();
die(mps_root_create_table(&exactRoot, arena,
MPS_RANK_EXACT, (mps_rm_t)0,
&exactRoots[0], exactRootsCOUNT),
"root_create_table(exact)");
die(mps_root_create_table(&ambigRoot, arena,
MPS_RANK_AMBIG, (mps_rm_t)0,
&ambigRoots[0], ambigRootsCOUNT),
"root_create_table(ambig)");
for(i = 0; i < exactRootsCOUNT; ++i)
exactRoots[i] = objNULL;
for(i = 0; i < ambigRootsCOUNT; ++i)
ambigRoots[i] = (mps_addr_t)rnd();
collections = 0;
/* create an ap, and leave it busy */
die(mps_reserve(&busy_init, busy_ap, 64), "mps_reserve busy");
i = 0;
while(totalSize < totalSizeMAX) {
@ -123,6 +126,9 @@ static void *test(void *arg, size_t s)
if(exactRoots[r] != objNULL)
assert(dylan_check(exactRoots[r]));
if(rnd() % initTestFREQ == 0)
*(int*)busy_init = -1; /* check that the buffer is still there */
++i;
if (i % 256 == 0) {
printf(".");
@ -130,6 +136,8 @@ static void *test(void *arg, size_t s)
}
}
(void)mps_commit(busy_ap, busy_init, 64);
mps_ap_destroy(busy_ap);
mps_ap_destroy(ap);
mps_root_destroy(exactRoot);
mps_root_destroy(ambigRoot);

View file

@ -1,6 +1,6 @@
/* impl.c.arena: ARENA IMPLEMENTATION
*
* $HopeName: MMsrc!arena.c(trunk.38) $
* $HopeName: MMsrc!arena.c(trunk.39) $
* Copyright (C) 1998. Harlequin Group plc. All rights reserved.
*
* .readership: Any MPS developer
@ -36,7 +36,7 @@
#include "poolmrg.h"
#include "mps.h"
SRCID(arena, "$HopeName: MMsrc!arena.c(trunk.38) $");
SRCID(arena, "$HopeName: MMsrc!arena.c(trunk.39) $");
/* All static data objects are declared here. See .static */
@ -91,9 +91,6 @@ Bool ArenaCheck(Arena arena)
RefSet rs;
Rank rank;
/* we check the fields in order. We can't yet check the serials,
* pollThreshold, actionInterval, or epoch. nickb 1997-07-21 */
CHECKS(Arena, arena);
/* design.mps.arena.static.serial */
CHECKL(arena->serial < arenaSerial);
@ -109,7 +106,6 @@ Bool ArenaCheck(Arena arena)
CHECKL(BoolCheck(arena->insidePoll));
CHECKL(BoolCheck(arena->clamped));
/* no check on arena->actionInterval */
CHECKL(BoolCheck(arena->bufferLogging));
CHECKL(arena->fillMutatorSize >= 0.0);
CHECKL(arena->emptyMutatorSize >= 0.0);
@ -237,11 +233,9 @@ void ArenaInit(Arena arena, ArenaClass class)
arena->suspended = FALSE;
for(i = 0; i < SHIELD_CACHE_SIZE; i++)
arena->shCache[i] = (Seg)0;
arena->pollThreshold = (Size)0;
arena->pollThreshold = 0.0;
arena->insidePoll = FALSE;
arena->clamped = FALSE;
/* design.mps.arena.poll.interval */
arena->actionInterval = ARENA_POLL_MAX;
arena->epoch = (Epoch)0; /* impl.c.ld */
arena->prehistory = RefSetEMPTY;
for(i = 0; i < ARENA_LD_LENGTH; ++i)
@ -546,18 +540,15 @@ void (ArenaPoll)(Arena arena)
#else
void ArenaPoll(Arena arena)
{
Size size;
Count i;
double size;
AVERT(Arena, arena);
if(arena->clamped)
return;
size = ArenaCommitted(arena);
size = arena->fillMutatorSize;
if(arena->insidePoll || size < arena->pollThreshold)
return;
/* design.mps.arena.poll.when */
arena->insidePoll = TRUE;
@ -565,23 +556,20 @@ void ArenaPoll(Arena arena)
ActionPoll(arena);
/* Temporary hacky progress control added here and in trace.c */
/* for change.dylan.honeybee.170466. */
/* for change.dylan.honeybee.170466, and substantially modified */
/* for change.epcore.minnow.160062. */
if(arena->busyTraces != TraceSetEMPTY) {
Trace trace = ArenaTrace(arena, (TraceId)0);
AVER(arena->busyTraces == TraceSetSingle((TraceId)0));
i = trace->rate;
while(i > 0 && TraceSetIsMember(arena->busyTraces, trace->ti)) {
TracePoll(trace);
if(trace->state == TraceFINISHED) {
/* @@@@ Pick up results and use for prediction. */
TraceDestroy(trace);
}
--i;
TracePoll(trace);
if(trace->state == TraceFINISHED) {
TraceDestroy(trace);
}
}
size = ArenaCommitted(arena);
size = arena->fillMutatorSize;
arena->pollThreshold = size + ARENA_POLL_MAX;
AVER(arena->pollThreshold > size); /* enough precision? */
arena->insidePoll = FALSE;
}
@ -616,12 +604,12 @@ void ArenaPark(Arena arena)
TracePoll(trace);
/* @@@@ Pick up results and use for prediction. */
if(trace->state == TraceFINISHED)
TraceDestroy(trace);
}
}
}
Res ArenaCollect(Arena arena)
{
@ -651,7 +639,6 @@ Res ArenaCollect(Arena arena)
RING_FOR(segNode, PoolSegRing(pool), nextSegNode) {
Seg seg = SegOfPoolRing(segNode);
/* avoid buffered segments and non-auto pools? */
res = TraceAddWhite(trace, seg);
if(res != ResOK)
goto failAddWhite;
@ -659,7 +646,7 @@ Res ArenaCollect(Arena arena)
}
}
res = TraceStart(trace);
res = TraceStart(trace, 0.0, 0.0);
if(res != ResOK)
goto failStart;
@ -668,7 +655,6 @@ Res ArenaCollect(Arena arena)
return ResOK;
failStart:
NOTREACHED;
failAddWhite:
NOTREACHED; /* @@@@ Would leave white sets inconsistent. */
failBegin:
@ -683,15 +669,14 @@ failCreate:
* See design.mps.describe.
*/
Res ArenaDescribe(Arena arena, mps_lib_FILE *stream)
{
Res res;
Ring node, nextNode;
Index i;
AVERT(Arena, arena);
AVER(stream != NULL);
if(!CHECKT(Arena, arena)) return ResFAIL;
if(stream == NULL) return ResFAIL;
res = WriteF(stream,
"Arena $P ($U) {\n",
@ -702,24 +687,24 @@ Res ArenaDescribe(Arena arena, mps_lib_FILE *stream)
" controlPool $P\n",
(WriteFP)&arena->controlPoolStruct,
" lock $P\n", (WriteFP)&arena->lockStruct,
" pollThreshold $U\n", (WriteFU)arena->pollThreshold,
" pollThreshold $U KB\n",
(WriteFU)(arena->pollThreshold / 1024),
" insidePoll $S\n", arena->insidePoll ? "YES" : "NO",
" fillMutatorSize $UKb\n",
" fillMutatorSize $U KB\n",
(WriteFU)(arena->fillMutatorSize / 1024),
" emptyMutatorSize $UKb\n",
" emptyMutatorSize $U KB\n",
(WriteFU)(arena->emptyMutatorSize / 1024),
" allocMutatorSize $UKb\n",
" allocMutatorSize $U KB\n",
(WriteFU)(arena->allocMutatorSize / 1024),
" fillInternalSize $UKb\n",
" fillInternalSize $U KB\n",
(WriteFU)(arena->fillInternalSize / 1024),
" emptyInternalSize $UKb\n",
" emptyInternalSize $U KB\n",
(WriteFU)(arena->emptyInternalSize / 1024),
NULL);
if(res != ResOK)
return res;
res = WriteF(stream,
" actionInterval $U\n", (WriteFU)arena->actionInterval,
" zoneShift $U\n", (WriteFU)arena->zoneShift,
" alignment $W\n", (WriteFW)arena->alignment,
" poolSerial $U\n", (WriteFU)arena->poolSerial,
@ -805,7 +790,7 @@ Res ArenaDescribe(Arena arena, mps_lib_FILE *stream)
* allocating so that the block can be addressed with a void*.
*/
Res ArenaAlloc(void **baseReturn, Arena arena, Size size)
Res ArenaAlloc(void **baseReturn, Arena arena, size_t size)
{
Addr base;
Res res;
@ -816,7 +801,7 @@ Res ArenaAlloc(void **baseReturn, Arena arena, Size size)
AVER(size > 0);
pool = MVPool(&arena->controlPoolStruct);
res = PoolAlloc(&base, pool, size);
res = PoolAlloc(&base, pool, (Size)size);
if(res != ResOK) return res;
*baseReturn = (void *)base; /* see .arenaalloc.addr */
@ -826,15 +811,16 @@ Res ArenaAlloc(void **baseReturn, Arena arena, Size size)
/* ArenaFree -- free a block allocated using ArenaAlloc */
void ArenaFree(Arena arena, void* base, Size size)
void ArenaFree(Arena arena, void* base, size_t size)
{
Pool pool;
AVERT(Arena, arena);
AVER(base != NULL);
AVER(size > 0);
pool = MVPool(&arena->controlPoolStruct);
PoolFree(pool, base, size);
PoolFree(pool, (Addr)base, (Size)size);
}

View file

@ -1,7 +1,7 @@
/* impl.c.bt: BIT TABLES
*
* $HopeName: MMsrc!bt.c(trunk.14) $
* Copyright (C) 1997, 1998 Harlequin Group, all rights reserved
* $HopeName$
* Copyright (C) 1998. Harlequin Group plc. All rights reserved.
*
* READERSHIP
*
@ -10,16 +10,13 @@
* DESIGN
*
* .design: see design.mps.bt
*
* PURPOSE
*
* .purpose: see design.mps.bt
*/
#include "mpm.h"
SRCID(bt, "$HopeName: MMsrc!bt.c(trunk.14) $");
SRCID(bt, "$HopeName$");
/* is the whole word of bits at this index set? */
@ -84,7 +81,7 @@ static Bool BTCheck(BT bt)
/* design.mps.bt.fun.size */
Size (BTSize)(unsigned long n)
size_t (BTSize)(unsigned long n)
{
/* check that the expression used in rounding up doesn't overflow */
AVER(n+MPS_WORD_WIDTH-1 > n);

View file

@ -1,7 +1,7 @@
# impl.gmk.comm: COMMON GNUMAKEFILE FRAGMENT
#
# $HopeName: MMsrc!comm.gmk(trunk.31) $
# Copyright (C) 1995,1996,1997, 1998 Harlequin Group, all rights reserved
# $HopeName$
# Copyright (C) 1997. Harlequin Group plc. All rights reserved.
#
# DESCRIPTION
#
@ -27,10 +27,10 @@
# PFM platform code, e.g. "sus8gc"
# LIBS extra libraries to include in tests (usually "-lm")
# NOISY if defined and non-empty, causes commands to be emitted
# MPM C sources for the "mpm" part
# MPMPF platform-dependent C sources for the "mpm" part
# MPMS assembler sources for the "mpm" part (.s files)
# MPMPS pre-processor assembler sources for the "mpm" part (.S files)
# SW C sources for the "sw" part
# SWPF platform-dependent C sources for the "sw" part
#
# %%PART: Add a new parameter above for the files included in the part.
#
@ -173,6 +173,16 @@ FMTDY = fmtdy.c fmtdytst.c
FMTPS = fmtpstst.c
PLINTH = mpsliban.c mpsioan.c
EVENT = event.c
MPMCOMMON = assert.c mpsi.c mpm.c arenavm.c arenacl.c arena.c pool.c \
trace.c root.c seg.c format.c buffer.c ref.c bt.c ring.c \
shield.c ld.c event.c action.c message.c \
poolmrg.c poolmfs.c poolmv.c
MPM = $(MPMCOMMON) $(MPMPF)
SWCOMMON = assert.c mpsi.c mpm.c arenavm.c arenacl.c arena.c pool.c \
trace.c root.c seg.c format.c buffer.c ref.c bt.c ring.c \
shield.c ld.c action.c message.c poolmrg.c poolmfs.c \
poolmv.c poolepdl.c poolepvm.c poolams.c
SW = $(SWCOMMON) $(SWPF)
# These map the source file lists onto object files and dependency files

View file

@ -1,6 +1,6 @@
/* impl.h.config: MPS CONFIGURATION
*
* $HopeName: MMsrc!config.h(trunk.23) $
* $HopeName: MMsrc!config.h(trunk.24) $
* Copyright (C) 1998. Harlequin Group plc. All rights reserved.
*
* .readership: MPS developers.
@ -171,7 +171,7 @@
#define ARENA_CONTROL_EXTENDBY ((Size)4096)
#define ARENA_CONTROL_AVGSIZE ((Size)32)
#define ARENA_CONTROL_MAXSIZE ((Size)65536)
#define ARENA_POLL_MAX ((Size)65536)
#define ARENA_POLL_MAX (65536.0)
#define ARENA_LD_LENGTH ((Size)4)
#define ARENA_ZONESHIFT ((Shift)20)

View file

@ -1,24 +1,16 @@
# impl.gmk.iam4cc: BUILD FOR IRIX 6 N32/MIPS IV/CC PLATFORM
#
# $HopeName: MMsrc!iam4cc.gmk(trunk.5) $
# $HopeName$
# Copyright (C) 1998. Harlequin Group plc. All rights reserved.
#
# Copyright (C) 1997 Harlequin Group, all rights reserved
#
# This is the GNU makefile for platform.iam4cc.
# This is the GNU makefile for platform.iam4cc.
PFM = iam4cc
PFMDEFS = -n32
MPM = assert.c ring.c mpsliban.c mpm.c bt.c \
arenavm.c arenacl.c arena.c pool.c poolmfs.c \
poolmv.c root.c format.c buffer.c lockan.c ref.c \
trace.c than.c protan.c prmcan.c shield.c mpsi.c ld.c vman.c ssan.c \
mpsioan.c event.c action.c seg.c message.c poolmrg.c \
span.c
SW = assert.c ring.c mpm.c arenavm.c arenacl.c arena.c pool.c poolmfs.c \
poolmv.c root.c format.c buffer.c lockan.c ref.c bt.c \
trace.c than.c protsw.c prmcan.c shield.c mpsi.c ld.c ssan.c vman.c \
poolepdl.c poolepvm.c action.c seg.c poolmrg.c message.c span.c
MPMPF = mpsliban.c mpsioan.c lockan.c than.c vman.c \
protan.c prmcan.c ssan.c span.c
SWPF = lockan.c than.c vman.c protsw.c prmcan.c ssan.c
LIBS = -lm

View file

@ -1,23 +1,15 @@
# impl.gmk.lippgc: BUILD FOR LINUX/POWER(32)/GCC PLATFORM
#
# $HopeName$
# $HopeName: MMsrc!lippgc.gmk(trunk.2) $
# Copyright (C) 1998. Harlequin Group plc. All rights reserved.
#
# Copyright (C) 1998 Harlequin Group, all rights reserved
#
# This is the GNU makefile for platform.lippgc.
# This is the GNU makefile for platform.lippgc.
PFM = lippgc
MPM = assert.c ring.c mpsliban.c mpm.c bt.c \
arenavm.c arenacl.c arena.c pool.c poolmfs.c \
poolmv.c root.c format.c buffer.c lockan.c ref.c \
trace.c than.c protan.c prmcan.c shield.c mpsi.c ld.c vman.c ssan.c \
mpsioan.c event.c action.c seg.c message.c poolmrg.c \
span.c
SW = assert.c ring.c mpm.c arenavm.c arenacl.c arena.c pool.c poolmfs.c \
poolmv.c root.c format.c buffer.c lockan.c ref.c bt.c \
trace.c than.c protsw.c prmcan.c shield.c mpsi.c ld.c ssan.c vman.c \
poolepdl.c poolepvm.c action.c seg.c poolmrg.c message.c span.c
MPMPF = mpsliban.c mpsioan.c lockan.c than.c vman.c \
protan.c prmcan.c ssan.c span.c
SWPF = lockan.c than.c vman.c protsw.c prmcan.c ssan.c
LIBS = -lm

View file

@ -1,7 +1,7 @@
/* impl.c.mpm: GENERAL MPM SUPPORT
*
* $HopeName: MMsrc!mpm.c(trunk.19) $
* Copyright (C) 1996, 1997 Harlequin Group, all rights reserved.
* $HopeName$
* Copyright (C) 1996. Harlequin Group plc. All rights reserved.
*
* .readership: MM developers.
*
@ -12,8 +12,10 @@
*/
#include "mpm.h"
#include <stdarg.h>
SRCID(mpm, "$HopeName: MMsrc!mpm.c(trunk.19) $");
SRCID(mpm, "$HopeName$");
/* MPMCheck -- test MPM assumptions */
@ -173,12 +175,10 @@ Shift SizeFloorLog2(Size size)
Shift l = 0;
AVER(size != 0);
while(size > 1) {
++l;
size >>= 1;
}
return l;
}
@ -236,9 +236,9 @@ Addr (AddrAlignDown)(Addr addr, Align alignment)
/* PointerAdd -- add a size to a pointer */
Pointer (PointerAdd)(Pointer p, Size s)
void *(PointerAdd)(void *p, size_t s)
{
Pointer next;
void *next;
AVER(p != NULL);
next = PointerAdd(p, s);
AVER(next >= p); /* overflow check */
@ -248,9 +248,9 @@ Pointer (PointerAdd)(Pointer p, Size s)
/* PointerSub -- subtract a size from a pointer */
Pointer (PointerSub)(Pointer p, Size s)
void *(PointerSub)(void *p, size_t s)
{
Pointer next;
void *next;
AVER(p != NULL);
next = PointerSub(p, s);
AVER(next <= p); /* overflow check */
@ -260,7 +260,7 @@ Pointer (PointerSub)(Pointer p, Size s)
/* PointerOffset -- calculate the offset between two addresses */
Size (PointerOffset)(Pointer base, Pointer limit)
size_t (PointerOffset)(void *base, void *limit)
{
AVER(base != NULL);
AVER(limit != NULL);
@ -274,7 +274,7 @@ Size (PointerOffset)(Pointer base, Pointer limit)
/* padded to the given width */
static Res WriteWord(mps_lib_FILE *stream, Word w, unsigned base,
unsigned width)
unsigned width)
{
static const char digit[16] = "0123456789ABCDEF";
static const char pad = '0'; /* padding character */
@ -433,15 +433,15 @@ Res WriteF(mps_lib_FILE *stream, ...)
}
/* StringLength -- Substitute for strlen
*/
/* StringLength -- Slow substitute for strlen */
size_t StringLength(const char *s) {
size_t StringLength(const char *s)
{
size_t i;
AVER(s != NULL);
for(i = 0; s[i] != '\0'; i++)
NOOP;
return(i);
}

View file

@ -1,7 +1,7 @@
/* impl.h.mpm: MEMORY POOL MANAGER DEFINITIONS
*
* $HopeName: MMsrc!mpm.h(trunk.86) $
* Copyright (C) 1998. Harlequin Group plc. All rights reserved.
* $HopeName$
* Copyright (C) 1998. Harlequin Group plc. All rights reserved.
*/
#ifndef mpm_h
@ -55,24 +55,24 @@ extern Word (WordAlignDown)(Word word, Align align);
extern Bool AlignCheck(Align align);
extern Pointer (PointerAdd)(Pointer p, Size s);
#define PointerAdd(p, s) ((Pointer)((char *)(p) + (s)))
extern void *(PointerAdd)(void *p, size_t s);
#define PointerAdd(p, s) ((void *)((char *)(p) + (s)))
extern Pointer (PointerSub)(Pointer p, Size s);
#define PointerSub(p, s) ((Pointer)((char *)(p) - (s)))
extern void *(PointerSub)(void *p, size_t s);
#define PointerSub(p, s) ((void *)((char *)(p) - (s)))
extern Size (PointerOffset)(Pointer base, Pointer limit);
#define PointerOffset(base, limit) \
((Size)((char *)(limit) - (char *)(base)))
extern size_t (PointerOffset)(void *base, void *limit);
#define PointerOffset(base, limit) ((char *)(limit) - (char *)(base))
extern Addr (AddrAdd)(Addr addr, Size size);
#define AddrAdd(p, s) ((Addr)PointerAdd((Pointer)(p), (s)))
#define AddrAdd(p, s) ((Addr)PointerAdd((void *)(p), (s)))
extern Addr (AddrSub)(Addr addr, Size size);
#define AddrSub(p, s) ((Addr)PointerSub((Pointer)(p), (s)))
#define AddrSub(p, s) ((Addr)PointerSub((void *)(p), (s)))
extern Size (AddrOffset)(Addr base, Addr limit);
#define AddrOffset(b, l) (PointerOffset((Pointer)(b), (Pointer)(l)))
#define AddrOffset(b, l) \
((Size)(PointerOffset((void *)(b), (void *)(l))))
extern Addr (AddrAlignDown)(Addr addr, Align align);
#define AddrAlignDown(p, a) ((Addr)WordAlignDown((Word)(p), (a)))
@ -202,7 +202,7 @@ extern Ring (RingNext)(Ring ring);
/* Bit Table Interface -- see design.mps.bt.if.* for doc */
/* design.mps.bt.if.size */
extern Size (BTSize)(unsigned long length);
extern size_t (BTSize)(unsigned long length);
#define BTSize(n) (((n)+MPS_WORD_WIDTH-1)/MPS_WORD_WIDTH*sizeof(Word))
@ -374,6 +374,7 @@ extern void MessageNoFinalizationRef(Ref *refReturn,
/* Trace Interface -- see impl.c.trace */
#define TraceSetSingle(ti) BS_SINGLE(TraceSet, (ti))
#define TraceSetIsSingle(ts) BS_IS_SINGLE(ts)
#define TraceSetIsMember(ts, ti)BS_IS_MEMBER((ts), (ti))
#define TraceSetAdd(ts, ti) BS_ADD(TraceSet, (ts), (ti))
#define TraceSetDel(ts, ti) BS_DEL(TraceSet, (ts), (ti))
@ -398,7 +399,7 @@ extern Bool TraceCheck(Trace trace);
extern Res TraceCreate(Trace *traceReturn, Space space);
extern Res TraceAddWhite(Trace trace, Seg seg);
extern Res TraceCondemnRefSet(Trace trace, RefSet condemnedSet);
extern Res TraceStart(Trace trace);
extern Res TraceStart(Trace trace, double mortality, double finishingTime);
extern Res TraceFlip(Trace trace);
extern void TraceDestroy(Trace trace);
extern Res TraceStep(Trace trace);
@ -409,6 +410,20 @@ extern Res TraceFix(ScanState ss, Ref *refIO);
extern Res TraceFixEmergency(ScanState ss, Ref *refIO);
extern Size TraceGreyEstimate(Arena arena, RefSet refSet);
/* Collection control parameters */
/* Defined here, because they are used by more than one module (pool). */
/* They have the wrong name because they originally came from AMC, and */
/* binary compatibility is required. */
extern unsigned long AMCGen0Frequency;
extern unsigned long AMCGen1Frequency;
extern unsigned long AMCGen2Frequency;
extern unsigned long AMCGen2plusFrequencyMultiplier;
extern Serial AMCGenFinal;
extern double TraceGen0IncrementalityMultiple;
extern double TraceMortalityEstimate;
/* Equivalent to impl.h.mps MPS_SCAN_BEGIN */
#define TRACE_SCAN_BEGIN(ss) \
@ -495,8 +510,8 @@ extern void ArenaRelease(Arena arena);
extern void ArenaPark(Arena arena);
extern Res ArenaCollect(Arena arena);
extern Res ArenaAlloc(void **baseReturn, Arena arena, Size size);
extern void ArenaFree(Arena arena, void *base, Size size);
extern Res ArenaAlloc(void **baseReturn, Arena arena, size_t size);
extern void ArenaFree(Arena arena, void *base, size_t size);
/* Peek/Poke
*

View file

@ -1,7 +1,7 @@
/* impl.h.mpmst: MEMORY POOL MANAGER DATA STRUCTURES
*
* $HopeName: MMsrc!mpmst.h(trunk.56) $
* Copyright (C) 1997 The Harlequin Group Limited. All rights reserved.
* $HopeName$
* Copyright (C) 1998 Harlequin Group plc. All rights reserved.
*
* .readership: MM developers.
*
@ -9,9 +9,6 @@
* design a module's structures should be found in that module's design
* document.
*
* .requirements: There are none [maybe being easy to experiment is a
* requirement].
*
* .rationale: Almost all MPM data structures are defined in this
* header, or in headers selected from here. Most structures have
* already been declared as incomplete types in impl.h.mpmtypes. This
@ -607,10 +604,9 @@ typedef struct ArenaStruct {
Bool poolReady; /* design.mps.arena.pool.ready */
MVStruct controlPoolStruct; /* design.mps.arena.pool */
LockStruct lockStruct; /* arena's lock */
Size pollThreshold; /* design.mps.arena.poll */
Bool insidePoll; /* design.mps.arena.poll */
double pollThreshold; /* design.mps.arena.poll */
Bool insidePoll;
Bool clamped; /* prevent background activity */
Size actionInterval; /* design.mps.arena.poll.interval */
Bool bufferLogging; /* design.mps.buffer.logging.control */
double fillMutatorSize; /* total bytes filled, mutator buffers */

View file

@ -1,9 +1,7 @@
# impl.gmk.o1alcc: BUILD FOR OSF/1, ALPHA, DIGITAL C PLATFORM
#
# BUILD FOR OSF/1, ALPHA, DIGITAL C PLATFORM
#
# $HopeName: MMsrc!o1alcc.gmk(trunk.14) $
#
# Copyright (C) 1995,1997 Harlequin Group, all rights reserved
# $HopeName$
# Copyright (C) 1998. Harlequin Group plc. All rights reserved.
#
# This is the GNU makefile for platform.o1alcc.
#
@ -14,12 +12,8 @@
PFM = o1alcc
PFMDEFS = -D_ANSI_C_SOURCE
MPM = assert.c ring.c mpsliban.c mpm.c bt.c \
arenavm.c arenacl.c arena.c pool.c poolmfs.c \
poolmv.c root.c format.c buffer.c lockan.c ref.c \
trace.c than.c proto1.c prmcan.c shield.c mpsi.c ld.c vmo1.c \
mpsioan.c event.c action.c seg.c poolmrg.c message.c \
span.c
MPMPF = mpsliban.c mpsioan.c lockan.c than.c vmo1.c \
proto1.c prmcan.c span.c
MPMS = sso1al.s
DW = dw.c fmtdy.c

View file

@ -1,9 +1,7 @@
# impl.gmk.o1algc: BUILD FOR OSF/1, ALPHA, GCC PLATFORM
#
# BUILD FOR OSF/1, ALPHA, GCC PLATFORM
#
# $HopeName: MMsrc!o1algc.gmk(trunk.19) $
#
# Copyright (C) 1995,1997 Harlequin Group, all rights reserved
# $HopeName$
# Copyright (C) 1998. Harlequin Group plc. All rights reserved.
#
# This is the GNU makefile for platform.o1algc.
#
@ -14,12 +12,8 @@
PFM = o1algc
PFMDEFS = -D_ANSI_C_SOURCE
MPM = assert.c ring.c mpsliban.c mpm.c bt.c \
arenavm.c arenacl.c arena.c pool.c poolmfs.c \
poolmv.c root.c format.c buffer.c lockan.c ref.c \
trace.c than.c proto1.c prmcan.c shield.c mpsi.c ld.c vmo1.c \
mpsioan.c event.c action.c seg.c poolmrg.c message.c \
span.c
MPMPF = mpsliban.c mpsioan.c lockan.c than.c vmo1.c \
proto1.c prmcan.c span.c
MPMS = sso1al.s
DW = dw.c fmtdy.c

View file

@ -1,6 +1,6 @@
/* impl.c.pool: POOL IMPLEMENTATION
*
* $HopeName: MMsrc!pool.c(trunk.52) $
* $HopeName: MMsrc!pool.c(trunk.53) $
* Copyright (C) 1997. Harlequin Group plc. All rights reserved.
*
* READERSHIP
@ -37,7 +37,7 @@
#include "mpm.h"
SRCID(pool, "$HopeName: MMsrc!pool.c(trunk.52) $");
SRCID(pool, "$HopeName: MMsrc!pool.c(trunk.53) $");
Bool PoolClassCheck(PoolClass class)
@ -91,6 +91,7 @@ Bool PoolCheck(Pool pool)
return TRUE;
}
/* PoolInit, PoolInitV -- initialize a pool
*
* Initialize the generic fields of the pool and calls class-specific init.
@ -208,6 +209,7 @@ failArenaAlloc:
return res;
}
/* PoolFinish -- Finish pool including class-specific and generic fields. */
void PoolFinish(Pool pool)
@ -974,6 +976,7 @@ Res PoolCollectAct(Pool pool, Action action)
AVERT(Pool, pool);
AVERT(Action, action);
AVER(action->pool == pool);
arena = PoolArena(pool);
@ -981,7 +984,7 @@ Res PoolCollectAct(Pool pool, Action action)
if(res != ResOK)
goto failCreate;
res = PoolTraceBegin(action->pool, trace);
res = PoolTraceBegin(pool, trace);
if(res != ResOK)
goto failBegin;
@ -995,14 +998,15 @@ Res PoolCollectAct(Pool pool, Action action)
goto failAddWhite;
}
res = TraceStart(trace);
/* @@@@ mortality and finishing time are set to reasonable values, */
/* while we wait for a more intelligent strategy. */
res = TraceStart(trace, 0.5, 0.5 * trace->condemned);
if(res != ResOK)
goto failStart;
return ResOK;
failStart:
NOTREACHED;
failAddWhite:
NOTREACHED; /* @@@@ Would leave white sets inconsistent. */
failBegin:
@ -1011,6 +1015,7 @@ failCreate:
return res;
}
void PoolNoWalk(Pool pool, Seg seg,
FormattedObjectsStepMethod f,
void *p, Size s)

View file

@ -1,6 +1,6 @@
/* impl.c.poolamc: AUTOMATIC MOSTLY-COPYING MEMORY POOL CLASS
*
* $HopeName: MMsrc!poolamc.c(trunk.5) $
* $HopeName: MMsrc!poolamc.c(trunk.6) $
* Copyright (C) 1998 Harlequin Group plc. All rights reserved.
*
* .sources: design.mps.poolamc.
@ -10,7 +10,7 @@
#include "mpscamc.h"
#include "mpm.h"
SRCID(poolamc, "$HopeName: MMsrc!poolamc.c(trunk.5) $");
SRCID(poolamc, "$HopeName: MMsrc!poolamc.c(trunk.6) $");
/* PType enumeration -- distinguishes AMCGen and AMCNailBoard */
@ -639,15 +639,8 @@ static void AMCBufferEmpty(Pool pool, Buffer buffer)
/* AMCBenefit -- calculate benefit of collecting some generation */
/* defined in impl.c.trace */
extern unsigned long AMCGen0Frequency;
extern unsigned long AMCGen1Frequency;
extern unsigned long AMCGen2Frequency;
extern unsigned long AMCGen2plusFrequencyMultiplier;
extern Serial AMCGenFinal;
/* defined here, not used elsewhere */
unsigned long AMCTopGen = 2;
Serial AMCTopGen = 2;
static double AMCBenefit(Pool pool, Action action)
{
@ -808,7 +801,10 @@ static Res AMCAct(Pool pool, Action action)
if(res != ResOK)
goto failCondemn;
}
res = TraceStart(trace);
res = TraceStart(trace, TraceMortalityEstimate,
AMCGen0Frequency * TraceGen0IncrementalityMultiple
* 1024*1024uL);
if(res != ResOK)
goto failStart;
@ -1361,8 +1357,6 @@ static Res AMCSegDescribe(AMC amc, Seg seg, mps_lib_FILE *stream)
Align step;
Size row;
AVERT(AMC, amc);
step = amc->poolStruct.alignment;
row = step * 64;
@ -1390,6 +1384,7 @@ static Res AMCSegDescribe(AMC amc, Seg seg, mps_lib_FILE *stream)
if(res != ResOK)
return res;
/* @@@@ This needs to describe nailboards as well */
for(j = i; j < AddrAdd(i, row); j = AddrAdd(j, step)) {
if(j >= limit)
c = ' ';
@ -1433,7 +1428,7 @@ static void AMCWalk(Pool pool, Seg seg,
/* White objects might not be alive, and grey objects */
/* may have pointers to old-space. */
/* NB segments containing a mix of colours (ie Nailed segs) */
/* NB, segments containing a mix of colours (i.e., nailed segs) */
/* are not handled properly: No objects are walked @@@@ */
if(SegWhite(seg) == TraceSetEMPTY &&
SegGrey(seg) == TraceSetEMPTY &&
@ -1508,9 +1503,9 @@ static Res AMCDescribe(Pool pool, mps_lib_FILE *stream)
AMC amc;
Ring ring, node, nextNode;
AVERT(Pool, pool);
if(!CHECKT(Pool, pool)) return ResFAIL;
amc = PoolPoolAMC(pool);
AVERT(AMC, amc);
if(!CHECKT(AMC, amc)) return ResFAIL;
res = WriteF(stream,
"AMC $P {\n", (WriteFP)amc,
@ -1677,10 +1672,7 @@ void mps_amc_apply(mps_pool_t mps_pool,
ArenaEnter(arena);
AVERT(Pool, pool);
closure_s.f = f;
closure_s.p = p;
closure_s.s = s;
closure_s.f = f; closure_s.p = p; closure_s.s = s;
AMCWalkAll(pool, mps_amc_apply_iter, &closure_s, sizeof(closure_s));
ArenaLeave(arena);

File diff suppressed because it is too large Load diff

View file

@ -1,7 +1,7 @@
/* impl.c.poolawl: AUTOMATIC WEAK LINKED POOL CLASS
*
* $HopeName: MMsrc!poolawl.c(trunk.42) $
* Copyright (C) 1997, 1998 The Harlequin Group Limited. All rights reserved.
* $HopeName$
* Copyright (C) 1998. Harlequin Group plc. All rights reserved.
*
* READERSHIP
*
@ -12,12 +12,11 @@
* .design: design.mps.poolawl
*/
#include "mpscawl.h"
#include "mpm.h"
SRCID(poolawl, "$HopeName: MMsrc!poolawl.c(trunk.42) $");
SRCID(poolawl, "$HopeName: MMsrc!poolawl.c(trunk.43) $");
#define AWLSig ((Sig)0x519b7a37) /* SIGPooLAWL */
@ -660,6 +659,7 @@ static Bool AWLDependentObject(Addr *objReturn, Addr parent)
return TRUE;
}
static Res awlScanObject(Arena arena, ScanState ss,
FormatScanMethod scan, Addr base, Addr limit)
{
@ -689,6 +689,8 @@ static Res awlScanObject(Arena arena, ScanState ss,
}
res = (*scan)(ss, base, limit);
if(res == ResOK)
ss->scannedSize += AddrOffset(base, limit);
if(dependent) {
ShieldCover(arena, dependentSeg);
@ -697,6 +699,7 @@ static Res awlScanObject(Arena arena, ScanState ss,
return res;
}
static Res awlScanSinglePass(Bool *anyScannedReturn,
ScanState ss, Pool pool,
Seg seg, Bool scanAllObjects)
@ -849,11 +852,12 @@ static Res AWLFix(Pool pool, ScanState ss, Seg seg, Ref *refIO)
case RankFINAL:
case RankWEAK:
if(!BTGet(group->mark, i)) {
++ss->forwardCount; /* slightly inaccurate terminology */
ss->wasMarked = FALSE;
if(ss->rank == RankWEAK) {
*refIO = (Ref)0;
*refIO = (Ref)0;
} else {
BTSet(group->mark, i);
BTSet(group->mark, i);
SegSetGrey(seg, TraceSetUnion(SegGrey(seg), ss->traces));
}
}
@ -874,6 +878,7 @@ static void AWLReclaim(Pool pool, Trace trace, Seg seg)
AWL awl;
AWLGroup group;
Index i;
Count oldFree;
AVERT(Pool, pool);
AVERT(Trace, trace);
@ -890,7 +895,7 @@ static void AWLReclaim(Pool pool, Trace trace, Seg seg)
base = SegBase(seg);
i = 0;
i = 0; oldFree = group->free;
while(i < group->grains) {
Addr p;
Index j;
@ -925,9 +930,11 @@ static void AWLReclaim(Pool pool, Trace trace, Seg seg)
}
AVER(i == group->grains);
trace->reclaimSize += (group->free - oldFree) << awl->alignShift;
SegSetWhite(seg, TraceSetDel(SegWhite(seg), trace->ti));
}
static Res AWLTraceBegin(Pool pool, Trace trace)
{
AWL awl;
@ -973,7 +980,7 @@ static Res AWLAccess(Pool pool, Seg seg, Addr addr,
/* Have to scan the entire seg anyway. */
res = PoolSegAccess(pool, seg, addr, mode, context);
if (ResOK == res) {
if(ResOK == res) {
AWLStatNoteSegAccess(awl, seg, addr);
}
@ -981,13 +988,6 @@ static Res AWLAccess(Pool pool, Seg seg, Addr addr,
}
/* defined in impl.c.trace */
extern unsigned long AMCGen0Frequency;
extern unsigned long AMCGen1Frequency;
extern unsigned long AMCGen2Frequency;
extern unsigned long AMCGen2plusFrequencyMultiplier;
extern Serial AMCGenFinal;
static double AWLBenefit(Pool pool, Action action)
{
AWL awl;
@ -1015,7 +1015,7 @@ static double AWLBenefit(Pool pool, Action action)
/* When we have both AMC and AWL we want AMC to do the driving of */
/* the collections, as that collects younger generations too. */
/* So we make AWLs collections a little less frequent. */
/* So we make AWL's collections a little less frequent. */
f += 1;
arena = PoolArena(pool);
@ -1023,6 +1023,7 @@ static double AWLBenefit(Pool pool, Action action)
return (ArenaMutatorAllocSize(arena) - awl->lastCollected) - f * 1024*1024L;
}
static void AWLWalk(Pool pool, Seg seg, FormattedObjectsStepMethod f,
void *p, unsigned long s)
{

View file

@ -1,8 +1,8 @@
# impl.makefile.s7ppac: S7PPAC MPW MAKE FILE
#
# $HopeName: MMsrc!s7ppac:Makefile(trunk.10) $
# $HopeName: MMsrc!s7ppac:Makefile(trunk.11) $
#
# Copyright (c) 1998 Harlequin Group plc. All rights reserved.
# Copyright (C) 1996. Harlequin Group plc. All rights reserved.
#
# This only knows about making the mmsw libraries for MM/EP-core.
@ -107,6 +107,7 @@ mmsw_{Variety}.o
ld{OSffx}
poolepdl{OSffx}
poolepvm{OSffx}
poolams{OSffx}
action{OSffx}
seg{OSffx}
poolmrg{OSffx}

View file

@ -1,29 +1,20 @@
# impl.gmk.sos8cx: BUILD FOR SOLARIS/SPARC v8/CXREF PLATFORM
#
# BUILD FOR SOLARIS/SPARC v8/CXREF PLATFORM
#
# $HopeName: MMsrc!sos8cx.gmk(trunk.6) $
# Copyright (C) 1995,1997 Harlequin Group, all rights reserved
# $HopeName$
# Copyright (C) 1998. Harlequin Group plc. All rights reserved.
#
# Instead of compiling object files, this platform (using the cxref
# builder) generates a C cross reference listing.
#
# @@ it falls over if you try and build an executable, but this is
# okay as it we only wanted the C cross references
# It falls over if you try and build an executable, but this is
# okay as we only wanted the C cross references.
#
PFM = sos8cx
MPM = assert.c ring.c mpsliban.c mpm.c bt.c \
arenavm.c arenacl.c arena.c pool.c poolmfs.c \
poolmv.c root.c format.c buffer.c lockan.c ref.c \
trace.c than.c protso.c prmcan.c shield.c mpsi.c ld.c vmso.c \
mpsioan.c event.c action.c seg.c message.c poolmrg.c \
span.c
MPMPF = mpsliban.c mpsioan.c lockan.c than.c vmso.c \
protso.c prmcan.c span.c
DW = fmtdy.c dw.c
SW = assert.c ring.c mpm.c arenavm.c arenacl.c arena.c pool.c poolmfs.c \
poolmv.c root.c format.c buffer.c lockan.c ref.c bt.c \
trace.c than.c protsw.c prmcan.c shield.c mpsi.c ld.c ssan.c vmso.c \
poolepdl.c poolepvm.c action.c seg.c poolmrg.c message.c
SWPF = lockan.c than.c vmso.c protsw.c prmcan.c ssan.c
LIBS = -lm
include cx.gmk

View file

@ -1,26 +1,18 @@
# impl.gmk.sos8gc: BUILD FOR SOLARIS/SPARC v8/GCC PLATFORM
#
# BUILD FOR SOLARIS/SPARC v8/GCC PLATFORM
# $HopeName$
# Copyright (C) 1998. Harlequin Group plc. All rights reserved.
#
# $HopeName: MMsrc!sos8gc.gmk(trunk.24) $
# Copyright (C) 1995,1997 Harlequin Group, all rights reserved
#
# This is the GNU makefile for platform.sos8gc.
# This is the GNU makefile for platform.sos8gc.
#
PFM = sos8gc
MPM = assert.c ring.c mpsliban.c mpm.c bt.c \
arenavm.c arenacl.c arena.c pool.c poolmfs.c \
poolmv.c root.c format.c buffer.c lockan.c ref.c \
trace.c than.c protso.c prmcan.c shield.c mpsi.c ld.c vmso.c \
mpsioan.c event.c action.c seg.c message.c poolmrg.c \
span.c
MPMPF = mpsliban.c mpsioan.c lockan.c than.c vmso.c \
protso.c prmcan.c span.c
MPMS = sssos8.s
DW = fmtdy.c dw.c
SW = assert.c ring.c mpm.c arenavm.c arenacl.c arena.c pool.c poolmfs.c \
poolmv.c root.c format.c buffer.c lockan.c ref.c bt.c \
trace.c than.c protsw.c prmcan.c shield.c mpsi.c ld.c ssan.c vmso.c \
poolepdl.c poolepvm.c action.c seg.c message.c poolmrg.c
SWPF = lockan.c than.c vmso.c protsw.c prmcan.c ssan.c
LIBS = -lm
include gc.gmk

View file

@ -1,26 +1,18 @@
# impl.gmk.sos8gp: BUILD FOR SOLARIS/SPARC v8/GCC WITH PROFILING PLATFORM
#
# BUILD FOR SOLARIS/SPARC v8/GCC WITH PROFILING PLATFORM
# $HopeName$
# Copyright (C) 1998. Harlequin Group plc. All rights reserved.
#
# $HopeName: MMsrc!sos8gp.gmk(trunk.3) $
# Copyright (C) 1995,1997 Harlequin Group, all rights reserved
#
# This is the GNU makefile for platform.sos8gp.
# This is the GNU makefile for platform.sos8gp.
#
PFM = sos8gp
MPM = assert.c ring.c mpsliban.c mpm.c bt.c \
arenavm.c arenacl.c arena.c pool.c poolmfs.c \
poolmv.c root.c format.c buffer.c lockan.c ref.c \
trace.c than.c protso.c prmcan.c shield.c mpsi.c ld.c vmso.c \
mpsioan.c event.c action.c seg.c message.c poolmrg.c \
span.c
MPMPF = mpsliban.c mpsioan.c lockan.c than.c vmso.c \
protso.c prmcan.c span.c
MPMS = sssos8.s
DW = fmtdy.c dw.c
SW = assert.c ring.c mpm.c arenavm.c arenacl.c arena.c pool.c poolmfs.c \
poolmv.c root.c format.c buffer.c lockan.c ref.c bt.c \
trace.c than.c protsw.c prmcan.c shield.c mpsi.c ld.c ssan.c vmso.c \
poolepdl.c poolepvm.c action.c seg.c message.c poolmrg.c
SWPF = lockan.c than.c vmso.c protsw.c prmcan.c ssan.c
# Need to pass the profile option to the linker as well.
LIBS = -lm -pg

View file

@ -1,25 +1,18 @@
# impl.gmk.sos9sc: BUILD FOR Solaris/SPARC v9/SunPro C PLATFORM
#
# BUILD FOR Solaris/SPARC v9/SunPro C PLATFORM
# $HopeName$
# Copyright (C) 1998. Harlequin Group plc. All rights reserved.
#
# $HopeName: MMsrc!sos9sc.gmk(trunk.19) $
#
# This is the GNU makefile for platform.sos9sc
# This is the GNU makefile for platform.sos9sc.
#
PFM = sos9sc
MPM = assert.c ring.c mpsliban.c mpm.c bt.c \
arenavm.c arenacl.c arena.c pool.c poolmfs.c \
poolmv.c root.c format.c buffer.c lockan.c ref.c \
trace.c than.c protso.c prmcan.c shield.c mpsi.c ld.c vmso.c \
mpsioan.c event.c action.c seg.c poolmrg.c message.c \
span.c
MPMPF = mpsliban.c mpsioan.c lockan.c than.c vmso.c \
protso.c prmcan.c span.c
MPMS = sssos8.s # s9 is backward-compatible with s8 here
DW = fmtdy.c dw.c
SW = assert.c ring.c mpm.c arenavm.c arenacl.c arena.c pool.c poolmfs.c \
poolmv.c root.c format.c buffer.c lockan.c ref.c bt.c \
trace.c than.c protsw.c prmcan.c shield.c mpsi.c ld.c ssan.c vmso.c \
poolepdl.c poolepvm.c action.c seg.c poolmrg.c message.c
SWPF = lockan.c than.c vmso.c protsw.c prmcan.c ssan.c
LIBS = -lm
include sc.gmk

View file

@ -1,24 +1,17 @@
# impl.gmk.sus8gc: BUILD FOR SUNOS/SPARC v8/GCC PLATFORM
#
# $HopeName: MMsrc!sus8gc.gmk(trunk.38) $
# Copyright (C) 1995,1996,1997 Harlequin Group, all rights reserved.
# $HopeName$
# Copyright (C) 1998. Harlequin Group plc. All rights reserved.
#
# This is the GNU makefile for platform.sus8gc.
PFM = sus8gc
MPM = assert.c ring.c mpsliban.c mpm.c bt.c \
arenavm.c arenacl.c arena.c pool.c poolmfs.c \
poolmv.c root.c format.c buffer.c lockan.c ref.c \
trace.c than.c protsu.c prmcan.c shield.c mpsi.c ld.c vmsu.c \
mpsioan.c event.c action.c seg.c message.c poolmrg.c \
span.c
MPMPF = mpsliban.c mpsioan.c lockan.c than.c vmsu.c \
protsu.c prmcan.c span.c
MPMS = sssus8.s
DW = fmtdy.c dw.c
SW = assert.c ring.c mpm.c arenavm.c arenacl.c arena.c pool.c poolmfs.c \
poolmv.c root.c format.c buffer.c lockan.c ref.c bt.c \
trace.c than.c protsw.c prmcan.c shield.c mpsi.c ld.c ssan.c vmsu.c \
poolepdl.c poolepvm.c action.c seg.c poolmrg.c message.c
SWPF = lockan.c than.c vmsu.c protsw.c prmcan.c ssan.c
LIBS = -lm

View file

@ -1,25 +1,17 @@
# impl.gmk.sus8lc: BUILD FOR SUNOS/SPARC v8/LCC PLATFORM
#
# BUILD FOR SUNOS/SPARC v8/LCC PLATFORM
# $HopeName$
# Copyright (C) 1998. Harlequin Group plc. All rights reserved.
#
# $HopeName: MMsrc!sus8lc.gmk(trunk.17) $
# Copyright (C) 1996,1997 Harlequin Group, all rights reserved
#
# This is the GNU makefile for platform.sus8lc.
# This is the GNU makefile for platform.sus8lc.
#
PFM = sus8lc
MPM = assert.c ring.c mpsliban.c mpm.c bt.c \
arenavm.c arenacl.c arena.c pool.c poolmfs.c \
poolmv.c root.c format.c buffer.c lockan.c ref.c \
trace.c than.c protsu.c prmcan.c shield.c mpsi.c ld.c vmsu.c \
mpsioan.c event.c action.c seg.c poolmrg.c message.c \
span.c
MPMPF = mpsliban.c mpsioan.c lockan.c than.c vmsu.c \
protsu.c prmcan.c span.c
MPMS = sssus8.s
DW = fmtdy.c dw.c
SW = assert.c ring.c mpm.c arenavm.c arenacl.c arena.c pool.c poolmfs.c \
poolmv.c root.c format.c buffer.c lockan.c ref.c bt.c \
trace.c than.c protsw.c prmcan.c shield.c mpsi.c ld.c ssan.c vmsu.c \
poolepdl.c poolepvm.c action.c seg.c poolmrg.c message.c
SWPF = lockan.c than.c vmsu.c protsw.c prmcan.c ssan.c
include lc.gmk

View file

@ -1,14 +1,15 @@
/* impl.c.trace: GENERIC TRACER IMPLEMENTATION
*
* $HopeName: MMsrc!trace.c(trunk.67) $
* $HopeName: MMsrc!trace.c(trunk.68) $
* Copyright (C) 1997, 1998 The Harlequin Group Limited. All rights reserved.
*
* .design: design.mps.trace.
*/
#include "mpm.h"
#include "limits.h"
SRCID(trace, "$HopeName: MMsrc!trace.c(trunk.67) $");
SRCID(trace, "$HopeName: MMsrc!trace.c(trunk.68) $");
/* Types
@ -22,20 +23,6 @@ enum {TraceAccountingPhaseRootScan,
typedef int TraceAccountingPhase;
/* Collection control parameters @@@@ */
/* Defined here, because they are used by more than one module (pool). */
/* They have the wrong name because they originally came from AMC, and */
/* binary compatibility is required. */
unsigned long AMCGen0Frequency = 4;
unsigned long AMCGen1Frequency = 32;
unsigned long AMCGen2Frequency = 300;
unsigned long AMCGen2plusFrequencyMultiplier = 1000;
Serial AMCGenFinal = 0; /* default: no final generation */
double TraceGen0IncrementalityMultiple = 0.5;
/* ScanStateCheck -- check consistency of a ScanState object */
Bool ScanStateCheck(ScanState ss)
@ -210,6 +197,21 @@ static void TraceUpdateCounts(Trace trace, ScanState ss,
}
/* Collection control parameters @@@@ */
/* Defined here, because they are used by more than one module (pool). */
/* They have the wrong name because they originally came from AMC, and */
/* binary compatibility is required. */
unsigned long AMCGen0Frequency = 4;
unsigned long AMCGen1Frequency = 32;
unsigned long AMCGen2Frequency = 300;
unsigned long AMCGen2plusFrequencyMultiplier = 1000;
Serial AMCGenFinal = 0; /* default: no final generation */
double TraceGen0IncrementalityMultiple = 0.5;
double TraceMortalityEstimate = 0.5;
/* TraceAddWhite -- add a segment to the white set of a trace */
Res TraceAddWhite(Trace trace, Seg seg)
@ -304,10 +306,14 @@ Res TraceCondemnRefSet(Trace trace, RefSet condemnedSet)
return ResOK;
}
/* TraceStart -- condemn a set of objects and start collection
*
* TraceStart should be passed a trace with state TraceINIT, i.e.
* recently returned from TraceCreate.
* TraceStart should be passed a trace with state TraceINIT, i.e.,
* recently returned from TraceCreate, with some condemned segments
* added. mortality is the fraction of the condemned set expected
* to survive. finishingTime is relative to the current polling clock,
* see design.mps.arena.poll.clock.
*
* .start.black: All segments are black w.r.t. a newly allocated trace.
* However, if TraceStart initialized segments to black when it
@ -315,7 +321,7 @@ Res TraceCondemnRefSet(Trace trace, RefSet condemnedSet)
* it easy to destroy traces half-way through.
*/
Res TraceStart(Trace trace)
Res TraceStart(Trace trace, double mortality, double finishingTime)
{
Ring ring, node;
Arena arena;
@ -324,8 +330,9 @@ Res TraceStart(Trace trace)
AVERT(Trace, trace);
AVER(trace->state == TraceINIT);
AVER(0.0 <= mortality && mortality <= 1.0);
arena = trace->arena;
AVER(finishingTime >= 0.0);
/* If there is nothing white then there can be nothing grey, */
/* so everything is black and we can finish the trace immediately. */
@ -383,22 +390,18 @@ Res TraceStart(Trace trace)
node = next;
}
/* Calculate the rate of working. Assumes that half the condemned */
/* set will survive, and calculates a rate of work which will */
/* finish the collection by the time that a megabyte has been */
/* allocated. The 4096 is the number of bytes scanned by each */
/* TraceStep (approximately) and should be replaced by a parameter. */
/* This is a temporary measure for change.dylan.honeybee.170466. */
/* Calculate the rate of scanning. */
{
double surviving = trace->condemned / 2;
double scan = trace->foundation + surviving;
/* double reclaim = trace->condemned - surviving; */
double alloc = AMCGen0Frequency * TraceGen0IncrementalityMultiple *
1024*1024uL;
/* if(alloc > 0) */
trace->rate = 1 + (Size)(scan * ARENA_POLL_MAX / (4096 * alloc));
/* else */
/* trace->rate = 1 + (Size)(scan / 4096); */
Size sSurvivors = (Size)(trace->condemned * (1.0 - mortality));
double nPolls = finishingTime / ARENA_POLL_MAX;
/* There must be at least one poll. */
if(nPolls < 1.0) nPolls = 1.0;
/* We use casting to long to truncate nPolls down to the nearest */
/* integer, so try to make sure it fits. */
if(nPolls >= (double)LONG_MAX) nPolls = (double)LONG_MAX;
/* rate equals scanning work per number of polls available */
trace->rate = (trace->foundation + sSurvivors) / (long)nPolls + 1;
}
trace->state = TraceUNFLIPPED;
@ -941,17 +944,23 @@ static Res TraceRun(Trace trace)
}
/* TraceWorkClock -- a measure of the work done for this trace */
static Size TraceWorkClock(Trace trace)
{
AVERT(Trace, trace);
/* Segment scanning work is the only work that is regulated. */
return trace->segScanSize;
}
/* TraceExpedite -- signals an emergency on the trace and */
/* moves it to the Finished state. */
static void TraceExpedite(Trace trace)
{
AVERT(Trace, trace);
/* check trace is not in INIT state. If the trace was in the */
/* INIT state, then TraceStep would not progress it so the loop */
/* would never terminate (see .step.noprogress) */
AVER(trace->state != TraceINIT);
trace->emergency = TRUE;
while(trace->state != TraceFINISHED) {
@ -980,9 +989,6 @@ Res TraceStep(Trace trace)
case TraceUNFLIPPED:
/* all traces are flipped in TraceStart at the moment */
NOTREACHED;
res = TraceFlip(trace);
if(res != ResOK)
return res;
break;
case TraceFLIPPED:
@ -995,13 +1001,6 @@ Res TraceStep(Trace trace)
TraceReclaim(trace);
break;
case TraceFINISHED:
case TraceINIT:
/* .step.noprogress: no progress in either of these two states. */
/* @@@@ in fact, should we ever see a trace in the INIT state? */
NOOP;
break;
default:
NOTREACHED;
break;
@ -1016,17 +1015,22 @@ Res TraceStep(Trace trace)
void TracePoll(Trace trace)
{
Res res;
Size pollEnd;
AVERT(Trace, trace);
res = TraceStep(trace);
if(res != ResOK) {
/* check res is expected failure code */
AVER(res == ResMEMORY ||
res == ResRESOURCE);
TraceExpedite(trace);
AVER(trace->state == TraceFINISHED);
}
pollEnd = TraceWorkClock(trace) + trace->rate;
do {
res = TraceStep(trace);
if(res != ResOK) {
AVER(res == ResMEMORY ||
res == ResRESOURCE);
TraceExpedite(trace);
AVER(trace->state == TraceFINISHED);
return;
}
} while(trace->state != TraceFINISHED
&& TraceWorkClock(trace) < pollEnd);
}

View file

@ -1,6 +1,6 @@
/* impl.c.vmw3: VIRTUAL MEMORY MAPPING FOR WIN32
*
* $HopeName: MMsrc!vmw3.c(trunk.24) $
* $HopeName: MMsrc!vmw3.c(trunk.25) $
* Copyright (C) 1997, 1998 Harlequin Group, all rights reserved
*
* Design: design.mps.vm
@ -55,7 +55,7 @@
#include "mpswin.h"
SRCID(vmw3, "$HopeName: MMsrc!vmw3.c(trunk.24) $");
SRCID(vmw3, "$HopeName: MMsrc!vmw3.c(trunk.25) $");
/* VMStruct -- virtual memory structure */
@ -107,11 +107,6 @@ static Res VMRAMSize(VM vm, Size *vmRAMSizeReturn)
return ResOK;
}
/* defined in impl.c.trace */
extern unsigned long AMCGen0Frequency;
extern unsigned long AMCGen1Frequency;
extern unsigned long AMCGen2Frequency;
/* VMSetCollectionStrategy -- initialize strategy for platform */
/* This is not a protocol function - but it could be in future */

View file

@ -1,8 +1,8 @@
# ==== W3ALMV NMAKE FILE ====
#
# $HopeName: MMsrc!w3almv.nmk(trunk.26) $
# $HopeName: MMsrc!w3almv.nmk(trunk.27) $
#
# Copyright (C) 1995,1997 Harlequin Group, all rights reserved
# Copyright (C) 1997. Harlequin Group plc. All rights reserved.
#
PFM = w3almv
@ -18,8 +18,8 @@ SW = <assert> <ring> <mpm> <bt> \
<arenavm> <arenacl> <arena> <pool> <poolmfs> \
<poolmv> <root> <format> <buffer> <lockw3> \
<ref> <trace> <protsw> <prmcan> <shield> <vmw3> \
<than> <ssan> <mpsi> <mpsiw3> <ld> <poolepdl> <poolepvm> \
<action> <seg> <poolmrg> <message>
<than> <ssan> <mpsi> <mpsiw3> <ld> <action> <seg> \
<poolmrg> <message> <poolepdl> <poolepvm> <poolams>
PLINTH = <mpsioan> <mpsliban>
AMC = <poolamc>
AMS = <poolams>

View file

@ -1,9 +1,10 @@
# ==== NTI3MV NMAKE FILE ====
#
# $HopeName: MMsrc!w3i3mv.nmk(trunk.51) $
# $HopeName: MMsrc!w3i3mv.nmk(trunk.52) $
#
# Copyright (C) 1995,1996,1997 Harlequin Group, all rights reserved
# Copyright (C) 1997. Harlequin Group plc. All rights reserved.
#
PFM = w3i3mv
PFMDEFS = /DWIN32 /D_WINDOWS
@ -17,8 +18,8 @@ SW = <assert> <ring> <mpm> <bt> \
<arenavm> <arenacl> <arena> <pool> <poolmfs> \
<poolmv> <root> <format> <buffer> <lockw3> \
<ref> <trace> <protsw> <prmcan> <shield> <vmw3> \
<thw3i3> <ssan> <mpsi> <mpsiw3> <ld> <poolepdl> <poolepvm> \
<action> <seg> <poolmrg> <message>
<thw3i3> <ssan> <mpsi> <mpsiw3> <ld> <action> <seg> \
<poolmrg> <message> <poolepdl> <poolepvm> <poolams>
PLINTH = <mpsliban> <mpsioan>
AMC = <poolamc>
AMS = <poolams>

View file

@ -1,8 +1,8 @@
# ==== W3PPMV NMAKE FILE ====
#
# $HopeName: MMsrc!w3ppmv.nmk(trunk.27) $
# $HopeName: MMsrc!w3ppmv.nmk(trunk.28) $
#
# Copyright (C) 1995,1997 Harlequin Group, all rights reserved
# Copyright (C) 1997. Harlequin Group plc. All rights reserved.
#
PFM = w3ppmv
@ -18,8 +18,8 @@ SW = <assert> <ring> <mpm> <bt> \
<arenavm> <arenacl> <arena> <pool> <poolmfs> \
<poolmv> <root> <format> <buffer> <lockw3> \
<ref> <trace> <protsw> <prmcan> <shield> <vmw3> \
<than> <ssan> <mpsi> <mpsiw3> <ld> <poolepdl> <poolepvm> \
<action> <seg> <poolmrg> <message>
<than> <ssan> <mpsi> <mpsiw3> <ld> <action> <seg> \
<poolmrg> <message> <poolepdl> <poolepvm> <poolams>
PLINTH = <mpsioan> <mpsliban>
AMC = <poolamc>
AMS = <poolams>