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:
parent
23e3db9dd7
commit
98623cd77a
28 changed files with 836 additions and 992 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
15
mps/src/bt.c
15
mps/src/bt.c
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
1156
mps/src/poolams.c
1156
mps/src/poolams.c
File diff suppressed because it is too large
Load diff
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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} ¶
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
120
mps/src/trace.c
120
mps/src/trace.c
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue