diff --git a/mps/src/arenavm.c b/mps/src/arenavm.c index 89914adfdac..bb6acc6e36d 100644 --- a/mps/src/arenavm.c +++ b/mps/src/arenavm.c @@ -1,12 +1,12 @@ /* impl.c.arenavm: VIRTUAL MEMORY BASED ARENA IMPLEMENTATION * - * $HopeName: MMsrc!arenavm.c(trunk.3) $ + * $HopeName: MMsrc!arenavm.c(trunk.4) $ * Copyright (C) 1996 Harlequin Group, all rights reserved. */ #include "mpm.h" -SRCID(arenavm, "$HopeName: MMsrc!arenavm.c(trunk.3) $"); +SRCID(arenavm, "$HopeName: MMsrc!arenavm.c(trunk.4) $"); #define SpaceArena(space) (&(space)->arenaStruct) @@ -80,7 +80,7 @@ static void BTSet(BT bt, BI i, Bool b) * arena part. */ -Res ArenaCreate(Space *spaceReturn, Size size) +Res ArenaCreate(Space *spaceReturn, Size size, Addr base) { Res res; Space space; @@ -93,12 +93,13 @@ Res ArenaCreate(Space *spaceReturn, Size size) /* Create the space structure, initialize the VM part, and */ /* the current attribute structure. */ - res = VMCreate(&space, size); + res = VMCreate(&space, size, base); if(res) return res; arena = SpaceArena(space); arena->base = VMBase(space); arena->limit = VMLimit(space); + size = AddrOffset(arena->base, arena->limit); arena->pageSize = VMAlign(); arena->pageShift = SizeLog2(arena->pageSize); arena->pages = size >> arena->pageShift; @@ -129,7 +130,9 @@ Res ArenaCreate(Space *spaceReturn, Size size) /* Set the zone shift to divide the arena into the same number of */ /* zones as will fit into a reference set (the number of bits in */ /* a word). */ - space->zoneShift = SizeLog2(size >> WORD_SHIFT); +/* space->zoneShift = SizeLog2(size >> WORD_SHIFT); */ + space->zoneShift = 20; /* @@@@ */ + /* Sign the arena. */ arena->sig = ArenaSig; diff --git a/mps/src/gc.gmk b/mps/src/gc.gmk index e9f710d30c4..c05aba05cb5 100644 --- a/mps/src/gc.gmk +++ b/mps/src/gc.gmk @@ -1,7 +1,7 @@ # # GENERIC BUILD.GC MAKEFILE FRAGMENT # -# $HopeName: MMsrc!gc.gmk(trunk.18) $ +# $HopeName: MMsrc!gc.gmk(trunk.19) $ # # Copyright (C) 1995 Harlequin Group, all rights reserved # @@ -20,6 +20,7 @@ # AMC as above for the "amc" part # LO as above for the "lo" part # DW as above for the "dw" part +# SW as above for the "sw" part # TESTLIB as above for the "testlib" part # LIBS extra libraries to include in tests (usually "-lm") # NOISY if defined and non-empty, causes commands to be emitted @@ -77,17 +78,27 @@ endif .PHONY: phony # C FLAGS -# %%VARIETY: Define a macro containing the set of flags for the new -# variety. + +# Some flags depend on the target. Alas. +ifdef TARGET +ifeq ($(TARGET),mmsw.a) +CFLAGSTARGET = -DTARGET_VM_RM +else +CFLAGSTARGET = +endif +endif # These flags are included in all compilations. CFLAGSCOMMON = \ - $(PFMDEFS) \ + $(PFMDEFS) $(CFLAGSTARGET) \ -ansi -pedantic -Wall -Werror -Wpointer-arith \ -Wstrict-prototypes -Wmissing-prototypes \ -Winline -Waggregate-return -Wnested-externs \ -Wcast-qual -Wshadow +# %%VARIETY: Define a macro containing the set of flags for the new +# variety. + # These flags are added to compilations for the "df" variety. CFDF = -DTARGET_VAR_DF -g -ggdb3 @@ -116,6 +127,8 @@ LOOBJ = $(LO:%.c=$(PFM)/$(VARIETY)/%.o) LODEP = $(LO:%.c=$(PFM)/$(VARIETY)/%.d) DWOBJ = $(DW:%.c=$(PFM)/$(VARIETY)/%.o) DWDEP = $(DW:%.c=$(PFM)/$(VARIETY)/%.d) +SWOBJ = $(SW:%.c=$(PFM)/$(VARIETY)/%.o) +SWDEP = $(SW:%.c=$(PFM)/$(VARIETY)/%.d) TESTLIBOBJ = $(TESTLIB:%.c=$(PFM)/$(VARIETY)/%.o) TESTLIBDEP = $(TESTLIB:%.c=$(PFM)/$(VARIETY)/%.d) endif @@ -150,7 +163,8 @@ all: mpmss amcss dwstress mpsicv lockcov poolncv lo.a locv qs weakcv # # %%TARGET: Add a pseudo-target for the new target here. -mpmss amcss dwstress mpsicv lockcov poolncv lo.a locv qs weakcv: phony +mpmss amcss dwstress mpsicv lockcov poolncv lo.a \ + locv qs weakcv mmsw.a: phony $(MAKE) -f $(PFM).gmk TARGET=$@ target # "clean" removes the directory containing the build results for the @@ -228,6 +242,9 @@ $(PFM)/$(VARIETY)/mpm.a: $(MPMOBJ) $(PFM)/$(VARIETY)/lo.a: $(PFM)/$(VARIETY)/lo.o +$(PFM)/$(VARIETY)/mmsw.a: \ + $(SWOBJ) + endif diff --git a/mps/src/mpm.h b/mps/src/mpm.h index 9b5fd540642..7f77008e45d 100644 --- a/mps/src/mpm.h +++ b/mps/src/mpm.h @@ -1,6 +1,6 @@ /* impl.h.mpm: MEMORY POOL MANAGER DEFINITIONS * - * $HopeName: MMsrc!mpm.h(trunk.5) $ + * $HopeName: MMsrc!mpm.h(trunk.6) $ * Copyright (C) 1996 Harlequin Group, all rights reserved. */ @@ -253,7 +253,7 @@ extern Res TraceScanAreaTagged(ScanState ss, Addr *base, Addr *limit); /* Space Interface -- see impl.c.space */ -extern Res SpaceCreate(Space *spaceReturn); +extern Res SpaceCreate(Space *spaceReturn, Addr base, Size size); extern void SpaceDestroy(Space space); extern Bool SpaceCheck(Space space); extern Res SpaceDescribe(Space space, Lib_FILE *stream); @@ -273,7 +273,7 @@ extern void SpaceFree(Space space, Addr base, Size size); /* Arena Interface -- see impl.c.arena* */ -extern Res ArenaCreate(Space *spaceReturn, Size size); +extern Res ArenaCreate(Space *spaceReturn, Size size, Addr base); extern void ArenaDestroy(Space space); extern Bool ArenaCheck(Arena arena); extern Align ArenaAlign(Space space); @@ -407,7 +407,7 @@ extern Space RootSpace(Root root); extern Align VMAlign(void); extern Bool VMCheck(VM vm); -extern Res VMCreate(Space *spaceReturn, Size size); +extern Res VMCreate(Space *spaceReturn, Size size, Addr base); extern void VMDestroy(Space space); extern Addr VMBase(Space space); extern Addr VMLimit(Space space); diff --git a/mps/src/mpmst.h b/mps/src/mpmst.h index ad531eeb5ac..c033657ef7b 100644 --- a/mps/src/mpmst.h +++ b/mps/src/mpmst.h @@ -1,6 +1,6 @@ /* impl.h.mpmst: MEMORY POOL MANAGER DATA STRUCTURES * - * $HopeName: MMsrc!mpmst.h(trunk.5) $ + * $HopeName: MMsrc!mpmst.h(trunk.6) $ * Copyright (C) 1996 Harlequin Group, all rights reserved. * * .rationale: Almost all MPM data structures are defined in this @@ -154,7 +154,7 @@ typedef struct MVStruct { Size maxSize; /* client estimate of maximum size */ Size space; /* total free space in pool */ Size lost; /* lost because free couldn't allocate(!) */ - struct MVSpanStruct *spans; /* span chain */ + RingStruct spans; /* span chain */ Sig sig; /* impl.h.misc.sig */ } MVStruct; @@ -169,7 +169,17 @@ typedef struct MVStruct { #define VMSig ((Sig)0x519FEE33) -#if defined(MPS_OS_W3) +#ifdef TARGET_VM_RM + +typedef struct VMStruct { /* Real Memory fake VM; impl.c.vmrm */ + Sig sig; /* impl.h.misc.sig */ + Align align; /* made-up alignment */ + Addr base, limit; /* boundaries of reserved space */ + Size reserved; /* total reserved address space */ + Size mapped; /* total mapped memory */ +} VMStruct; + +#elif defined(MPS_OS_W3) typedef struct VMStruct { /* Win32 VM structure; impl.c.vmnt */ Sig sig; /* impl.h.misc.sig */ diff --git a/mps/src/mps.h b/mps/src/mps.h index f65cef090fe..c6df3724313 100644 --- a/mps/src/mps.h +++ b/mps/src/mps.h @@ -2,7 +2,7 @@ * * HARLEQUIN MEMORY POOL SYSTEM INTERFACE * - * $HopeName: MMsrc!mps.h(trunk.8) $ + * $HopeName: MMsrc!mps.h(trunk.9) $ * * Copyright (C) 1996 Harlequin Group, all rights reserved */ @@ -225,6 +225,8 @@ extern mps_assert_t mps_assert_default(void); /* Spaces */ +extern mps_res_t mps_space_create_wmem(mps_space_t *mps_space_o, + mps_addr_t base, size_t size); extern mps_res_t mps_space_create(mps_space_t *mps_space_o); extern void mps_space_destroy(mps_space_t mps_space); diff --git a/mps/src/mpscmv.h b/mps/src/mpscmv.h index 4bdc199a841..c62faa2543e 100644 --- a/mps/src/mpscmv.h +++ b/mps/src/mpscmv.h @@ -1,6 +1,6 @@ /* impl.h.mpscmv: MEMORY POOL SYSTEM CLASS "MV" * - * $HopeName$ + * $HopeName: MMsrc!mpscmv.h(trunk.1) $ * Copyright (C) 1996 Harlequin Group, all rights reserved. */ @@ -9,6 +9,8 @@ #include "mps.h" +extern size_t mps_mv_free_size(mps_pool_t mps_pool); +extern size_t mps_mv_size(mps_pool_t mps_pool); extern mps_class_t mps_class_mv(void); #endif /* mpscmv_h */ diff --git a/mps/src/mpsi.c b/mps/src/mpsi.c index 45b1b52a200..448d4a4c91d 100644 --- a/mps/src/mpsi.c +++ b/mps/src/mpsi.c @@ -1,6 +1,6 @@ /* impl.c.mpsi: MEMORY POOL SYSTEM INTERFACE LAYER * - * $HopeName: MMsrc!mpsi.c(trunk.13) $ + * $HopeName: MMsrc!mpsi.c(trunk.14) $ * Copyright (C) 1996 Harlequin Group, all rights reserved. * * .thread-safety: Most calls through this interface lock the space @@ -17,7 +17,7 @@ #include "mpm.h" #include "mps.h" -SRCID(mpsi, "$HopeName: MMsrc!mpsi.c(trunk.13) $"); +SRCID(mpsi, "$HopeName: MMsrc!mpsi.c(trunk.14) $"); /* Check consistency of interface mappings. */ @@ -96,6 +96,18 @@ mps_assert_t mps_assert_default(void) return AssertDefault(); } +mps_res_t mps_space_create_wmem(mps_space_t *mps_space_o, + mps_addr_t base, size_t size) +{ + Space *spaceReturn = (Space *)mps_space_o; + /* This is the first real call that the client will have to make, */ + /* so check static consistency here. */ + AVER(mpsi_check()); + AVER(spaceReturn != NULL); + AVER(base != NULL); + return SpaceCreate(spaceReturn, (Addr)base, (Size)size); +} + mps_res_t mps_space_create(mps_space_t *mps_space_o) { Space *spaceReturn = (Space *)mps_space_o; @@ -103,7 +115,7 @@ mps_res_t mps_space_create(mps_space_t *mps_space_o) /* so check static consistency here. */ AVER(mpsi_check()); AVER(spaceReturn != NULL); - return SpaceCreate(spaceReturn); + return SpaceCreate(spaceReturn, (Addr)0, (Size)0); } void mps_space_destroy(mps_space_t mps_space) diff --git a/mps/src/mpstd.h b/mps/src/mpstd.h index b0afe954fab..71bb128787c 100644 --- a/mps/src/mpstd.h +++ b/mps/src/mpstd.h @@ -1,12 +1,15 @@ /* impl.h.mpstd: HARLEQUIN MEMORY POOL SYSTEM TARGET DETECTION * - * $HopeName: MMsrc!mpstd.h(trunk.8) $ + * $HopeName: MMsrc!mpstd.h(trunk.9) $ * Copyright (C) 1996 Harlequin Group, all rights reserved * * Detect the target platform using predefined preprocessor symbols * defined by the build environment. The symbols are derived from the * documentation, or, in the case of GCC, from the compiler itself. * References to the documentation appear above each detection line. + * + * .hack.align: All alignments have been hacked to be at least 8. + * This is a short term fix to meet req.epcore.attr.align */ #ifndef mpstd_h @@ -22,7 +25,7 @@ #define MPS_T_WORD unsigned long #define MPS_WORD_WIDTH 32 #define MPS_WORD_SHIFT 5 -#define MPS_PF_ALIGN 4 +#define MPS_PF_ALIGN 8 /* .hack.align */ /* winnt.h (D:\packages\msvc20\include\winnt.h on aaron) */ /* really ought to check this more thoroughly */ @@ -35,7 +38,7 @@ #define MPS_T_WORD unsigned long #define MPS_WORD_WIDTH 32 #define MPS_WORD_SHIFT 5 -#define MPS_PF_ALIGN 4 +#define MPS_PF_ALIGN 8 /* .hack.align */ /* winnt.h (D:\packages\msvc20\include\winnt.h on aaron) */ /* really ought to check this more thoroughly */ @@ -48,7 +51,7 @@ #define MPS_T_WORD unsigned long #define MPS_WORD_WIDTH 32 #define MPS_WORD_SHIFT 5 -#define MPS_PF_ALIGN 4 +#define MPS_PF_ALIGN 8 /* .hack.align */ /* Visual C++ 2.0, Books Online, C/C++ Book, Preprocessor Reference, */ /* Chapter 1: The Preprocessor, Macros, Predefined Macros. */ @@ -61,7 +64,7 @@ #define MPS_T_WORD unsigned long #define MPS_WORD_WIDTH 32 #define MPS_WORD_SHIFT 5 -#define MPS_PF_ALIGN 4 +#define MPS_PF_ALIGN 8 /* .hack.align */ /* MW C/C++/ASM Lang Ref, pp175-176. Metrowerks does not document */ /* a way to determine the OS -- we assume MacOS 7. */ @@ -74,7 +77,7 @@ #define MPS_T_WORD unsigned long #define MPS_WORD_WIDTH 32 #define MPS_WORD_SHIFT 5 -#define MPS_PF_ALIGN 1 +#define MPS_PF_ALIGN 8 /* .hack.align */ /* 1. MPW 3.0 C Ref, p. 43. */ /* 2. MPW SC/SCpp C/C++ Compiler for 68k Macintosh, p 3-60. */ @@ -89,7 +92,7 @@ #define MPS_T_WORD unsigned long #define MPS_WORD_WIDTH 32 #define MPS_WORD_SHIFT 5 -#define MPS_PF_ALIGN 1 +#define MPS_PF_ALIGN 8 /* .hack.align */ /* 1. C++/C Compiler for Macintosh with PowerPC, p 3-36. */ /* 2. MPW MrC/MrCpp C/C++ Compiler for Power Macintosh, p 3-57. */ @@ -104,7 +107,7 @@ #define MPS_T_WORD unsigned long #define MPS_WORD_WIDTH 32 #define MPS_WORD_SHIFT 5 -#define MPS_PF_ALIGN 4 +#define MPS_PF_ALIGN 8 /* .hack.align */ /* GCC 2.5.8, gcc -E -dM, (__SVR4 indicates Solaris) */ @@ -155,7 +158,7 @@ #define MPS_T_WORD unsigned long #define MPS_WORD_WIDTH 32 #define MPS_WORD_SHIFT 5 -#define MPS_PF_ALIGN 4 +#define MPS_PF_ALIGN 8 /* .hack.align */ #else #error "Unable to detect target platform" diff --git a/mps/src/poolmv.c b/mps/src/poolmv.c index 416ed6e0e78..a47d1f914f5 100644 --- a/mps/src/poolmv.c +++ b/mps/src/poolmv.c @@ -1,6 +1,6 @@ /* impl.c.poolmv: MANUAL VARIABLE POOL * - * $HopeName: MMsrc!poolmv.c(MMdevel_restr2.6) $ + * $HopeName: MMsrc!poolmv.c(trunk.13) $ * Copyright (C) 1994, 1995 Harlequin Group, all rights reserved * * **** RESTRICTION: This pool may not allocate from the arena control @@ -37,7 +37,7 @@ #include "poolmfs.h" #include "mpscmv.h" -SRCID(poolmv, "$HopeName: MMsrc!poolmv.c(MMdevel_restr2.6) $"); +SRCID(poolmv, "$HopeName: MMsrc!poolmv.c(trunk.13) $"); #define BLOCKPOOL(mv) (MFSPool(&(mv)->blockPoolStruct)) @@ -95,7 +95,7 @@ static Bool MVBlockCheck(MVBlock block) typedef struct MVSpanStruct *MVSpan; typedef struct MVSpanStruct { - MVSpan next; /* link to next span */ + RingStruct spans; /* all the spans */ MV mv; /* owning MV pool */ Seg seg; /* segment underlying the span */ MVBlockStruct base; /* sentinel at base of span */ @@ -119,6 +119,7 @@ static Bool MVSpanCheck(MVSpan span) { CHECKL(span != NULL); CHECKU(MV, span->mv); + CHECKL(RingCheck(&span->spans)); CHECKL(MVBlockCheck(&span->base)); CHECKL(MVBlockCheck(&span->limit)); /* The block chain starts with the base sentinel. */ @@ -181,7 +182,7 @@ static Res MVInit(Pool pool, va_list arg) mv->extendBy = extendBy; mv->avgSize = avgSize; mv->maxSize = maxSize; - mv->spans = NULL; + RingInit(&mv->spans); mv->space = 0; mv->lost = 0; mv->sig = MVSig; @@ -195,6 +196,7 @@ static Res MVInit(Pool pool, va_list arg) static void MVFinish(Pool pool) { MV mv; + Ring spans, node = NULL; /* gcc whinge stop */ MVSpan span; AVERT(Pool, pool); @@ -202,11 +204,11 @@ static void MVFinish(Pool pool) AVERT(MV, mv); /* Destroy all the segments attached to the pool. */ - span = mv->spans; - while(span != NULL) { + spans = &mv->spans; + RING_FOR(node, spans) { + span = RING_ELT(MVSpan, spans, node); AVERT(MVSpan, span); PoolSegFree(pool, span->seg); - span = span->next; } mv->sig = SigInvalid; @@ -366,6 +368,7 @@ static Res MVAlloc(Addr *pReturn, Pool pool, Size size) Space space; MV mv; Size segSize; + Ring spans, node = NULL; /* gcc whinge stop */ AVERT(Pool, pool); mv = PoolPoolMV(pool); @@ -377,9 +380,9 @@ static Res MVAlloc(Addr *pReturn, Pool pool, Size size) size = SizeAlignUp(size, pool->alignment); if(size <= mv->space) { - span = mv->spans; - - while(span != NULL) { + spans = &mv->spans; + RING_FOR(node, spans) { + span = RING_ELT(MVSpan, spans, node); if(size <= span->space) { Addr new; @@ -390,8 +393,6 @@ static Res MVAlloc(Addr *pReturn, Pool pool, Size size) return ResOK; } } - - span = span->next; } } @@ -419,7 +420,7 @@ static Res MVAlloc(Addr *pReturn, Pool pool, Size size) span->mv = mv; span->seg->p = (void *)span; - span->next = mv->spans; + RingInit(&span->spans); span->base.base = span->base.limit = SegBase(space, span->seg); span->limit.base = span->limit.limit = SegLimit(space, span->seg); span->space = AddrOffset(span->base.limit, span->limit.base); @@ -434,7 +435,7 @@ static Res MVAlloc(Addr *pReturn, Pool pool, Size size) AVERT(MVSpan, span); mv->space += span->space; - mv->spans = span; + RingAppend(&mv->spans, &span->spans); *pReturn = span->base.base; return ResOK; @@ -478,6 +479,18 @@ static void MVFree(Pool pool, Addr old, Size size) mv->lost += size; else mv->space += size; + + /* free space should be less than total space */ + AVER(AddrAdd(span->base.base, span->space) <= span->limit.limit); + if(AddrAdd(span->base.base, span->space) == span->limit.limit) { + AVER(span->blockCount == 2); + /* both blocks are the trivial sentinel blocks */ + AVER(span->base.limit == span->base.base); + AVER(span->limit.limit == span->limit.base); + PoolSegFree(pool, span->seg); + RingRemove(&span->spans); + PoolFree(SPANPOOL(mv), (Addr)span, sizeof(MVSpanStruct)); + } return; /* should free spans. See note 4. */ } @@ -489,6 +502,7 @@ static Res MVDescribe(Pool pool, Lib_FILE *stream) MVSpan span; Align step; Size length; + Ring spans, node = NULL; /* gcc whinge stop */ AVERT(Pool, pool); mv = PoolPoolMV(pool); @@ -511,16 +525,15 @@ static Res MVDescribe(Pool pool, Lib_FILE *stream) Lib_fprintf(stream, " Spans\n" " desc seg space blockCount\n"); - span = mv->spans; - while(span != NULL) { + spans = &mv->spans; + RING_FOR(node, spans) { + span = RING_ELT(MVSpan, spans, node); AVERT(MVSpan, span); Lib_fprintf(stream, " %8lX %8lX %8lX %d\n", (unsigned long)span, (unsigned long)span->seg, span->space, span->blockCount); - - span = span->next; } Lib_fprintf(stream, " Span allocation maps\n"); @@ -528,10 +541,11 @@ static Res MVDescribe(Pool pool, Lib_FILE *stream) step = pool->alignment; length = 0x40 * step; - span = mv->spans; - while(span != NULL) { + spans = &mv->spans; + RING_FOR(node, spans) { Addr i, j; MVBlock block; + span = RING_ELT(MVSpan, spans, node); Lib_fprintf(stream, " MVSpan %8lX\n", (unsigned long)span); block = span->blocks; @@ -540,7 +554,8 @@ static Res MVDescribe(Pool pool, Lib_FILE *stream) for(i = span->base.base; i < span->limit.limit; i = AddrAdd(i, length)) { Lib_fprintf(stream, " %8lX ", (unsigned long)i); - for(j = i; j < AddrAdd(i, length) && j < span->limit.limit; j = AddrAdd(j, step)) { + for(j = i; j < AddrAdd(i, length) && j < span->limit.limit; + j = AddrAdd(j, step)) { if(j == block->base) { if(AddrAdd(j, step) == block->limit) Lib_fputc('@', stream); @@ -560,8 +575,6 @@ static Res MVDescribe(Pool pool, Lib_FILE *stream) } Lib_fputc('\n', stream); } - - span = span->next; } return ResOK; @@ -607,6 +620,61 @@ mps_class_t mps_class_mv(void) return (mps_class_t)(PoolClassMV()); } +/* Free bytes */ + +size_t mps_mv_free_size(mps_pool_t mps_pool) +{ + Pool pool; + MV mv; + MVSpan span; + Size f = 0; + Ring spans, node = NULL; /* gcc whinge stop */ + + pool = (Pool)mps_pool; + + AVERT(Pool, pool); + mv = PoolPoolMV(pool); + AVERT(MV, mv); + + spans = &mv->spans; + RING_FOR(node, spans) { + span = RING_ELT(MVSpan, spans, node); + AVERT(MVSpan, span); + f += span->space; + } + + return (size_t)f; +} + +size_t mps_mv_size(mps_pool_t mps_pool) +{ + Pool pool; + MV mv; + MVSpan span; + Space space; + Size f = 0; + Ring spans, node = NULL; /* gcc whinge stop */ + + pool = (Pool)mps_pool; + + AVERT(Pool, pool); + mv = PoolPoolMV(pool); + AVERT(MV, mv); + space = PoolSpace(pool); + + spans = &mv->spans; + RING_FOR(node, spans) { + span = RING_ELT(MVSpan, spans, node); + AVERT(MVSpan, span); + f += SegSize(space, span->seg); + } + + return (size_t)f; +} + + + + /* MVCheck -- check the consistency of an MV structure */ diff --git a/mps/src/sos8gc.gmk b/mps/src/sos8gc.gmk index cb04976d0f1..85ea0a6e17c 100644 --- a/mps/src/sos8gc.gmk +++ b/mps/src/sos8gc.gmk @@ -1,7 +1,7 @@ # # BUILD FOR SOLARIS/SPARC/GCC PLATFORM # -# $HopeName: MMsrc!sospgc.gmk(MMdevel_protoposm_1.2) $ +# $HopeName: MMsrc!sospgc.gmk(trunk.2) $ # # Copyright (C) 1995 Harlequin Group, all rights reserved # @@ -19,6 +19,10 @@ MPMPS = sssosp.S AMC = amc.c LO = lo.c DW = fmtdy.c dw.c +SW = assert.c ring.c liban.c mpm.c \ + arenavm.c vmrm.c space.c pool.c poolmfs.c \ + poolmv.c root.c format.c buffer.c lockan.c ref.c \ + trace.c than.c protso.c shield.c mpsi.c ld.c ssan.c LIBS = -lm TESTLIB = testlib.c diff --git a/mps/src/sus8gc.gmk b/mps/src/sus8gc.gmk index 03d41fce555..4e81e2af5f1 100644 --- a/mps/src/sus8gc.gmk +++ b/mps/src/sus8gc.gmk @@ -1,7 +1,7 @@ # # BUILD FOR SUNOS/SPARC/GCC PLATFORM # -# $HopeName: MMsrc!suspgc.gmk(MMdevel_restr2.2) $ +# $HopeName: MMsrc!suspgc.gmk(trunk.18) $ # # Copyright (C) 1995 Harlequin Group, all rights reserved # @@ -18,6 +18,10 @@ MPMS = sssusp.s AMC = amc.c LO = lo.c DW = fmtdy.c dw.c +SW = assert.c ring.c liban.c mpm.c \ + arenavm.c vmrm.c space.c pool.c poolmfs.c \ + poolmv.c root.c format.c buffer.c lockan.c ref.c \ + trace.c than.c protsu.c shield.c mpsi.c ld.c ssan.c TESTLIB = testlib.c diff --git a/mps/src/vman.c b/mps/src/vman.c index 3ba07bb977d..ccfbf22ee37 100644 --- a/mps/src/vman.c +++ b/mps/src/vman.c @@ -1,6 +1,6 @@ /* impl.c.vman: ANSI VM: MALLOC-BASED PSUEDO MEMORY MAPPING * - * $HopeName: MMsrc!vman.c(MMdevel_restr.4) $ + * $HopeName: MMsrc!vman.c(trunk.9) $ * Copyright (C) 1996 Harlequin Group, all rights reserved. */ @@ -8,7 +8,7 @@ #include /* for malloc and free */ #include /* for memset */ -SRCID(vman, "$HopeName: MMsrc!vman.c(MMdevel_restr.4) $"); +SRCID(vman, "$HopeName: MMsrc!vman.c(trunk.9) $"); #define SpaceVM(_space) (&(_space)->arenaStruct.vmStruct) @@ -31,18 +31,15 @@ Align VMAlign() return VMAN_ALIGN; } -Res VMCreate(Space *spaceReturn, Size size) + +Res VMCreate(Space *spaceReturn, Size size, Addr base) { Space space; VM vm; - AVER(size > 0); - AVER(SizeIsAligned(size, VMAN_ALIGN)); - - space = (Space)malloc(sizeof(SpaceStruct)); - if(space == NULL) - return ResMEMORY; - vm = SpaceVM(space); + AVER(spaceReturn != NULL); + AVER(size != 0); + AVER(base == NULL); /* Note that because we add VMAN_ALIGN rather than */ /* VMAN_ALIGN-1 we are not in danger of overflowing */ diff --git a/mps/src/vmsu.c b/mps/src/vmsu.c index 1af7215383f..fa1c7231e62 100644 --- a/mps/src/vmsu.c +++ b/mps/src/vmsu.c @@ -1,6 +1,6 @@ /* impl.c.vmsu: VIRTUAL MEMORY MAPPING FOR SUNOS 4 * - * $HopeName: MMsrc!vmsu.c(MMdevel_restr.4) $ + * $HopeName: MMsrc!vmsu.c(trunk.10) $ * Copyright (C) 1995 Harlequin Group, all rights reserved * * Design: design.mps.vm @@ -44,7 +44,7 @@ #include #include -SRCID(vmsu, "$HopeName: MMsrc!vmsu.c(MMdevel_restr.4) $"); +SRCID(vmsu, "$HopeName: MMsrc!vmsu.c(trunk.10) $"); /* Fix up unprototyped system calls. */ @@ -85,7 +85,7 @@ Bool VMCheck(VM vm) } -Res VMCreate(Space *spaceReturn, Size size) +Res VMCreate(Space *spaceReturn, Size size, Addr base) { caddr_t addr; Align align; @@ -100,6 +100,7 @@ Res VMCreate(Space *spaceReturn, Size size) AVER(SizeIsAligned(size, align)); AVER(size != 0); AVER(size <= INT_MAX); /* see .assume.size */ + AVER(base == NULL); zero_fd = open("/dev/zero", O_RDONLY); if(zero_fd == -1) diff --git a/mps/src/vmw3.c b/mps/src/vmw3.c index 29e586e839c..86e5cccd7fa 100644 --- a/mps/src/vmw3.c +++ b/mps/src/vmw3.c @@ -2,7 +2,7 @@ * * VIRTUAL MEMORY MAPPING FOR WIN32 * - * $HopeName: MMsrc!vmnt.c(trunk.11) $ + * $HopeName: MMsrc!vmnt.c(trunk.12) $ * * Copyright (C) 1995 Harlequin Group, all rights reserved * @@ -55,7 +55,7 @@ #include -SRCID(vmnt, "$HopeName: MMsrc!vmnt.c(trunk.11) $"); +SRCID(vmnt, "$HopeName: MMsrc!vmnt.c(trunk.12) $"); #define SpaceVM(space) (&(space)->arenaStruct.vmStruct) @@ -89,9 +89,9 @@ Bool VMCheck(VM vm) } -Res VMCreate(Space *spaceReturn, Size size) +Res VMCreate(Space *spaceReturn, Size size, Addr base) { - LPVOID base; + LPVOID vbase; Align align; VM vm; Space space; @@ -106,26 +106,27 @@ Res VMCreate(Space *spaceReturn, Size size) AVER(SizeIsP2(align)); /* see .assume.sysalign */ AVER(SizeIsAligned(size, align)); + AVER(base == NULL); /* Allocate some store for the space descriptor. * This is likely to be wasteful see issue.vmnt.waste */ - base = VirtualAlloc(NULL, SizeAlignUp(sizeof(SpaceStruct), align), + vbase = VirtualAlloc(NULL, SizeAlignUp(sizeof(SpaceStruct), align), MEM_COMMIT, PAGE_READWRITE); - if(base == NULL) + if(vbase == NULL) return ResMEMORY; - space = (Space)base; + space = (Space)vbase; vm = SpaceVM(space); /* Allocate the address space. */ - base = VirtualAlloc(NULL, size, MEM_RESERVE, PAGE_NOACCESS); - if(base == NULL) + vbase = VirtualAlloc(NULL, size, MEM_RESERVE, PAGE_NOACCESS); + if(vbase == NULL) return ResRESOURCE; - AVER(AddrIsAligned(base, align)); + AVER(AddrIsAligned(vbase, align)); vm->align = align; - vm->base = (Addr)base; - vm->limit = AddrAdd(base, size); + vm->base = (Addr)vbase; + vm->limit = AddrAdd(vbase, size); vm->reserved = size; vm->mapped = 0; AVER(vm->base < vm->limit); /* .assume.not-last */ diff --git a/mps/src/w3almv.nmk b/mps/src/w3almv.nmk index ad60f209dd6..dce2674b82d 100644 --- a/mps/src/w3almv.nmk +++ b/mps/src/w3almv.nmk @@ -1,6 +1,6 @@ # ==== NTI3MV NMAKE FILE ==== # -# $HopeName: MMsrc!ntalmv.nmk(MMdevel_drj_swint.2) $ +# $HopeName: MMsrc!ntalmv.nmk(trunk.1) $ # # Copyright (C) 1995 Harlequin Group, all rights reserved # @@ -12,8 +12,13 @@ MPM = \ \ \ +SW = \ + \ + \ + \ + AMC = -LO = +LO = DW = TESTLIB = @@ -21,7 +26,7 @@ TESTLIB = # ==== ALMOST GENERIC PRODUCT BUILD FOR NMAKE ==== # -# $HopeName: MMsrc!ntalmv.nmk(MMdevel_drj_swint.2) $ +# $HopeName: MMsrc!ntalmv.nmk(trunk.1) $ # # Copyright (C) 1995 Harlequin Group, all rights reserved # @@ -29,9 +34,10 @@ TESTLIB = # # This makefile fragment is conceptually included in more specific # makefiles for platforms which use the "mv" builder. Alas -# due to shortcomings in nmake and the fact that only ntalmv uses mv -# at the moment it is physically part of mti3mv.nmk. [It is not possible -# use a macro in a substituion, hence this file uses ntalmv instead of $(PFM)] +# due to shortcomings in nmake at the moment it is physically +# part of ntalmv.nmk. [It is not possible use a macro in a +# substituion, hence this file uses ntalmv instead of $(PFM)] +# @@ This needs examining again # # %%PART: Add a new parameter for the files included in the part # Parameters: @@ -41,9 +47,10 @@ TESTLIB = # MPM list of sources which make up the "mpm" part for this # platform. Each source is stripped of its .c extension # and surrounded in angle brackets (<>) +# SW as above for the "sw" part # AMC as above for the "amc" part -# LO as above for the "lo" part -# DW as above for the "amc" part +# LO as above for the "lo" part +# DW as above for the "amc" part # TESTLIB as above for the "testlib" part # NOISY if defined, causes command to be emitted # @@ -82,6 +89,9 @@ TESTLIB = !IFNDEF DW !ERROR mv.nmk: DW not defined !ENDIF +!IFNDEF SW +!ERROR mv.nmk: SW not defined +!ENDIF !IFNDEF TESTLIB !ERROR mv.nmk: TESTLIB not defined !ENDIF @@ -104,7 +114,18 @@ ECHO = echo # All compilations # [Sadly /W4 causes to emit thousands of warnings] # /MT means compile for multi-threaded environment. -CFLAGSCOMMON = /nologo /W3 /WX $(PFMDEFS) /MT +# /ML means compile for single-threaded environment. +# some C flags depend on the target we are building. + +!ifdef TARGET +!if "$(TARGET)" == "mmsw.lib" +CFLAGSTARGET = /ML /DTARGET_VM_RM +!else +CFLAGSTARGET = /MT +!endif +!endif + +CFLAGSCOMMON = /nologo /W3 /WX $(PFMDEFS) $(CFLAGSTARGET) # "debug" variety flags # [Used to use /Zi instead of /Z7. /Z7 generates debugging output in the @@ -117,7 +138,7 @@ CFDP = /DTARGET_VAR_DP /Z7 CFDS = /DTARGET_VAR_DS /Z7 # "release" variety flags -# Microsoft documentation is not very clear on the point of using bothing +# Microsoft documentation is not very clear on the point of using both # optimzation and debug information CFRO = /DTARGET_VAR_RO /Z7 /O2 @@ -165,6 +186,8 @@ LINKFLAGS=$(LINKFLAGSCOMMON) $(LFDF) LIBFLAGS=$(LIBFLAGSCOMMON) $(LIBFLAGSDF) MPMOBJ0 = $(MPM:<=ntalmv\df\) MPMOBJ = $(MPMOBJ0:>=.obj) +SWOBJ0 = $(SW:<=ntalmv\df\) +SWOBJ = $(SWOBJ0:>=.obj) AMCOBJ0 = $(AMC:<=ntalmv\df\) AMCOBJ = $(AMCOBJ0:>=.obj) LOOBJ0 = $(LO:<=ntalmv\df\) @@ -180,6 +203,8 @@ LINKFLAGS=$(LINKFLAGSCOMMON) $(LFDP) LIBFLAGS=$(LIBFLAGSCOMMON) $(LIBFLAGSDP) MPMOBJ0 = $(MPM:<=ntalmv\dp\) MPMOBJ = $(MPMOBJ0:>=.obj) +SWOBJ0 = $(SW:<=ntalmv\dp\) +SWOBJ = $(SWOBJ0:>=.obj) AMCOBJ0 = $(AMC:<=ntalmv\dp\) AMCOBJ = $(AMCOBJ0:>=.obj) LOOBJ0 = $(LO:<=ntalmv\dp\) @@ -195,6 +220,8 @@ LINKFLAGS=$(LINKFLAGSCOMMON) $(LFDS) LIBFLAGS=$(LIBFLAGSCOMMON) $(LIBFLAGSDS) MPMOBJ0 = $(MPM:<=ntalmv\ds\) MPMOBJ = $(MPMOBJ0:>=.obj) +SWOBJ0 = $(SW:<=ntalmv\ds\) +SWOBJ = $(SWOBJ0:>=.obj) AMCOBJ0 = $(AMC:<=ntalmv\ds\) AMCOBJ = $(AMCOBJ0:>=.obj) LOOBJ0 = $(LO:<=ntalmv\ds\) @@ -210,6 +237,8 @@ LINKFLAGS=$(LINKFLAGSCOMMON) $(LFRO) LIBFLAGS=$(LIBFLAGSCOMMON) $(LIBFLAGSRO) MPMOBJ0 = $(MPM:<=ntalmv\ro\) MPMOBJ = $(MPMOBJ0:>=.obj) +SWOBJ0 = $(SW:<=ntalmv\ro\) +SWOBJ = $(SWOBJ0:>=.obj) AMCOBJ0 = $(AMC:<=ntalmv\ro\) AMCOBJ = $(AMCOBJ0:>=.obj) LOOBJ0 = $(LO:<=ntalmv\ro\) @@ -225,6 +254,8 @@ LINKFLAGS=$(LINKFLAGSCOMMON) $(LFCV) LIBFLAGS=$(LIBFLAGSCOMMON) $(LIBFLAGSCV) MPMOBJ0 = $(MPM:<=ntalmv\cv\) MPMOBJ = $(MPMOBJ0:>=.obj) +SWOBJ0 = $(SW:<=ntalmv\cv\) +SWOBJ = $(SWOBJ0:>=.obj) AMCOBJ0 = $(AMC:<=ntalmv\cv\) AMCOBJ = $(AMCOBJ0:>=.obj) LOOBJ0 = $(LO:<=ntalmv\cv\) @@ -337,7 +368,7 @@ $(PFM)\$(VARIETY)\amc.lib: $(MPMOBJ) $(AMCOBJ) $(ECHO) $@ $(LIBMAN) $(LIBFLAGS) /OUT:$@ $** -$(PFM)\$(VARIETY)\mmsw.lib: $(MPMOBJ) $(SWOBJ) +$(PFM)\$(VARIETY)\mmsw.lib: $(SWOBJ) $(ECHO) $@ $(LIBMAN) $(LIBFLAGS) /OUT:$@ $** diff --git a/mps/src/w3i3mv.nmk b/mps/src/w3i3mv.nmk index 23ccb9f8751..cc48dc8e5c0 100644 --- a/mps/src/w3i3mv.nmk +++ b/mps/src/w3i3mv.nmk @@ -1,6 +1,6 @@ # ==== NTI3MV NMAKE FILE ==== # -# $HopeName: MMsrc!nti3mv.nmk(trunk.22) $ +# $HopeName: MMsrc!nti3mv.nmk(trunk.23) $ # # Copyright (C) 1995 Harlequin Group, all rights reserved # @@ -12,6 +12,11 @@ MPM = \ \ \ +SW = \ + \ + \ + \ + AMC = LO = DW = @@ -21,7 +26,7 @@ TESTLIB = # ==== ALMOST GENERIC PRODUCT BUILD FOR NMAKE ==== # -# $HopeName: MMsrc!nti3mv.nmk(trunk.22) $ +# $HopeName: MMsrc!nti3mv.nmk(trunk.23) $ # # Copyright (C) 1995 Harlequin Group, all rights reserved # @@ -82,6 +87,9 @@ TESTLIB = !IFNDEF DW !ERROR mv.nmk: DW not defined !ENDIF +!IFNDEF SW +!ERROR mv.nmk: SW not defined +!ENDIF !IFNDEF TESTLIB !ERROR mv.nmk: TESTLIB not defined !ENDIF @@ -104,7 +112,19 @@ ECHO = echo # All compilations # [Sadly /W4 causes to emit thousands of warnings] # /MT means compile for multi-threaded environment. -CFLAGSCOMMON = /nologo /W3 /WX $(PFMDEFS) /MT +# /ML means compile for single-threaded environment. +# some C flags depend on the target we are building. + +!ifdef TARGET +!if "$(TARGET)" == "mmsw.lib" +CFLAGSTARGET = /ML /DTARGET_VM_RM +!else +CFLAGSTARGET = /MT +!endif +!endif + +CFLAGSCOMMON = /nologo /W3 /WX $(PFMDEFS) $(CFLAGSTARGET) + # "debug" variety flags # [Used to use /Zi instead of /Z7. /Z7 generates debugging output in the @@ -165,6 +185,8 @@ LINKFLAGS=$(LINKFLAGSCOMMON) $(LFDF) LIBFLAGS=$(LIBFLAGSCOMMON) $(LIBFLAGSDF) MPMOBJ0 = $(MPM:<=nti3mv\df\) MPMOBJ = $(MPMOBJ0:>=.obj) +SWOBJ0 = $(SW:<=nti3mv\df\) +SWOBJ = $(SWOBJ0:>=.obj) AMCOBJ0 = $(AMC:<=nti3mv\df\) AMCOBJ = $(AMCOBJ0:>=.obj) LOOBJ0 = $(LO:<=nti3mv\df\) @@ -180,6 +202,8 @@ LINKFLAGS=$(LINKFLAGSCOMMON) $(LFDP) LIBFLAGS=$(LIBFLAGSCOMMON) $(LIBFLAGSDP) MPMOBJ0 = $(MPM:<=nti3mv\dp\) MPMOBJ = $(MPMOBJ0:>=.obj) +SWOBJ0 = $(SW:<=nti3mv\dp\) +SWOBJ = $(SWOBJ0:>=.obj) AMCOBJ0 = $(AMC:<=nti3mv\dp\) AMCOBJ = $(AMCOBJ0:>=.obj) LOOBJ0 = $(LO:<=nti3mv\dp\) @@ -195,6 +219,8 @@ LINKFLAGS=$(LINKFLAGSCOMMON) $(LFDS) LIBFLAGS=$(LIBFLAGSCOMMON) $(LIBFLAGSDS) MPMOBJ0 = $(MPM:<=nti3mv\ds\) MPMOBJ = $(MPMOBJ0:>=.obj) +SWOBJ0 = $(SW:<=nti3mv\ds\) +SWOBJ = $(SWOBJ0:>=.obj) AMCOBJ0 = $(AMC:<=nti3mv\ds\) AMCOBJ = $(AMCOBJ0:>=.obj) LOOBJ0 = $(LO:<=nti3mv\ds\) @@ -210,6 +236,8 @@ LINKFLAGS=$(LINKFLAGSCOMMON) $(LFRO) LIBFLAGS=$(LIBFLAGSCOMMON) $(LIBFLAGSRO) MPMOBJ0 = $(MPM:<=nti3mv\ro\) MPMOBJ = $(MPMOBJ0:>=.obj) +SWOBJ0 = $(SW:<=nti3mv\ro\) +SWOBJ = $(SWOBJ0:>=.obj) AMCOBJ0 = $(AMC:<=nti3mv\ro\) AMCOBJ = $(AMCOBJ0:>=.obj) LOOBJ0 = $(LO:<=nti3mv\ro\) @@ -250,7 +278,7 @@ all: mpmss.exe amcss.exe dwstress.exe lockutnt.exe lockcov.exe \ dwstress.exe amcss.exe lockutnt.exe lockcov.exe \ mpmss.exe protcv.exe mpsicv.exe poolncv.exe locv.exe qs.exe \ - mpm.lib mmdw.lib weakcv.exe: + mpm.lib mmdw.lib mmsw.lib weakcv.exe: $(MAKE) /nologo /f $(PFM).nmk TARGET=$@ target mpsicv.cov: @@ -337,6 +365,10 @@ $(PFM)\$(VARIETY)\amc.lib: $(MPMOBJ) $(AMCOBJ) $(ECHO) $@ $(LIBMAN) $(LIBFLAGS) /OUT:$@ $** +$(PFM)\$(VARIETY)\mmsw.lib: $(SWOBJ) + $(ECHO) $@ + $(LIBMAN) $(LIBFLAGS) /OUT:$@ $** + $(PFM)\$(VARIETY)\mmdw.lib: $(MPMOBJ) $(AMCOBJ) $(DWOBJ) $(ECHO) $@ $(LIBMAN) $(LIBFLAGS) /OUT:$@ $**