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

Merging changes from mmdevel_drj_swint

Copied from Perforce
 Change: 15881
 ServerID: perforce.ravenbrook.com
This commit is contained in:
David Jones 1996-07-05 09:54:18 +01:00
parent ade4af3296
commit cd440af2e5
16 changed files with 283 additions and 96 deletions

View file

@ -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;

View file

@ -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

View file

@ -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);

View file

@ -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 */

View file

@ -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);

View file

@ -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 */

View file

@ -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)

View file

@ -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"

View file

@ -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 */

View file

@ -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

View file

@ -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

View file

@ -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 <stdlib.h> /* for malloc and free */
#include <string.h> /* 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 */

View file

@ -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 <errno.h>
#include <sys/errno.h>
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)

View file

@ -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 <windows.h>
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 */

View file

@ -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 = <assert> <ring> <liban> <mpm> \
<poolmv> <root> <format> <buffer> <locknt> \
<ref> <trace> <protnt> <shield> \
<than> <ssan> <mpsi> <mpsint> <ld>
SW = <assert> <ring> <liban> <mpm> \
<arenavm> <vmrm> <space> <pool> <poolmfs> \
<poolmv> <root> <format> <buffer> <locknt> \
<ref> <trace> <protnt> <shield> \
<than> <ssan> <mpsi> <mpsint> <ld>
AMC = <amc>
LO = <lo>
LO = <lo>
DW = <dw> <fmtdy>
TESTLIB = <testlib>
@ -21,7 +26,7 @@ TESTLIB = <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 = <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 = <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 = <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 <windows.h> 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:$@ $**

View file

@ -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 = <assert> <ring> <liban> <mpm> \
<poolmv> <root> <format> <buffer> <locknt> \
<ref> <trace> <protnt> <shield> \
<thnti3> <ssnti3> <mpsi> <mpsint> <ld>
SW = <assert> <ring> <liban> <mpm> \
<arenavm> <vmrm> <space> <pool> <poolmfs> \
<poolmv> <root> <format> <buffer> <locknt> \
<ref> <trace> <protnt> <shield> \
<thnti3> <ssnti3> <mpsi> <mpsint> <ld>
AMC = <amc>
LO = <lo>
DW = <dw> <fmtdy>
@ -21,7 +26,7 @@ TESTLIB = <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 = <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 <windows.h> 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:$@ $**